Amazon EC2/SES SMTP Timeout



尝试使用 SMTP 从 EC2 实例向 SES 发送电子邮件时出现问题。 由于某种原因,我遇到了零星的超时问题,无法再联系SMTP主机。 需要注意的是,通过 SES 发送的概率可能为 75%。

我将从一些细节开始。 我的SES帐户大部分时间都在工作。 发件人电子邮件已通过验证,我的限制已增加到 10k/天,5 封电子邮件/秒。 我的印象是,如果这与我的限制有关,我会得到一个特定于限制的错误。 对于我的SMTP配置,我正在使用带有TLS 的posfix。 我在官方 AWS SES 论坛上发布了一篇非常相似的帖子,但尚未取得任何成功。 该帖子的信息位于本文的底部。

这是今天早上失败的示例。 我在下面运行的所有命令都是从我尝试从中发送邮件的 EC2 实例运行的。 很抱歉小说大小的帖子,我只想确保我包含所有内容。

我发送给自己的电子邮件未送达:

Jun 25 06:16:36 intranet01 postfix/smtp18832: 9E00C230DA: to=<myemailaddress>, relay=none, delay=150, delays=0.02/0.01/150/0, dsn=4.4.1, status=deferred (connect to email-smtp.us-east-1.amazonaws.comhttp://107.22.187.122:25: Connection timed out)

当我看到失败时,我尝试通过端口 25 连接到电子邮件主机。我无法连接:

root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25  
Trying 174.129.28.151...  
^C

几分钟后,我的延迟电子邮件终于通过:

Jun 25 06:23:14 intranet01 postfix/smtp18861: 9E00C230DA: to=<myemailaddress>, relay=email-smtp.us-east-1.amazonaws.comhttp://184.73.218.23:25, delay=548, delays=548/0.02/0.21/0.36, dsn=2.0.0, status=sent (250 Ok 0000013823cf7441-83710873-e946-4c80-8a54-0dd72bae6f30-000000)
Jun 25 06:23:14 intranet01 postfix/qmgr3972: 9E00C230DA: removed

现在我可以连接到端口 25:

root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25  
Trying 107.20.152.208...  
Connected to email-smtp.us-east-1.amazonaws.com.  
Escape character is '^]'.  
220 email-smtp.amazonaws.com ESMTP SimpleEmailService-222567251  
^]

对于踢,我决定查看 SES 主机终结点。 事实证明,它只是一个ELB cname,其中A记录指向多个可用区中的接口。

root@intranet01 sbin# dig email-smtp.us-east-1.amazonaws.com  
; <<>> DiG 9.7.3-P3-RedHat-9.7.3-8.P3.17.amzn1 <<>> email-smtp.us-east-1.amazonaws.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8592
;; flags: qr rd ra; QUERY: 1, ANSWER: 9, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:  
;email-smtp.us-east-1.amazonaws.com. IN A  
;; ANSWER SECTION:  
email-smtp.us-east-1.amazonaws.com. 54 IN CNAME ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com.  
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 174.129.200.82  
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 184.73.219.75  
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 107.20.152.208  
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 107.20.160.81  
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 107.20.203.50  
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 107.22.229.233 
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 174.129.6.189  
ses-smtp-prod-335357831.us-east-1.elb.amazonaws.com. 60 IN A 174.129.28.151

我尝试发送另一条消息,但失败了。 这次我遍历了 SES cname 返回的每个 A 记录地址。 我无法连接到其中任何一个。 在此期间,我还尝试从本地计算机(不是我的 EC2 实例)进行连接,效果很好。

root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.28.151...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.6.189...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.22.229.233...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.203.50...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.160.81...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.152.208...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 184.73.219.75...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.200.82...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.28.151...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.6.189...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.22.229.233...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.203.50...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.179.13...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 107.20.160.81...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 184.73.219.75...
^C
root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.200.82...
^C

等待大约 30 秒后,我再次尝试,这次它奏效了。

root@intranet01 sbin# telnet email-smtp.us-east-1.amazonaws.com 25
Trying 174.129.28.151...
Connected to email-smtp.us-east-1.amazonaws.com.
Escape character is '^]'.
220 email-smtp.amazonaws.com ESMTP SimpleEmailService-222567251
^C^[
^]
telnet>

正如我之前所说,我在 AWS SES 论坛上发布了一篇非常相似的帖子。 该帖子可以在下面找到。

https://forums.aws.amazon.com/thread.jspa?threadID=97736&tstart=0

此外,似乎我并不孤单,因为我在SES论坛上发现了另一篇帖子,看起来像同样的问题。

https://forums.aws.amazon.com/thread.jspa?threadID=91260&tstart=0

我认为可能存在某种EC2 SMTP限制,因此我填写了"从EC2发送电子邮件"申请表,但这对我来说似乎很愚蠢,因为我使用的是亚马逊的服务,而不是第三方。 到目前为止,我在填写表格后还没有收到亚马逊的任何回复。

有人有什么想法吗? 提前谢谢。

所以显然EC2有自己的局限性。我(错误地)认为对SES进行生产访问也意味着放宽EC2的SMTP限制,但由于它们是两个完全独立的产品,我想事实并非如此。

但正如我在帖子的最后一段中所述,您可以请求删除电子邮件发送限制以提高这些限制。我这样做了,问题就解决了(他们花了大约 5 个小时才取消了我的限制)。


更新

EC2 限制记录在连接到 Amazon SES SMTP 终端节点中,实际上仅限于端口 25,因此另一种直接的解决方案是简单地使用端口 587(有点不幸的是,几个官方的 SES 示例确实使用端口 25):

重要

弹性计算云 (EC2) 通过以下方式限制通过端口 25 的电子邮件流量 违约。避免通过 SMTP 发送电子邮件时超时 来自 EC2 的终端节点,使用其他端口(587 或 2587)或填写 请求删除电子邮件发送限制以删除限制。

请注意,这可能也略有过时,因为 AWS 管理控制台和 Amazon SES SMTP 问题部分仅指更常见的备用端口 465 和 587:

您通过端口 25 从 Amazon EC2 实例发送到 Amazon SES,并且无法达到 Amazon SES 发送限制,或者您 接收超时 — Amazon SES EC2 施加默认发送限制 在通过端口 25 发送的电子邮件上,如果 尝试超过这些限制。要删除这些限制,请提交 请求删除电子邮件发送限制。您也可以连接 通过端口 465 或端口 587 连接到 Amazon SES,这两个端口都不会受到限制。

如果你正在运行一个 Django 应用程序,并怀疑 Steffen 的答案可能是原因 - 这是一个快速的试金石:

In [1]: from django.core.mail.backends.smtp import EmailBackend
In [2]: from django.core.mail import EmailMultiAlternatives
In [3]: message = EmailMultiAlternatives(
   ...:     subject='testing the rate limit',
   ...:     body='this is a test',
   ...:     to=['your+email@example.com'],
   ...:     from_email='from@example.com',
   ...: )
In [4]: backend_587 = EmailBackend(port=587)
In [5]: backend_25 = EmailBackend(port=25)
In [6]: backend_587.send_messages([message])
Out[6]: 1
In [7]: backend_25.send_messages([message])  # hangs for a long time. Might even timeout

从端口 25 发送电子邮件应挂起。从 587 发送电子邮件应该会很快发送。

它看起来像是 EC2 上端口 25 限制的情况。默认情况下,AWS 会限制端口 25,以避免恶意用户/软件发送批量电子邮件。您可以按照此处的说明删除此限制:https://aws.amazon.com/premiumsupport/knowledge-center/ec2-port-25-throttle/

或者,您可以将应用程序中的传出端口更改为使用 587, 2587 进行 STARTTLS 支持,或使用 465/2465 进行 TLS 包装器。

相关内容

  • 没有找到相关文章

最新更新