【问题标题】:smtpclient " failure sending mail"smtpclient "发送邮件失败"
【发布时间】:2021-02-05 15:30:15
【问题描述】:

这是我的代码

for(int i = 0; i < number ; i++)
{
    MailAddress to = new MailAddress(iMail.to);
    MailAddress from = new MailAddress(iMail.from, iMail.displayName);
    string body = iMail.body;
    string subject = iMail.sub;
    oMail = new MailMessage(from, to);
    oMail.Subject = subject;
    oMail.Body = body;
    oMail.IsBodyHtml = true;
    oMail.Priority = MailPriority.Normal;
    oMail.Sender = from;
    s = new SmtpClient(smtpServer);
    if (s != null)
    {
        s.Send(oMail);
    }
    oMail.Dispose();
    s = null;
}

此循环发送超过 60,000 封电子邮件。但我的问题是,我在某些电子邮件中收到“发送邮件失败”,有时是 5000 次,而其余时间则更少。我已经检查了所有这些错误电子邮件是否具有有效的电子邮件地址。不知道是什么问题。我真的需要这方面的帮助。

编辑:这是我的异常跟踪

错误 - 发送邮件失败。;内 Ex - System.IO.IOException:无法 从传输中读取数据 连接:net_io_connectionclosed。 在 System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(字节[] 缓冲区,Int32 偏移量,Int32 读取, Boolean readLine) 在 System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader 调用者,布尔 oneLine)在 System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader 来电者)在 System.Net.Mail.CheckCommand.Send(SmtpConnection 连接,字符串和响应)在 System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] 命令, String from) at System.Net.Mail.SmtpTransport.SendMail(邮件地址 发件人,MailAddressCollection 收件人,字符串传递通知, SmtpFailedRecipientException& 例外)

【问题讨论】:

标签: c# .net smtpclient


【解决方案1】:

嗯,“发送电子邮件失败”应该有更多的细节。但有几件事可能会导致这种情况。

  1. “发件人”地址的限制。如果您使用不同的地址,某些地址可能会被您的 SMTP 服务阻止而无法发送。
  2. 您的 SMTP 服务上的防洪功能可能会阻止电子邮件发送出去。

无论是其中一个错误还是其他错误,您都需要查看异常和内部异常以获取更多详细信息。

【讨论】:

  • 感谢 Mitchel,我为所有人使用相同的“发件人”电子邮件地址,但大多数都已送达。这意味着选项(2)被忽略了吗?
  • 是的,很有可能。许多 SMTP 服务都有一个 X per Y 配置来限制。如果您捕获完整的异常,包括内部异常,您应该能够更清楚地了解情况。
  • 谢谢米切尔,我用异常跟踪修改了我的问题。它说“net_io_connectionclosed”,这是什么意思?
  • 嗯,通常它是一个不匹配的“发件人”地址,但这可能是由于我的#2 项目。基本上它无法获得到 SMTP 的有效连接。您是否有权访问 SMTP 日志
  • 谢谢 Mitchel,我无法访问 SMTP 日志 :(。我发现了这个 forums.asp.net/t/924682.aspx,在这个论坛的最后一篇文章中,有人说要使用 lient.ServicePoint.MaxIdleTime = 1; 这是否会使感觉?
【解决方案2】:

显然这个问题只是通过增加我的第 3 方 smtp 服务器上的队列大小来解决。 但是Nip的回答听起来也很有用

【讨论】:

    【解决方案3】:

    我在发送大量电子邮件时遇到了同样的问题。将deliveryMethod 属性设置为PickupDirectoryFromIis 为我修复了它。 也不要每次都创建一个新的 SmtpClient。

    【讨论】:

    • 谢谢 Nip,您使用的是本地 smtp 服务器吗?在我的情况下,我有 3rd 方 smtp(具有固定 ip),这项工作修复是否适用于 3rd 方服务器?
    • 好吧,设置PickupDirectoryFromIis 后,EML 文件将保存到 IIS 从中提取要发送的电子邮件的目录中。您仍然可以通过更改本地 smtp 配置来测试这一点:IIS-> 默认 SMTP 服务器 -> 属性 -> 交付 -> 高级,然后您可以将智能主机设置为您的 3d 方 IP 地址。
    【解决方案4】:

    您得到什么错误是 SmtpFailedrecipientException?如果是这样,您可以检查内部异常列表并查看 StatusCode 以获取更多信息。下面的链接有一些很好的信息

    MSDN

    编辑新信息

    这是从我所看到的情况中查找 SMTP 服务器的问题,尽管您说它只发生在某些电子邮件上。您是否使用了多个 smtp 服务器,如果是这样,也许您可​​以将问题归结为一个特定的问题,如果不是,则可能是您发送的电子邮件的速度/数量导致您的 smtp 服务器出现问题。

    【讨论】:

    • 感谢 Pharabus,我已经用异常跟踪修改了我的问题。它说“net_io_connectionclosed”,这是什么意思?
    • 感谢 Pharabus,我只使用一个 smtp 服务器。我发现了这个forums.asp.net/t/924682.aspx,在这个论坛的最后一篇文章中有人说要使用 lient.ServicePoint.MaxIdleTime = 1;这有意义吗?
    • 我肯定会看一下,您可以做的另一件事是在循环中暂停一秒钟左右,具体取决于您希望如何使用循环(显然是 1 秒暂停 vs 60,000循环给这个过程增加了相当大的延迟)
    • 我试过了,到目前为止没有错误,但这会带来 cpu 使用成本。即使没有要发送的电子邮件,它也会保留 20% 的 CPU。并且电子邮件数量很快就会超过 100,000 封,所以我无法添加暂停。
    • 我尝试了 client.ServicePoint.MaxIdleTime = 1 不起作用,然后我尝试了 client.ServicePoint.ConnectionLeaseTimeout = 0 即使不起作用。我被卡住了,请帮忙。
    【解决方案5】:

    对我们来说,一切都很好,电子邮件非常小,并且发送的邮件并不多,并且突然出现了这个错误。似乎是一名技术人员安装了 ASTARO,它阻止了电子邮件的发送。我们收到了这个错误,所以是的,这个错误有点神秘,但我希望这可以帮助其他人。

    【讨论】:

      【解决方案6】:

      查看您发送电子邮件的循环以及您提供的错误只有解决方案。
      在循环外声明邮件对象,并在用于发送邮件的循环外分配fromaddressfromaddress 字段在循环中一次又一次地被分配,这是你的问题。

      【讨论】:

        【解决方案7】:

        五年后(我希望这位开发者不会还在等待修复此问题..)

        我遇到了同样的问题,由同样的错误引起:我在循环内声明了SmtpClient

        修复很简单——在循环外声明一次...

        MailAddress mail = null;
        SmtpClient client = new SmtpClient();
        client.Port = 25;
        client.EnableSsl = false;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = true;
        client.Host = smtpAddress;       //  Enter your company's email server here!
        
        for(int i = 0; i < number ; i++)
        {
            mail = new MailMessage(iMail.from, iMail.to);
            mail.Subject = iMail.sub;
            mail.Body = iMail.body;
            mail.IsBodyHtml = true;
            mail.Priority = MailPriority.Normal;
            mail.Sender = from;
            client.Send(mail);
        }
        mail.Dispose();
        client.Dispose();
        

        【讨论】:

          【解决方案8】:

          当网络服务器无法访问邮件服务器时会出现此错误。确保 Web 服务器可以访问邮件服务器,例如 ping 它。

          【讨论】:

            猜你喜欢
            • 2014-08-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-04-11
            • 2016-09-04
            • 2014-11-18
            • 2017-04-30
            • 2013-12-04
            相关资源
            最近更新 更多