Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用ASP.NET发送电子邮件时出现临时问题_C#_Asp.net_Smtp - Fatal编程技术网

C# 使用ASP.NET发送电子邮件时出现临时问题

C# 使用ASP.NET发送电子邮件时出现临时问题,c#,asp.net,smtp,C#,Asp.net,Smtp,我不想在这里发布堆栈跟踪,但我已经没有想法了。。。我的应用程序为网站上的各种任务发送电子邮件,90%的时间都没有问题。然而,ASP.NET经常抛出一个奇怪的异常,这似乎与邮件服务器连接有关(我使用谷歌商务服务器发送电子邮件)。这个错误对我来说太普通,无法调试,因此下面是堆栈跟踪。我的应用程序捕获异常并写回一个通用的“5分钟后重试响应” 我被这个错误难住了,因为: 谷歌电子邮件通常非常可靠(它是从我的域名发送的,而不是gmail.com) 容量非常低,因此这不应该是一个加载/垃圾邮件类型的问题

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

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

  • 谷歌电子邮件通常非常可靠(它是从我的域名发送的,而不是gmail.com)
  • 容量非常低,因此这不应该是一个加载/垃圾邮件类型的问题
  • 错误是非常普遍的
  • 在5分钟内再次尝试几乎总是可以让电子邮件发送没有问题,没有任何参数(收件人、主题、正文)发生更改
有什么想法吗?我能想到的唯一悬而未决的问题是:

  • 电子邮件发送是同步的。这是我真正想要的,因为我想用一条成功/失败状态消息来响应用户
  • 我正在使用AmazonEC2作为服务器,如果这与此事有任何关系的话
  • 守则:

        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)
    

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

  • 服务器正忙
  • 你发送的电子邮件太多太快(这会让你看起来像个垃圾邮件发送者)
  • 一般错误

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

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


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

    对该特定错误执行谷歌搜索表明,这可能是他们知道的谷歌服务器的问题。解决方案待定。根据您的经验。。。在第一次SMTP失败发生后立即尝试第二次,两次之间有1秒的延迟,这是一个好主意吗?这似乎只是暂时的问题(令人惊讶,因为这是谷歌邮件!!?),简单地重复发送似乎可以解决问题。我保证,你不是唯一一个通过谷歌或其他ISP/ESP发送此错误的人。这不一定是谷歌方面的“失败”——该服务器上的队列可能已满,或者存在其他一些常见问题。一秒钟可能不够,我至少要等30秒。