当前位置: 首页 > 知识库问答 >
问题:

Amazon EC2/SES SMTP超时

利永年
2023-03-14

我在尝试使用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主机endpoint。原来它只是一个ELB cname,有一个指向多个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

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

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

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

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

共有3个答案

戎志勇
2023-03-14

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

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

冯霖
2023-03-14

如果您正在运行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发送电子邮件应该可以快速发送。

徐景明
2023-03-14

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

但正如我在文章最后一段所说,你可以要求取消电子邮件发送限制,以提高这些限制。我这样做了,问题就停止了(他们花了大约5个小时才消除了我的限制)。

EC2节流是在连接Amazon SES SMTPendpoint时记录的,并且实际上被限制在端口25,因此一个替代的即时解决方案是只使用端口587(有点遗憾的是,一些官方SES示例确实使用端口25):

重要的

默认情况下,弹性计算云(EC2)通过端口25限制电子邮件流量。要避免从EC2通过SMTPendpoint发送电子邮件时超时,请使用其他端口(587或2587)或填写请求以删除电子邮件发送限制以删除限制。

请注意,这可能也有点过时,因为AWS管理控制台和Amazon SES SMTP问题都只涉及更常见的替代端口465和587:

您正在通过端口25从Amazon EC2实例发送到Amazon SES,但您无法达到Amazon SES发送限制,或者您正在接收超时-Amazon SES EC2对通过端口25发送的电子邮件施加默认发送限制,如果您试图超过这些限制,则会限制出站连接。若要删除这些限制,请提交请求以删除电子邮件发送限制。您还可以通过端口465或端口587连接到Amazon SES,这两个端口都不受限制。

 类似资料:
  • 我需要使用php、mysql和HTML创建一个web应用程序。请求和数据的数量会很高。我需要亚马逊服务器空间。 我可以购买S3并运行php和查询我的数据库吗? 请告诉我AmazonS3和AmazonEC2实例的区别。

  • 当我们所有数据库的 SQL 语句是通过子查询方式完成,对于超时的控制往往很容易被大家忽略。因为大家在代码里看不到任何调用 set_timeout 的地方。实际上 PostgreSQL 已经为我们预留好了两个设置。 请参考下面这段配置: location /postgres { internal; default_type text/html; set_by_lua_blo

  • 你是否正遇到网络或 CPU 的瓶颈? 验证客户端和托管redis-server的服务器上支持的最大带宽。如果有请求被带宽限制,则它们需要更长时间才能完成,从而可能导致超时。 同样,验证您没有在客户端或服务器框上获得CPU限制,这将导致请求等待CPU时间,从而超时。 有没有命令需要在 redis 服务器上处理很长时间? 可能有一些命令需要很长时间才能在redis服务器上处理,导致请求超时。 长时间

  • 套房级 套件级超时可应用于整个测试“套件”,或通过其禁用this.timeout(0)。这将由所有嵌套套件和不覆盖该值的测试用例继承。 describe('a suite of tests', function() { this.timeout(500); it('should take less than 500ms', function(done){ setTimeout(done, 30

  • 我使用命令生成器在Jenkins服务器上运行单元测试。phar exec“codecept运行单元应用程序/模型”-vvv并获取以下错误: [Symfony\Component\Process\Exception\ProcessTimedOutException] 进程“codecept运行单元应用程序/模型”超过了1800秒的超时时间。 我如何修复它并允许测试花费更多的时间?谢谢

  • 你知道是怎么回事吗?

  • 问题内容: 我正在使用SwingWorker通过TCP连接读取数据并在数据返回时显示。 当套接字失效时,例如在writeTo之后,它将永久等待套接字上的输入,从而产生问题。一段时间后最简单的超时方法是什么?是否这也是在这种情况下,最好的解决办法?在该解决方案中,我还会使用摇摆工人吗? 谢谢 问题答案: 是的,您链接到的解决方案是一个合理且简单的解决方案(“ best”太主观了:)您可以利用Swin

  • 示例: timeout 超时机制可以保护服务调用陷入无限的等待之中。超时定义了服务的最长等待时间,如果在给定的时间没有相应,服务调用就进入下一个状态,或者重试、或者立即返回错误。 Server 你可以使用OptionFn设置服务器的 readTimeout 和 writeTimeout。 ```go server struct type Server struct { …… readTimeout