2012-07-12 162 views
1

我试图使用以下代码发送电子邮件并获取上述错误。SMTP.SendMail错误 - 现有连接被远程主机强制关闭

有两封电子邮件发送第一个似乎得到罚款,下面的代码似乎并没有工作。

任何人都可以帮忙吗?

 using (var mail = new MailMessage(fromEmail.Trim(), ToEmail.Trim())) 
     { 
      mail.IsBodyHtml = true; 

      bodyText = bodyText.Replace("**Message**", Message); 

      // populate the message 
      mail.Subject = subject; 
      mail.Body = bodyText; 

      // send it 
      var smtpClient = new SmtpClient(); 
      smtpClient.Send(mail); 
     } 

在配置:

<system.net> 
    <mailSettings> 
     <smtp from="[email protected]"> 
     <network defaultCredentials="true" port="25" host="127.0.0.1" password="" userName=""/> 
     </smtp> 
    </mailSettings> 
    </system.net> 
+1

接收服务器可能具有反垃圾邮件设置,这些设置会拒绝来自相同源的连接太靠近。作为测试,在发送之间放入几秒钟的延迟。 – hatchet 2012-07-12 18:48:32

+1

请参阅http://stackoverflow.com/questions/8079605/why-cant-i-send-two-mails-in-a-row-with-c类似的问题。 – hatchet 2012-07-12 18:50:42

回答

3

代替放置MailMessage作为using块的主题,尝试使SmtpClient的主题。

编辑: 如果你的.net版本是< 4.0,你需要做一些简单的工作以确保smtp客户端在尝试发送另一条消息之前处置。

假设using块也代表一个实例方法的主体中,一个幼稚测试可以是:

  1. 创建包含类
  2. 的一个实例通过呼叫发送所述第一消息发送到上述参考的类方法
  3. 设置参考= NULL(换言之,确保SmtpClient实际上已被标记/设置。你可能想/需要实例的手动处理,作为进一步检查)

    Jeff Tucker建议您将SmtpClient.Timeout的值设置为2 - 有关更多信息,请参阅他的评论。

  4. 创建同一类
  5. 的新实例发送第二个消息

此之后(假设作品),你可以迭代步骤细化和缩小逻辑,直到你满意它。

+2

MailMessage和SmtpClient都在.Net 4中实现了IDisposable,所以两者都应该使用。在这两者中,SmtpClient是正确处置的更重要的一个。 – hatchet 2012-07-12 18:38:46

+0

Smtp在我所针对的框架的版本中没有实现IDisposable。有任何想法吗? – Burt 2012-07-12 18:39:53

+2

将SmtplClient.Timeout值设置为2,这会在您发送第一封电子邮件并强制将新连接添加到连接池后导致连接被破坏(可能)。你应该使用2的原因是因为一个错误(在.NET 4中修复)使得1和0的值实际上是无穷大。 Smtp连接独立于SmtpClient对象汇集,因此将其设置为null或尝试手动处理它将不起作用(并且它在4.0之前没有Dispose方法)。 – 2012-07-12 19:15:32

相关问题