【问题标题】:Temporary problems sending emails with ASP.NET使用 ASP.NET 发送电子邮件的临时问题
【发布时间】:2011-04-09 06:45:50
【问题描述】:

我不想在这里发布堆栈跟踪,但我没有想法......我的应用程序为网站上的各种任务发送电子邮件,并且 90% 的时间没有问题。然而,ASP.NET 每隔一段时间就会抛出一个奇怪的异常,这似乎与邮件服务器连接有关(我使用 google 业务服务器来处理电子邮件)。这个错误对我来说太笼统了,无法调试,因此下面是堆栈跟踪。我的应用程序捕获了异常并写回了一个通用的“在 5 分钟内重试响应”。

我被这个错误难住了,因为:

  • Google 电子邮件通常非常可靠(它是从我的域发送的,而不是 gmail.com)。
  • 音量非常低,因此这不应该是加载/垃圾邮件类型的问题。
  • 错误非常普遍。
  • 在 5 分钟内再次尝试几乎总是可以毫无问题地发送电子邮件,并且没有任何参数(收件人、主题、正文)发生变化。

有什么想法吗?我能想到的唯一悬而未决的问题是:

  1. 电子邮件发送是同步的。这是我真正想要发生的事情,因为我想用成功/失败状态消息来响应用户。
  2. 我使用 Amazon EC2 作为服务器,如果这对此事有任何影响的话。

代码:

    public static void SendMail(String from, String to, String subject, String body, bool IsHtml)
    {
        MailMessage m = new MailMessage(from, to, subject, body);
        m.IsBodyHtml = IsHtml;

        SmtpClient smtpClient = new SmtpClient();
        smtpClient.EnableSsl = true;
        smtpClient.Send(m);
    }

例外:

System.Net.Mail.SmtpException: Error in processing. The server response was: 4.3.0 Mail server temporarily rejected message. m6sm2190005vcx.24
at System.Net.Mail.DataStopCommand.CheckResponse(SmtpStatusCode statusCode, String serverResponse)
at System.Net.Mail.DataStopCommand.Send(SmtpConnection conn)
at System.Net.Mail.SmtpConnection.OnClose(Object sender, EventArgs args)
at System.Net.ClosableStream.Close()
at System.Net.Mail.MailWriter.Close()
at System.Net.Mail.SmtpClient.Send(MailMessage message)

【问题讨论】:

  • 对这个特定错误执行谷歌搜索表明这可能是他们知道的谷歌服务器的问题。待解决。

标签: c# asp.net smtp


【解决方案1】:

我过去曾在批量电子邮件系统上工作过。您收到的异常消息完全是描述性的:该 SMTP 服务器暂时不接受邮件。这可能是由于多种情况造成的:

  1. 服务器正忙
  2. 您发送太多电子邮件的速度太快(这会使您看起来像垃圾邮件发送者)
  3. 一般错误

稍后重试电子邮件总是有效的事实表明这是正常的预期行为。没有什么可以做的不同来避免这种情况,这是 ISP 在需要时用来限制流量的常用方法。

【讨论】:

  • 根据您的经验... 在第一次 SMTP 故障发生后立即尝试第二次是否是个好主意,之间有 1 秒的延迟?这似乎只是暂时的问题(令人惊讶,因为它是谷歌邮件!!?)并且简单地重复发送似乎可以解决问题。
  • 我保证您不是唯一一个通过 Google 或任何其他 ISP/ESP 发送此错误的人。这不一定是 Google 的“失败”——该服务器上的队列可能已满或其他一些常见问题。一秒钟可能还不够,我至少要等 30 秒。
【解决方案2】:

除了 Dave Swersky 已经说过的话: 您可以将要发送的电子邮件存储在某个地方(如文件系统或数据库),并让电子邮件生成由服务处理。您的服务将监视要发送的新电子邮件。如果发送时发生错误,您可以将电子邮件放回队列中,稍后再试。

也许您甚至可以使用本地 STMPServer,它使用 GoogleMail 作为中继服务器。在这种情况下,您可以使用内置的pickingdirectory 功能而不是自己编写。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2014-11-21
    • 2012-01-02
    • 1970-01-01
    • 2011-05-24
    相关资源
    最近更新 更多