2

在带有 .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();
}


4

2 回答 2

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 发送电子邮件的最佳方法(System.Net.Mail 有问题)

于 2013-10-07T14:11:39.727 回答
1

如果两次发送邮件的间隔大于 60 秒小于 90 秒,你肯定会得到这个错误。

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

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

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

  1. 尝试捕获发送,如果捕获异常,则再次发送。
  2. SmtpClient.Dispose()适用于 .net 框架 3.0 及更高版本
  3. 设置SmtpClient.servicepoint.maxidletime=1000;为 1 太小,在调试模式下不起作用
于 2013-01-11T06:31:07.250 回答