code up

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

AWS - EC2からメール送信

EC2インスタンスからのメール送信について。

本記事は単一のEC2インスタンスからメールを送信する場合について記載しており、外部からEC2のメールサーバー(25番ポートでListenしているプロセス)にアクセスする場合、外部のSMTPサーバーが行っているOutbound Port 25 Blockingの話題、Amazon VPCで複数のインスタンスからメール送信するケースは扱っていない。

EC2からメールを送信する方法

  1. インスタンスに標準でついてくる(のかな?今の環境は勝手に起動してた)SMTPサーバーを利用する
  2. Amazon Simple Email Service (Amazon SES)を利用する。ただし、薄くベータと書いてあるので注意
  3. 外部のSMTPサーバーを利用する

SMTP制限; 25番ポート

EC2インスタンスから外部(Outbound)に対する25番ポートの通信には一定の制限値が設けられているらしい(閾値は可変のためか非公開の模様)。フォーラムを検索すると同様の問題についての問合せを見つけることができる(こことかこことかここ)。それを解除するためには、Request to Remove Email Sending Limitationsのフォームを使って申請しておく必要がある(お問い合わせ(Contact Us)の制限増加申請(Request Limit Increases)にあるAmazon EC2 のEメール(Amazon EC2 Emails)からたどれる)。

時間あたり数十通送っただけで制限値にひっかかるみたい。文面を引用すると、

Dear EC2 Customer,
You recently reached a limit on the volume of email you were able to send out of SMTP port 25 on your instance: (以下略)

という内容のようだ。文面では25番ポートに限って言っているようだが、Request to Remove Email Sending Limitationsを読む限り25番だけを監視していることを明言していない。現状は、ここの記事に『I send email via smtp through sendgrid on port 587. I haven't seen any issues throttling issues. 』と返信があるように、25番以外の通信は大丈夫な様子。

1.の場合はlocalhostのSMTPサーバーが外部のMTAに対して25番ポートでつなぐため外向きな25ポートの通信を行うため本制限にひっかかる。

2.の場合は本制限ではなくSESの制限(日本語, 英語)が適用される。ただし、この記事にあるようにリージョン(でいいのかな?)をまたがってSESを利用した場合はその通信が外部へのSMTP通信とみなされ、申請の必要な本制限に該当してしまうようだ。SESは日本リージョンでの提供がまだ始まってない(正確にはUS Eastのみである)のでEC2を日本リージョンで使っている方は注意が必要。

3.の場合のように外部のメール(SMTP)サーバーを使った場合でもAmazonから警告メールを受け取った方がいる。つまりEC2インスタンスから外向きの25番ポートを制限していることが分かる。

つまりは現状同一リージョンのSESのSMTPサーバーを除く外向きの25番ポートの通信には一定の制限がかかっているということのようだ。

対策/回避するには

これらの事例を踏まえて、次のような対応を行う必要がありそう。

  1. インスタンスに標準でついてくるSMTPサーバーの25番ポートを利用する場合は申請
  2. Amazon Simple Email Service (Amazon SES)を利用する場合は、同じリージョンにする。異なるリージョンにする場合は申請
  3. 外部のSMTPサーバーを利用する場合も申請

ただし、現状25番ポート以外は大丈夫そうに見えるが465番や587番ポートを使う場合でも念のため申請はしておいた方がよさそう。

また申請受理後はSESを除き制限はなくなるみたい。

ということで、申請した上で外部SMTPサーバー(587番ポート)を利用する予定。でも失敗、理由は後述。

申請してみた

外部SMTPサーバーを使用するようAmazonに申請。そしたらAmazonからこんなメールが。

Hello,

The mapping for this reverse DNS entry is failing because the PTR record doesn't match the A record for that domain. We currently require the forward A record to match the PTR record for all reverse DNS entries.

You can either provide us with an alternate hostname, or configure the A record for this domain to match the desired PTR record on your side.

Please resubmit your request via the online form so that we can resubmit the request:

https://aws-portal.amazon.com/gp/aws/html-forms-controller/contactus/ec2-email-limit-rdns-request

Thank you for your inquiry. Did I solve your problem?

ようは外部のSMTPサーバーを利用する際は、Amazon側で逆引きDNSの設定はしてくれず、申請者側でPTRレコードを予め登録しておかなければいけないとのこと。利用しようとしていたメールサーバーはいわゆる年千円しない共有サーバーで、そういった設定ができなかった。

じゃぁ、EC2にDNSサーバー立ててXName.orgのセカンダリDNSサーバーと組み合わせていけるかな?と思ったけど、やっぱり共有サーバーにPTRレコードを仕向けることは禁止されてるとのことで、結局は断念することに。PTRレコードはそのIPアドレスの所有者しか設定しちゃいかんというルールでもあるんかな。

最終的には、送信にはAmazon SESを使うことにした。

  1. Amazon SESのサインアップ
  2. プロダクションへのアクセスをリクエスト。これをしておかないと送信制限値が低いまま(200通/24時間くらいだった気が)、かつVerified Sendersにしかメールが送れない
  3. TokyoリージョンからUS-EASTリージョンへの通信なので申請を行う → あっさり受理
  4. AWS Management ConsoleでVerified Sendersを登録、SMTP SettingsでCredentialsを作成。SMTPパスワードは作成時に表示されるのみで後から確認しなおすことはできない。しっかりメモしておく
  5. SMTP Settingsに表示されている接続情報(email-smtp.us-east-1.amazonaws.com, 25/465,587, tls, SMTP Auth)に接続すればよい。EC2インスタンス以外からでも接続可能(例えばThunderbirdのようなメールクライアントからでも)
  6. 作成したSMTPユーザーを削除するにはAWS Identity and Access Management (IAM)から削除できる

申請受理のメール。

Hello,

We have configured the reverse DNS record you requested.  Please note that propagation of this update to DNSBL services that Amazon works with may take up to a week.

If you also requested removal of the email sending limitations on your account, these have also been removed for any IPs and instances under your account.

Please let us know if you have any questions.

Thank you for your inquiry. Did I solve your problem?

『If you also requested removal of the email sending limitations on your account』(もしアカウントのメール送信制限の解除もリクエストしていたなら)って書いてあるんだけど、逆引きDNSがついでで元々は送信制限を解除するためのフォームだと思うんだけど、、、謎。これでこのアカウントから送信されるメールは一切の制限がなくなったみたいだ。この状態で外部SMTPサーバーを使えばいいのかもしれないけど、もう切り替える余力なし。

最終的な構成は、

  • メール送信: Amazon SES。サブドメイン(mail.foobar.jp)にて送信
  • メール受信: Google Apps。ルートドメイン(foobar.jp)で受信
  • バウンスメールの宛先(Return-Path)やReply-Toはルートドメインの方を指定するけど、念のためサブドメイン宛てに送られてくるメールを受け取るために、EC2にはPostfixとDovecotをインストール。Dovecotってお勧めしているところが多いけどDIGEST-MD5とCRAM-MD5を同時に使うのはセキュリティ的によくないみたい(wikiによると同時に使う場合はパスワードをプレーンテキストで保存しておかないといけないため)

JavaMailで送信確認したところ、SSL/SMTP Auth含めて特に問題なく送信できた。Return-Path(バウンスメールの戻り先)をmail.smtps.fromで指定して送信したところ、ヘッダからその宛先は消えてしまうのだが、きちんとそのアドレスにエラーが戻ってきたので、Amazon側でどこかに保存した上で上書きしてるんでしょう(メールのクオリティの算出のために)。

それにしてもJavaMailはDIGEST-MD5対応(CRAM-MD5は×)。ThunderbirdはCRAM-MD5対応(DIGEST-MD5は×)。GmailのFetch機能は特にヘルプ(Mail Fetcher 概要)に記載はないけど、PLAINのみっぽい。どれでも使えるようにするんだったらSSL+PLAINが一番汎用性が高いのかな、今は。

その他の制限

SESの制限はFAQ(英語)に記載がある。

  • 1通あたりのメールは10MBまで
  • 1通あたりの宛先数はTo, Cc, Bcc含めて50アカウントまで。RFC的には100件まで(RFC 821, RFC 2821, RFC 5321)
  • 送信クォータ(Sending quota)と呼ばれる24時間あたりに送信できるメールの最大数と、最大送信レート(Maximum send rate)と呼ばれる1秒間に送信できるメールの最大数が動的に決定され制限される。Developer Guideによると、送信クォータは10,000/24h、最大送信レートは5/secからスタートするみたい。送信するメールの質(スパム、バウンス・メール(届かずメールが折り返されたメール)、苦情等)が良ければ制限量は緩やかになるようだ。これらのアクティビティをAWS Management Consoleで確認・監視できる
関連記事
タグ:AWS EC2 AmazonSES
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。