C# 中的电子邮件发送服务在服务器超时后无法恢复

2024-04-07

我已经被这个问题困扰了好几个月了,这让我抓狂。 我有一个用 C# (.NET 4.5) 编写的 Windows 服务,它基本上使用 Outlook 帐户发送电子邮件(我认为这是一个 Office365 服务)。我知道“凭据顺序”问题,这不会影响我(许多电子邮件都能正确发送)。

该服务正确启动并开始发送电子邮件。有时,当数量太多时,我会收到服务器错误等待,服务会等待几分钟并自行完美地继续。

在这些情况下我得到错误 A:

 System.Net.Mail.SmtpException: The operation has timed out.
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at Cobranzas.WinService.Email.SendEmail(String subject, String body, String mailTo, String attPath)
   at Cobranzas.WinService.CobranzasEmailService.SendEmails(IEnumerable`1 toSend, RepositoryEf emailRepo)

问题:有时,我找不到模式,它每隔几天就会发生一次,它会出现超时错误,并且永远不会恢复(重新启动服务即可立即修复)。所有后续发送尝试都会失败并出现相同的错误。在这种情况下,我得到了错误 A 和错误 A 的混合:

 System.Net.Mail.SmtpException: Failure sending mail. ---> System.Net.WebException: The operation has timed out.
   at System.Net.ConnectionPool.Get(Object owningObject, Int32 result, Boolean& continueLoop, WaitHandle[]& waitHandles)
   at System.Net.ConnectionPool.GetConnection(Object owningObject, GeneralAsyncDelegate asyncCallback, Int32 creationTimeout)
   at System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint)
   at System.Net.Mail.SmtpTransport.GetConnection(ServicePoint servicePoint)
   at System.Net.Mail.SmtpClient.GetConnection()
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   --- End of inner exception stack trace ---
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at Cobranzas.WinService.Email.SendEmail(String subject, String body, String mailTo, String attPath)
   at Cobranzas.WinService.CobranzasEmailService.SendEmails(IEnumerable`1 toSend, RepositoryEf emailRepo)

我的服务的逻辑如下:我有一个计时器,每 5 分钟迭代一次要发送的大量电子邮件,并为每个执行

Thread.Sleep(2000); 
try
{
    emailService.SendEmail(asunto, nuevoCuerpo, mail.Email, mail.AlertMessage.Attach);
}
catch (Exception ex)
{
    if (ex is System.Net.Mail.SmtpException)
    {
        Thread.Sleep(20000); // Lo hacemos esperar 20 segundos
    }
}

SendEmail方法是:

var mailMessage = new MailMessage();

mailMessage.To.Add(mailTo);

mailMessage.Subject = subject;
mailMessage.Body = WebUtility.HtmlDecode(body);
mailMessage.IsBodyHtml = true;
mailMessage.From = new MailAddress(emailFromAddress, emailFromName); 
mailMessage.Headers.Add("Content-type", "text/html; charset=iso-8859-1");

// Attachment
if (attPath != null)
{
    var data = new Attachment(attPath, MediaTypeNames.Application.Octet);
    mailMessage.Attachments.Add(data);
}

var cred =
    new NetworkCredential(emailFromAddress, emailFromPassword); 

using (var mailClient =
    new SmtpClient(emailSmtpClient, emailSmtpPort) 
                     {
                         EnableSsl = true,
                         DeliveryMethod = SmtpDeliveryMethod.Network,
                         UseDefaultCredentials = false,
                         Timeout = 20000,
                         Credentials = cred
                     })
{
    mailClient.Send(mailMessage);
}

foreach (Attachment attachment in mailMessage.Attachments)
{
    attachment.Dispose();
}

使用 SmtpClient 和附件处理是新的,我们添加它们试图解决这个问题。行为没有改变。 T̶h̶e̶ ̶T̶h̶r̶e̶a̶d̶.̶S̶l̶e̶e̶p̶ ̶a̶f̶t̶e̶r̶ ̶t̶h̶e̶ ̶t̶i̶m̶e̶o̶u̶t̶ ̶i̶s̶ ̶n̶e̶w ̶ ̶a̶n̶d̶ ̶u̶n̶t̶e̶s̶t̶e̶d̶̶y̶e̶t̶。

鉴于重新启动服务可以修复它,我怀疑某些内容没有被适当关闭/清理,但我已经检查过,但找不到它可能是什么。我发现this http://connect.microsoft.com/VisualStudio/feedback/details/146711/smtp-never-sends-the-quit-command链接不久前,但看起来很旧。

任何帮助深表感谢!

[进步]

我已经测试了超时后 20 英寸的等待,但没有任何结果,它仍然以同样的方式失败。有什么想法吗?我们真的对此感到困惑。


我有完全一样的问题。我在这里找到了解决方案:

发出两个以上并发 WebRequest 时出现 System.Net.WebExceptionhttp://www.wadewegner.com/2007/08/systemnetwebexception-when-issuing-more-than-two-concurrent-webrequests/ https://web.archive.org/web/20200815175006/https://www.wadewegner.com/2007/08/systemnetwebexception-when-issuing-more-than-two-concurrent-webrequests/

基本上,我更改了单个外部服务器同时允许的最大连接数。默认情况下,根据该文档,它是 2。尽管它有一个超时(它会等待一段时间,直到一个被释放,然后继续),但有时,它还不够,它会挂起。

<configuration>
    <system.net>
        <connectionManagement>
        <add address="*" maxconnection="100" />
        </connectionManagement>
    </system.net>
</configuration>

我无法找出如何在第一次超时后恢复,但希望这能在一段时间内消除“超时”错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 中的电子邮件发送服务在服务器超时后无法恢复 的相关文章

  • C 中的变量定义是什么意思[重复]

    这个问题在这里已经有答案了 你们能告诉我 这在 C 中意味着什么吗 define Privileged Data Privileged Data static int dVariable 编译器对变量进行寻址有特殊意义吗 这只是一个宏Pri
  • 扫描文本文件时如何跳过行?

    我想扫描一个文件并在阅读之前跳过一行文本 我试过 fscanf pointer n struct test i j 但这个语法只是从第一行开始 我可以使用 scanf 使用以下指令跳过行 fscanf config file n n 格式字
  • 检查列表是否包含另一个列表。 C#

    编辑 只是说 ContainsAllItem 中的注释解释得最好 很抱歉问这个问题 我知道以前有人问过这个问题 但我只是不明白 好的 所以我想检查一个列表是否包含另一个列表中的所有项目WITHOUT重叠 以及根据类字符串 名称变量 称为项目
  • 切换图片框可见性 C#

    为什么图片框控件的可见性属性在这里不起作用 我最初将它们设置为 false 以便在屏幕加载时它们不可见 但后来我想切换这个 我已完成以下操作 但似乎不起作用 这是一个 Windows 窗体应用程序 private void Action w
  • 通过引用传递时取消引用指针

    当通过引用传递给函数时取消引用指针时会发生什么 这是一个简单的例子 int returnSame int example return example int main int inum 3 int pinum inum std cout
  • rand() 播种与 time() 问题

    我很难弄清楚如何使用 rand 并使用 Xcode 用 time 为其播种 我想生成 0 到 1 之间的随机十进制数 该代码为我提供了元素 1 和 2 看似随机的数字 但元素 0 始终在 0 077 左右 有什么想法吗 我的代码是 incl
  • F10键没被抓住

    I have a Windows Form and there overriden ProcessCmdKey However this works with all of the F Keys except for F10 I am tr
  • 导出到 CSV 时 Gridview 出现空行

    这个问题是由进一步讨论引发的这个问题 https stackoverflow com questions 6674555 export gridview data into csv file 6674589 noredirect 1 com
  • Microsoft.Graph - 如何从具有不同用户名的共享邮箱发送?

    我目前正在将使用 SMTP 的服务代码移植到 Office 365 通过 SMTP 我可以使用 发件人 字段在来自共享收件箱的邮件上设置不同的用户名 同时保留共享电子邮箱地址 这似乎无法通过 Office 365 运行 其工艺流程为 客户填
  • 如何将字符串转换为 Indian Money 格式?

    我正在尝试将字符串转换为印度货币格式 例如如果输入为 1234567 则输出应为 12 34 567 我编写了以下代码 但它没有给出预期的输出 CultureInfo hindi new CultureInfo hi IN string t
  • ETW、.NET 4.5 - 如何写入事件日志?

    我正在尝试了解 ETW 以及如何将其集成到高性能应用程序中 我们都知道旧的令人恐惧的 EventLog 及其非结构化 因此不是最佳的 API 现在有一个用于高性能跟踪的新奇 API ETW 它在 4 5 中以 EventSource 类的形
  • realloc():重新分配为 char * 上的 strcat 腾出空间时下一个大小无效 [重复]

    这个问题在这里已经有答案了 我在以下代码中收到无效内存错误 printf s n FINE 5 printf s LENGTH IS d n FINE 6 strlen buffer char realloc buffer strlen b
  • asp.net c# 防止在从服务器端代码更改索引时触发 selectedindexchanged 事件

    我在同一个 aspx 页面上有两个下拉列表控件
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 理解 C++11 中的 std::atomic::compare_exchange_weak()

    bool compare exchange weak T expected T val compare exchange weak 是 C 11 中提供的比较交换原语之一 它是weak即使对象的值等于 它也会返回 falseexpected
  • C++ 标准中短语“构造函数没有名称”的含义

    在尝试理解 C 标准中的 构造函数没有名称 这句话时 我似乎在 clang 中发现了一个错误 有人可以证实这一点吗 VS2015 and gcc rejects this code and I think they it are is co
  • 是否有任何不使用公共虚拟方法的正当理由? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否有任何不使用公共虚拟方法的正当理由 我在某处读到我们应该避免使用公共虚拟方法 但我想向专家确认这是否是有效的声明 对于良好且稳定的 API
  • c# 替代方案中 cfusion_encrypt 中填充的密钥是什么?

    我找到了从这里复制 C 中的 cfusion encrypt 函数的答案 ColdFusion cfusion encrypt 和 cfusion decrypt C 替代方案 https stackoverflow com questio
  • 使用剪贴板 SetText 换行

    如何使用 SetText 方法添加换行符 I tried Clipboard SetText eee n xxxx 但当我将剪贴板数据粘贴到记事本中时 它没有给我预期的结果 预期结果 eee xxxx 我怎样才能做到这一点 Windows
  • 如何从函数返回矩阵(二维数组)? (C)

    我创建了一个生成宾果板的函数 我想返回宾果板 正如我没想到的那样 它不起作用 这是函数 int generateBoard int board N M i j fillNum Boolean exists True initilize se

随机推荐