2012-12-03 40 views
2

在Windows控制台应用程序使用.NET 3.5后(我改变了现有的.NET 2.0应用到.NET 3.5).NET 3.5 Smtpclient - 失败发送电子邮件 - 只能重新开始,每次

我有奇怪的问题,代码发送电子邮件作品几次(可能是5到10次)。

经过几次,它没有发送邮件“邮件发送失败”。重新启动系统后,相同的代码工作。 (这不是预期的生产解决方案)。

这是一段代码,我觉得,我已经关闭了这个SmtpClient连接。所以我将客户端设置为null,并调用GC.Collect,但没有帮助我。

请帮



private static void SendEmail(MailMessage msg) 
{ 
      SmtpClient client = new SmtpClient(GetSMTPServer(), GetSMTPPort()); 

      client.Credentials = CredentialCache.DefaultNetworkCredentials; 
      client.EnableSsl = false; 
      client.ServicePoint.MaxIdleTime = 1; 
      //client.Timeout = GetSMTPTimeout(); 30000000 
      client.Send(msg); 
      client = null; 
      GC.Collect(); 
} 


+1

异常的详细信息是不够的,捕捉异常的详细信息。 –

+0

- \t \t SMEX \t { “发送邮件失败。”} \t System.Net.Mail.SmtpException - \t \t的InnerException \t { “无法读取传输连接的数据:net_io_connectionclosed”} \t System.Exception的{系统。 IO.IOException} – Bennz

+0

检查出http://stackoverflow.com/questions/1143846/unable-to-read-data-from-the-transport-connection-net-io-connectionclosed和类似的问题 –

回答

1

如果与两个邮件发送的时间间隔为60秒和更小的超过90秒大,你一定会得到这个错误。

例如,您在上午8:08:08发出第一封电子邮件,然后在上午8:09:10发出第二封电子邮件,将抛出异常。

它是SmtpClient.TimeOut设置上的一个错误,您不能更改它。

如何解决这个问题? 三种方式:

  1. 尝试发送,如果发现异常,再发送。
  2. SmtpClient.Dispose()为.NET框架3.0及以上
  3. 设置SmtpClient.servicepoint.maxidletime=1000;设置为1太小,不能在调试模式下工作
2

尝试只需使用using块妥善处理SmtpClient后发送。

private static void SendEmail(MailMessage msg) 
{ 
    using(SmtpClient client = new SmtpClient(GetSMTPServer(), GetSMTPPort())) 
    { 
     client.Credentials = CredentialCache.DefaultNetworkCredentials; 
     client.EnableSsl = false; 
     client.Send(msg); 
    } 
} 

参见:.NET Best Method to Send Email (System.Net.Mail has issues)