使用ASP.NET发送电子邮件的临时问题

时间:2010-09-07 15:44:44

标签: c# asp.net smtp

我讨厌在这里发布一个堆栈跟踪,但我没有想法......我的应用程序在网站上发送各种任务的电子邮件,90%的时间都没有问题。但是,ASP.NET经常会抛出一个奇怪的异常,这似乎与邮件服务器连接有关(我使用谷歌业务服务器来处理电子邮件)。这个错误对我来说太通用了,所以下面的堆栈跟踪。我的应用程序捕获异常并回写一个通用的'在5分钟响应中再试一次'。

我被这个错误所困扰,因为:

  • Google电子邮件通常非常可靠(它是从我的域发送的,而不是gmail.com)。
  • 卷非常低,所以这不应该是加载/垃圾邮件类型的问题。
  • 错误很通用。
  • 在5分钟内再次尝试几乎总是允许发送电子邮件没有问题,没有任何参数(收件人,主题,正文)发生变化。

有什么想法吗?我能想到的唯一突出问题是:

  1. 电子邮件发送是同步的。这就是我实际想要发生的事情,因为我想用成功/失败状态消息来响应用户。
  2. 我正在使用Amazon EC2作为服务器,如果这与此事有任何关系。
  3. 代码:

        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)
    

2 个答案:

答案 0 :(得分:6)

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

  1. 服务器正忙
  2. 您发送的电子邮件过多(这可能会让您看起来像垃圾邮件发送者)
  3. 常规错误
  4. 以后重试电子邮件始终有效的事实表明这是正常的预期行为。没有什么可以做的不同以避免这种情况,这是ISP在需要时用来限制流量的常用方法。

答案 1 :(得分:0)

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

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