Amazon EC2 / SES SMTP超时

时间:2012-06-25 17:17:18

标签: amazon-web-services amazon-ec2 smtp amazon-ses

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

我将从一些细节开始。我的SES帐户正在大多数工作。发件人电子邮件已经过验证,我的限制已经增加到10k /天,每封5封电子邮件。我的印象是,如果这与我的限制有关,我会得到一个限制特定的错误。对于我的SMTP配置,我使用posfix w / TLS。我在官方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记录指向多个AZ中的接口。

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发送电子邮件”请求表单,但由于我使用亚马逊的服务而不是第三方,因此对我来说似乎很愚蠢。到目前为止,我在填写表格后没有收到亚马逊的任何回复。

有没有人有任何想法?提前谢谢。

3 个答案:

答案 0 :(得分:47)

显然EC2有自己的限制。我假设(错误地)对SES的生产访问权限也意味着EC2放宽了SMTP限制,但由于它们是两个完全独立的产品,我认为情况并非如此。

但正如我在帖子的最后一段中所述,你可以Request to Remove Email Sending Limitations提出这些限制。我这样做了,问题停止了(他们花了大约5个小时才取消限制)。


更新

EC2限制记录在Connecting to the Amazon SES SMTP Endpoint中并且实际上限制在端口25,因此另一种直接的解决方案就是使用端口587(有点不幸的是,几个官方SES示例确实使用端口25):

  

重要

     

弹性计算云(EC2)通过端口25限制电子邮件流量   默认。通过SMTP发送电子邮件时避免超时   来自EC2的端点,使用不同的端口(587或2587)或填写a   Request to Remove Email Sending Limitations删除油门。

请注意,这可能会稍微过时,AWS Management ConsoleAmazon SES SMTP Issues部分仅涉及更常见的替代端口465和587:

  

您是通过端口25从Amazon EC2实例向Amazon SES发送的,但您无法达到您的Amazon SES发送限制,或者您是   接收超时 - Amazon SES EC2强加默认发送限制   如果您通过端口25发送的电子邮件和限制出站连接   试图超过这些限制。要删除这些限制,请提交   Request to Remove Email Sending Limitations。你也可以连接   通过端口465或端口587到Amazon SES,两者都没有被限制。

答案 1 :(得分:1)

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

ArrayList

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

答案 2 :(得分:0)

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

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