Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用SmtpClient时出现间歇性System.IO.IOException_.net_Smtp_Smtpclient - Fatal编程技术网

.net 使用SmtpClient时出现间歇性System.IO.IOException

.net 使用SmtpClient时出现间歇性System.IO.IOException,.net,smtp,smtpclient,.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.Sock

我对.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);
    }
}
   <mailSettings>
      <smtp from="validEmail"  deliveryMethod="Network"  >        
        <network defaultCredentials ="false" host="dedicatedSmtpServer" port="port"/>
      </smtp>
    </mailSettings>
请注意,我们正在处理所有资源,没有使用SSL,我们正在从
web.config
加载Smtp设置,如下所示:

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);
    }
}
   <mailSettings>
      <smtp from="validEmail"  deliveryMethod="Network"  >        
        <network defaultCredentials ="false" host="dedicatedSmtpServer" port="port"/>
      </smtp>
    </mailSettings>

我整理了一些笔记:

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

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

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


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

    您的代码与此无关。此特定错误:

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


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

    奇怪的是,SMTP服务器没有任何尝试连接的记录。此外,这些是非常短暂的套接字--我们只使用它们发送一封您可能在错误的日志文件中查找的电子邮件。您正在SMTP服务器端尝试哪个日志文件?不是我--我的同事。很遗憾,我无法访问。但是成功的电子邮件确实显示在同一个日志文件中,所以如果是错误的,我会感到惊讶。我会看看是否可以验证。如果你为每封邮件打开和关闭一个套接字,你可能会使SMTP服务器负担过重,并使自己无法连接。每分钟9封电子邮件?也许…我在想,如果是这样的话,也许可以改用收货目录。有人知道这是否会影响吞吐量吗?奇怪的是,SMTP服务器没有任何尝试连接的记录。此外,这些是非常短暂的套接字--我们只使用它们发送一封您可能在错误的日志文件中查找的电子邮件。您正在SMTP服务器端尝试哪个日志文件?不是我--我的同事。很遗憾,我无法访问。但是成功的电子邮件确实显示在同一个日志文件中,所以如果是错误的,我会感到惊讶。我会看看是否可以验证。如果你为每封邮件打开和关闭一个套接字,你可能会使SMTP服务器负担过重,并使自己无法连接。每分钟9封电子邮件?也许…我在想,如果是这样的话,也许可以改用收货目录。有人知道这是否对吞吐量有任何影响吗?