2010-09-07 44 views
8

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

我被这个错误难倒,因为:

  • 谷歌电子邮件通常是非常可靠的(它从我的域发送的,而不是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) 
+0

对此特定错误执行谷歌搜索表明,这可能是他们知道的Google服务器的问题。分辨率未决。 – 2010-09-07 15:49:39

回答

5

我已经在过去的批量电子邮件系统的工作。您收到的异常消息完全是描述性的:SMTP服务器暂时不接受邮件。这可能是由于一些条件:

  1. 服务器忙
  2. 你把太多的电子邮件过快(这可以让你看起来像一个垃圾邮件发送者)
  3. 常规错误

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

+0

根据您的经验......在发生第一次SMTP故障后立即尝试第二次是否是一个好主意,并在1秒之间延迟?这似乎只是暂时的问题(令人惊讶,因为它是谷歌邮件!!?),只是重复发送似乎克服了问题。 – 2010-09-07 16:31:11

+1

我保证你不是唯一一个通过Google或其他ISP/ESP发送此错误的人。这不一定是谷歌最终的“失败” - 该服务器上的队列可能已满或其他任何常见问题。一秒可能是不够的,我会等待至少30秒。 – 2010-09-07 16:39:53

+0

感谢您的建议! – 2010-09-07 16:45:02

0

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

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