我在尝试使用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发送电子邮件”请求表,但这对我来说似乎很愚蠢,因为我使用的是亚马逊的服务,而不是第三方。到目前为止,我还没有收到亚马逊在填写表格后的任何回复。
有人有什么想法吗?提前谢谢。
它看起来像EC2上的端口25节流。AWS默认限制端口25,以避免恶意用户/软件发送大量电子邮件。您可以按照此处的说明删除此限制:https://aws.amazon.com/premiumsupport/knowledge-center/ec2-port-25-throttle/
或者,您可以将应用程序中的传出端口更改为使用5872587支持STARTTLS,或使用465/2465支持TLS包装器。
如果您正在运行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有它自己的限制。我(错误地)认为,拥有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