【问题标题】:Intermittent System.IO.IOException while using SmtpClient使用 SmtpClient 时出现间歇性 System.IO.IOException
【发布时间】:2017-07-22 11:56:20
【问题描述】:

我在使用 .NET 的 SmtpClient 时遇到问题。每隔一段时间,Send 方法就会抛出以下异常:

System.Net.Mail.SmtpException: Failure sending mail.
System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---

我们在生产中平均每小时大约 550 封电子邮件(或每分钟约 9 封电子邮件),而问题似乎从未在 QA 中出现。

每封电子邮件都是这样发送的:

using (var newMessage = new MailMessage { ReplyTo = new MailAddress(supportEmail, "Support") })
{
    newMessage.To.Add(recipients);
    newMessage.From = new MailAddress(fromEmail, "From Name");
    newMessage.Subject = message.Subject;
    newMessage.Body = body;
    using (var mailHost = new SmtpClient())
    {
        mailHost.Send(newMessage);
    }
}

请注意,我们正在释放所有资源,我们没有使用 SSL,而是从 web.config 加载 Smtp 设置,如下所示:

   <mailSettings>
      <smtp from="validEmail"  deliveryMethod="Network"  >        
        <network defaultCredentials ="false" host="dedicatedSmtpServer" port="port"/>
      </smtp>
    </mailSettings>

我整理的一些笔记:

  1. 每封电子邮件都带有自己的SmtpClient 实例。即使在批量发送场景中也是如此。我已经读到这可能会影响性能,因为套接字没有被池化。但是,当它确实起作用时,性能似乎就足够了。
  2. 我们使用的是 .NET 4,因此修复了 SmtpClient 未终止连接的错误。
  3. 据一位同事说(我自己无权访问服务器日志),SMTP 服务器不会记录失败电子邮件的连接尝试(尽管成功的电子邮件确实有日志条目)

【问题讨论】:

    标签: .net smtp smtpclient


    【解决方案1】:

    您的代码与此无关。这个特殊的错误:

    无法从传输连接读取数据:现有连接被远程主机强行关闭。

    基本上意味着远端已经终止了套接字。 “强制”只是意味着它以一种不寻常的方式完成,但它仍然是远程端。这可能是由于套接字保持打开的时间长,所以实现套接字池绝对是一个好主意。

    【讨论】:

    • 奇怪的是,SMTP 服务器没有任何尝试连接的记录。此外,这些是非常短暂的套接字——我们只使用它们来发送一封电子邮件
    • 您可能正在查看不正确的日志文件。您在 SMTP 服务器端尝试使用哪个日志文件?
    • 不是我——我的同事。不幸的是,我无法访问。但是成功的电子邮件确实显示在同一个日志文件中,所以如果它是错误的,我会感到惊讶。我看看能不能验证。
    • 如果您要为每条消息打开和关闭一个套接字,您可能会加重 SMTP 服务器的负担,并有效地使自己失去连接能力。
    • 每分钟 9 封电子邮件?也许......我在想如果是这样的话,可能会尝试切换到使用拾取目录。有谁知道这对吞吐量有没有影响?
    猜你喜欢
    • 2022-01-21
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多