Amazon SES 停止工作

2024-04-09

我设置了 Amazon SES,它最初运行了几个小时,然后突然停止了。我发送的所有电子邮件以及我们的域都已经过验证。我们不会发送大量电子邮件 - 每天只发送几百封。每当我对 web.config 进行更改时,它似乎又可以再工作 2-3 小时。例如,它停止工作,所以我将端口 587 切换到 25,它开始工作 2-3 小时,然后停止。然后我又换回587,同样的事情发生了。一旦它停止工作,它似乎就不会自行重新启动。它运行在两台负载平衡服务器、asp.net Framework v2.0、IIS 7.5 上。这是我正在使用的代码:

网络配置:

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network" from="[email protected] /cdn-cgi/l/email-protection">
      <network defaultCredentials="false" host="email-smtp.us-east-1.amazonaws.com" userName="***" password="***" port="587" />
    </smtp>
  </mailSettings>
</system.net>

c# code:

var smtpClient = new SmtpClient() { EnableSsl = true };

var mailMessage =
    new MailMessage(fromAddress, toAddress, subject, body)
    {
        IsBodyHtml = true
    };

smtpClient.Send(mailMessage);

这是我收到的两个错误:

The following exception was thrown by the web event provider '(null)' in the application '/' (in an application lifetime a maximum of one exception will be logged per provider instance):

System.Web.HttpException: Unable to send out an e-mail to the SMTP server. Please ensure that the server specified in the <smtpMail> section is valid. ---> System.Net.Mail.SmtpException: Failure sending mail. ---> System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream.
   at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
   at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Mail.SmtpConnection.Flush()
   at System.Net.Mail.ReadLinesCommand.Send(SmtpConnection conn)
   at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   --- End of inner exception stack trace ---
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at System.Web.Management.MailWebEventProvider.SendMail(MailMessage msg)
   --- End of inner exception stack trace ---
   at System.Web.Management.MailWebEventProvider.SendMail(MailMessage msg)
   at System.Web.Management.SimpleMailWebEventProvider.SendMessageInternal(WebBaseEventCollection events, Int32 notificationSequence, Int32 begin, DateTime lastFlush, Int32 discardedSinceLastFlush, Int32 eventsInBuffer, Int32 messageSequence, Int32 messagesInNotification, Int32 eventsInNotification, Int32 eventsLostDueToMessageLimit)
   at System.Web.Management.SimpleMailWebEventProvider.SendMessage(WebBaseEvent eventRaised)
   at *****.Global.SimpleMailWithSslWebEventProvider.ProcessEvent(WebBaseEvent raisedEvent)
   at System.Web.Management.WebBaseEvent.RaiseInternal(WebBaseEvent eventRaised, ArrayList firingRuleInfos, Int32 index0, Int32 index1)

The following exception was thrown by the web event provider '(null)' in the application '/' (in an application lifetime a maximum of one exception will be logged per provider instance):

System.Web.HttpException: Unable to send out an e-mail to the SMTP server. Please ensure that the server specified in the <smtpMail> section is valid. ---> System.Net.Mail.SmtpException: Service not available, closing transmission channel. The server response was: Timeout waiting for data from client.
   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at System.Web.Management.MailWebEventProvider.SendMail(MailMessage msg)
   --- End of inner exception stack trace ---
   at System.Web.Management.MailWebEventProvider.SendMail(MailMessage msg)
   at System.Web.Management.SimpleMailWebEventProvider.SendMessageInternal(WebBaseEventCollection events, Int32 notificationSequence, Int32 begin, DateTime lastFlush, Int32 discardedSinceLastFlush, Int32 eventsInBuffer, Int32 messageSequence, Int32 messagesInNotification, Int32 eventsInNotification, Int32 eventsLostDueToMessageLimit)
   at System.Web.Management.SimpleMailWebEventProvider.SendMessage(WebBaseEvent eventRaised)
   at *****.Global.SimpleMailWithSslWebEventProvider.ProcessEvent(WebBaseEvent raisedEvent)
   at System.Web.Management.WebBaseEvent.RaiseInternal(WebBaseEvent eventRaised, ArrayList firingRuleInfos, Int32 index0, Int32 index1)

我尝试在亚马逊论坛上寻求帮助,但没有成功。似乎有什么东西干扰了连接,但我不知道是什么。有任何想法吗?谢谢。


这听起来确实是一个棘手的问题 - 我对此并不是 100% 肯定,但您似乎错过了处置 SMTP 客户端,这在更改为VPC实例后发送电子邮件经常很慢 https://serverfault.com/q/452462/10305导致您看到的错误:

当我不处理 SmtpClient 时,我收到错误...

'服务不可用,正在关闭传输通道。服务器 响应是:等待来自客户端的数据超时。

这实际上可以很好地解释间歇性问题,即根据执行的代码路径,此问题可能会触发 SMTP 连接亚马逊SES http://aws.amazon.com/ses/挂起,这显然可以通过切换到另一个端口来解决,这意味着连接正在重置 - 这就是SmtpClient.Dispose 方法 http://msdn.microsoft.com/en-us/library/ee706941.aspx还确保:

向 SMTP 服务器发送 QUIT 消息,优雅地结束 TCP 连接,并释放当前实例使用的所有资源 这SMTP客户端 http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx class.

因此,适当的模式是促进使用语句 http://msdn.microsoft.com/en-us/library/yh598w02.aspx,如所示Amazon SES 和 .NET 入门 http://sesblog.amazon.com/post/Tx19TAGZFKPEPGP/Getting-Started-with-Amazon-SES-and-NET:

  String username = "SMTP-USERNAME";  // Replace with your SMTP username.
  String password = "SMTP-PASSWORD";  // Replace with your SMTP password.
  String host = "email-smtp.us-east-1.amazonaws.com";
  int port = 25;

  using (var client = new System.Net.Mail.SmtpClient(host, port))
  {
    client.Credentials = new System.Net.NetworkCredential(username, password);
    client.EnableSsl = true;

    client.Send
    (
              "[email protected] /cdn-cgi/l/email-protection",  // Replace with the sender address.
              "[email protected] /cdn-cgi/l/email-protection",    // Replace with the recipient address.
              "Testing Amazon SES through SMTP",              
              "This email was delivered through Amazon SES via the SMTP end point."
    );
  }

请注意,该示例使用端口 25,由于通常隐含发送限制,我强烈建议避免使用该端口,请参阅Addendum有关相应 Amazon EC2 限制的详细信息,请参见下文。

祝你好运!


Addendum

Amazon EC2 在端口 25 上进行限制

您可能知道这一点(实际上我认为这不是问题),但是亚马逊EC2 http://aws.amazon.com/ec2/ 对通过端口 25 发送的电子邮件施加默认发送限制,并在您尝试超出这些限制时限制出站连接使用时仍然适用亚马逊SES http://aws.amazon.com/ses/, see Amazon SES SMTP 问题 http://docs.aws.amazon.com/ses/latest/DeveloperGuide/smtp-issues.html:

您正在通过端口 25 从 Amazon EC2 实例发送到 Amazon SES 并且您无法达到 Amazon SES 发送限制或者您 接收超时— Amazon SES EC2 对以下内容施加默认发送限制 通过端口 25 发送的电子邮件并限制出站连接,如果您 尝试超越这些限制。要消除这些限制,请提交请求删除电子邮件发送限制 https://aws-portal.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request。您还可以连接到 Amazon SES 通过端口 465 或端口 587,这两个端口均不受限制。

因此,我会从您的测试/切换场景中删除端口 25,并仅使用端口 465/587,以避免错误引导(正如所引用的,您也可以请求删除此限制,但这需要几个小时,并且端口 25 似乎最好首先避免) - 有点不幸的是,几个官方 Amazon SES 示例正在使用端口 25,甚至没有提到这个容易触发的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Amazon SES 停止工作 的相关文章

随机推荐

  • 获取页面矩形区域内的 DOM 元素

    给定网页上的两个点和一组 DOM 元素 如何找出位于这两个点定义的矩形区域内的 DOM 元素的子集 我正在开发一个基于网络的画廊 其中每张照片都包含在li标签 当用户用鼠标拖出一个矩形区域时 所有li矩形内的元素被标记为已选择 更喜欢 jQ
  • IE 9/10/11 声音文件限制

    我正在制作一个浏览器游戏 该游戏在同一场景中播放大约 60 个不同长度的音频文件 因此无法卸载 我想知道除了我之外是否有人面临这个问题 IE 对可以通过 HTML5 Audio load 方法加载的声音文件有 硬件相关 限制 就我而言 它恰
  • C++ 11:定期调用 C++ 函数

    我已经整理了一个简单的 C 计时器类 该类应该从各种示例中定期调用给定的函数 如下所示 include
  • 使用 MiniProfiler、EF 5 和 Autofac 分析 DbContext 的正确方法

    The MiniProfiler 站点 http miniprofiler com 给出了用于生成实体框架的以下代码ObjectContext public static MyModel Get var conn new StackExch
  • 使用最新的 gcc 生成库并使用较旧的 gcc 来使用它 - 尽管 C++ 版本相同,但为什么还会出现问题?

    不要问我为什么要做我正在做的事情 那将是一个很长的故事 目前 这篇文章的目的是学习并理解为什么事情没有按照我预期的方式进行 也许我的期望是错误的 因此 最初我使用最近的编译器从源代码构建了自己的 SystemC 2 3 3 库 例如海湾合作
  • 如何将 NSInteger 或 NSString 转换为二进制(字符串)值

    有人在 Objective C 中有一些代码可以将 NSInteger 或 NSString 转换为二进制字符串吗 example 56 gt 111000 stackoverflow 中有一些代码尝试执行此操作 但不起作用 Thanks
  • 如何选择全帧(未压缩)作为 VideoWriter 的编解码器

    我想将设备中的未压缩帧存储为视频 但我需要知道如何选择 全帧 未压缩 作为 VideoWriter 在 emgu 中又名 openCV 的编解码器 当我像这样传递 1 时 我可以从下拉菜单中选择它 VideoWriter myVideoWr
  • 如何在 Jenkins 脚本管道中设置多行参数化 cron 作业?

    所以这工作正常 properties https stackoverflow com questions 35370810 how do i use jenkins pipeline properties step parameters n
  • 使用其他 Const Struct 实例初始化 Const Struct

    我很好奇为什么以下代码片段无法编译 typedef struct Foo int a int b Foo static const Foo FooZero 0 0 typedef struct Bar Foo foo int c Bar s
  • SimpleMembership 的 IsUserInRole 错误

    我使用此代码在我的 ASP NET MVC 4 Internet 应用程序上进行角色授权 if Roles IsUserInRole RolunAdi a href Test a 它工作正常 但有时我会出错 它在这张图片上 我脑子里有两件事
  • 使用等待时 Monitor.Exit 上的 SynchronizationLockException

    我正在创建一段代码 从我们拥有的遗留系统中获取网页 为了避免过多的查询 我对获取到的URL进行了缓存 我在用Monitor Enter Monitor Exit并双重检查以避免请求发出两次 但在释放锁时Monitor Exit 我收到此异常
  • 通过高延迟网络连接同步许多(小)文件的方法

    我们通常使用 Subversion 将软件应用程序部署到客户端 客户端上的 svn 更新 单向 目前 我们的一位客户遇到了问题 因为延迟很高 大文件下载速度很好 因为他们位于中国 而我们的服务器位于加拿大 Subversion 在很长一段时
  • Thread.Sleep(300) 无法正常工作

    我希望它执行代码的第一部分 然后使图片框可见 暂停 3 秒 隐藏图片框并执行其余代码 first part of the code here pb elvisSherlock Visible true Thread Sleep 300 pb
  • 用于解析包含逗号分隔值的命令行输入的批处理文件

    我正在开发一个命令行实用程序 它将一组输入参数作为命令 然后根据预定义名称验证这些输入参数 该实用程序以这种方式调用 运行实用程序 cmd A B x y z C w 这里的参数是 A B 和 C 以 开头的参数 现在验证规则如下 参数的名
  • 使用rest-client 将文件下载到磁盘,而不先将其全部加载到内存中

    我正在使用 Rest client 下载大页面 大小约为 1 5 GB 检索到的值存储在内存中 而不是保存到文件中 结果我的程序崩溃了failed to allocate memory NoMemoryError 但没有必要将这些数据保存在
  • R:如何从 R 包中的 inst/extdata 延迟加载变量

    我的 inst extdata 中有一个文件 helper RData 文件 其中包含 我的包中的函数要使用的变量和数据集 但不意味着用户可以访问 我使用以下方法将其加载到包的开头 load system file extdata help
  • 在实现特征时如何明确指定生命周期?

    鉴于下面的实现 基本上我有一些可以通过 i32 id 字段或字符串字段查找的项目集合 为了能够互换使用 使用了特征 IntoKey 并且match分派到适当的查找映射 这一切都适合我的定义get内MapCollection impl use
  • React 16.8.6 对应的测试库/react 版本是什么?

    我正在尝试制作一个打字稿前端 但我无法使用react dom client导入是因为我已经缩小到我的测试库 反应版本与我的反应版本不对应的问题 我已经尝试了多个降级版本 但似乎无法让它工作 有什么解决办法吗 我会附上我的package js
  • 将请求传递给特定的分叉节点实例

    如果我错了 请纠正我 但不可能在同一端口上启动多个 http 服务器 基于此 有趣的是 NodeJS 集群可能会分叉 因为我知道有一个主人正在将请求传递给其中一个分叉工人 什么worker是由操作系统管理的或者cluster schedul
  • Amazon SES 停止工作

    我设置了 Amazon SES 它最初运行了几个小时 然后突然停止了 我发送的所有电子邮件以及我们的域都已经过验证 我们不会发送大量电子邮件 每天只发送几百封 每当我对 web config 进行更改时 它似乎又可以再工作 2 3 小时 例