.NET 3.5 Smtpclient - 发送电子邮件失败 - 仅在每次重新启动后才起作用

时间:2012-12-03 18:17:14

标签: .net smtpclient

在使用.NET 3.5的Windows控制台应用程序中(我将现有的.NET 2.0应用程序更改为.NET 3.5)

我有一个奇怪的问题,发送电子邮件的代码可以工作几次(可能是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();
}


2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

如果两次邮件发送之间的间隔大于60秒且小于90秒,您肯定会收到此错误。

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

这是SmtpClient.TimeOut设置的错误,您无法更改。

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

  1. 尝试捕捉发送,如果发现异常,再次发送。
  2. SmtpClient.Dispose()适用于.net framework 3.0及以上版本
  3. 设置为SmtpClient.servicepoint.maxidletime=1000;设置为1太小,无法在调试模式下工作