【发布时间】: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>
我整理的一些笔记:
- 每封电子邮件都带有自己的
SmtpClient实例。即使在批量发送场景中也是如此。我已经读到这可能会影响性能,因为套接字没有被池化。但是,当它确实起作用时,性能似乎就足够了。 - 我们使用的是 .NET 4,因此修复了
SmtpClient未终止连接的错误。 - 据一位同事说(我自己无权访问服务器日志),SMTP 服务器不会记录失败电子邮件的连接尝试(尽管成功的电子邮件确实有日志条目)
【问题讨论】:
标签: .net smtp smtpclient