使用SmtpClient

时间:2017-03-02 16:30:48

标签: .net smtp smtpclient

我遇到了.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封电子邮件),质量保证似乎永远不会出现此问题。

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

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服务器不会记录失败的电子邮件的连接尝试(尽管成功的电子邮件确实有日志条目)

1 个答案:

答案 0 :(得分:0)

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

  

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

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