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から何も返事がありません。
誰かアイデアはありますか?前もって感謝します。
そのため、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に接続することもできます。どちらもスロットルされていません。
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からメールを送信すると、すぐに送信されます。
これは、EC2でポート25スロットリングのケースのように見えます。 AWSはデフォルトでポート25を抑制して、悪意のあるユーザー/ソフトウェアによって大量のメールが送信されるのを防ぎます。この制限を削除するには、次の手順に従ってください。 https://aws.Amazon.com/premiumsupport/knowledge-center/ec2-port-25-throttle/
または、アプリケーションの送信ポートを変更して、STARTTLSサポートに587、2587を使用するか、TLSラッパーに465/2465を使用することもできます。