web-dev-qa-db-ja.com

Amazon EC2 / SES SMTPタイムアウト

SMTPを使用してEC2インスタンスからSESにメールを送信しようとすると問題が発生します。何らかの理由で、散発的なタイムアウトの問題が発生し、SMTPホストに接続できなくなりました。 SESを介した送信は、75%の確率で機能することに注意してください。

まず、いくつかの詳細から始めます。私のSESアカウントは、ほとんど機能しています。送信者のメールが確認され、私の制限が1日あたり1万件、1日あたり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=

また、SESフォーラムでこの別の投稿を見つけたので、私だけではないようです。同じ問題のようです。

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

なんらかのEC2 SMTPの制限があるのではないかと思ったので、「EC2からの電子メールの送信」リクエストフォームに記入しましたが、サードパーティではなくAmazonのサービスを使用しているので、私にはばかげているようです。これまでのところ、フォームに記入した後、Amazonから何も返事がありません。

誰かアイデアはありますか?前もって感謝します。

33
fattastic

そのため、EC2には独自の制限があるようです。 SESへの実稼働アクセスがあるとEC2からのSMTP制限が緩和されることも意味すると(誤って)想定しましたが、これらは2つの完全に別個の製品であるため、そうではないと思います。

しかし、私の投稿の最後の段落で述べたように、これらの制限を引き上げるために Eメール送信の制限を削除するリクエスト を行うことができます。私はそれをしました、そして、問題は止まりました(私の限界が取り除かれるのにおよそ5時間かかりました)。


更新

EC2スロットリングは Connecting to the Amazon SES SMTP Endpoint に記載されており、実際にはポート25に制限されているため、代わりの即時ソリューションは代わりにポート587を使用するだけです(いくつかの公式のSESの例は残念です)実際にポート25を使用):

重要

Elastic Compute Cloud(EC2)は、デフォルトでポート25経由の電子メールトラフィックを抑制します。 EC2からSMTPエンドポイントを介して電子メールを送信するときのタイムアウトを回避するには、別のポート(587または2587)を使用するか、 電子メール送信制限の削除要求 に入力してスロットルを削除します。

AWS Management Console とセクション Amazon SES SMTPの問題 の両方が、より一般的な代替ポート465と587のみを参照している限り、これも少し古い可能性があることに注意してください。

ポート25経由でAmazon EC2インスタンスからAmazon SESに送信していて、Amazon SESの送信制限に到達できないか、タイムアウトを受信して​​います— Amazon SES EC2は、ポート25経由で送信される電子メールにデフォルトの送信制限を課し、それらの制限を超えようとすると送信接続を抑制します。これらの制限を削除するには、 電子メール送信制限の削除リクエスト を送信します。ポート465またはポート587を介してAmazon SESに接続することもできます。どちらもスロットルされていません。

48
fattastic

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=['[email protected]'],
   ...:     from_email='[email protected]',
   ...: )
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からメールを送信すると、すぐに送信されます。

1
rikAtee

これは、EC2でポート25スロットリングのケースのように見えます。 AWSはデフォルトでポート25を抑制して、悪意のあるユーザー/ソフトウェアによって大量のメールが送信されるのを防ぎます。この制限を削除するには、次の手順に従ってください。 https://aws.Amazon.com/premiumsupport/knowledge-center/ec2-port-25-throttle/

または、アプリケーションの送信ポートを変更して、STARTTLSサポートに587、2587を使用するか、TLSラッパーに465/2465を使用することもできます。

0
Ranjan Dhar