PHP
AWS
ses

EC2のインスタンスからSES経由でSendmailする

More than 1 year has passed since last update.

SDK使えば済む話ですが、PHPとか使ってるとローカルでsendmailできる前提にいろいろ動いてたりするので、sendmailをSESを連携するようにしてみたメモ。基本的にはここに手順があるのですが、そのままでは動かいないので、メモしておきます。


やりたいこと


  • EC2からsendmailでメール送信したい(PHPとかから送る必要あるので)

  • SPFとかDKIMの設定を楽に確実にしたい


素のEC2で設定してもよかたのですが、素直?にSES使うことにしました。



知っておかないとハマること

私はAmazon初心者なので、幾つか前提を理解しておらずハマりました。

SESはメール送信用のサービスですが、本格運営のためには「制限解除申請」的なものが必要で、そのままの状態(Sandbox)では、以下の制限があるようです。


  • 1日200通まで

  • 予め登録したメールにしか送れない(from, toに設定できない)

など。その他、1秒間に1通というのもあるらしいですね。あと、東京リージョンにはサービスが無いとか。。。

あと、EC2からのメール送信にも制限があり、申請による解除が必要のようです。


メール送信専用サービスなので、ちゃんと設定すれば制限なんて無いのかな?と勝手に思っていました。



SESでまずテストメールが送れるようにしておく


ドメインの登録

SES ダッシュボードの左ペインのDomainsでまず、送信(From)に利用したいドメインを登録しておきます。


メールアドレスの登録

続いてEmail Addressesで、送信先アドレスを登録しておきます。


テストメールの送信

上記の登録がおわり、ステータスがverifiedになったら、Domainsの[Send a Test Mail]で(指定した)メールにテストメールが届くか確認します。

メールが届けばSESとしては動いてる状態です。


SMTPのアカウント(Credential)を取得しておく

SMTP Settingsで、IDとPasswordを取得しておきます。


Sendmailの設定

私はAmazon Linux(1)を利用しています。標準でMTAとしてsendmailが動いているようですね。

postfixに変更することも考えましたが、とりあえずそのまま使います。


なお、上記フローに「まずはsendmailが使えるか確認しろ」と書いてあったので、sendmailで送信試験をしたところ、送れたり、送れなかったりしたので、最初いろいろ悩みました。遅れない場合、一度 /etc/init.d/sendmail restart で、sendmailを再起動してもよいかもしれません。



フロー通りに設定する

設定はここ通りに進めればよいのですが、幾つか変更点があります。


フローの確認

まず、全体の作業の流れはおおよそ下記のようなものです。

*. SESの設定が終わっている(前提)SPF, DKIMの設定+test mail送信済み

*. sendmailが動いている(前提)

を前提として、


  1. /etc/mail/authinfoの作成と編集(なかったので新規作成)

  2. /etc/mail/authinfo.dbの生成

  3. /etc/mail/accessの編集

  4. /etc/mail/access.dbの再生成

  5. /etc/mail/sendmail.mcの編集

  6. /setc/mail/sendmail.cfの再生成(とパーミッション変更)

  7. sendmailの再起動

  8. メール送信テスト

  9. (制限解除申請)

という感じ。


LOINGをPLAINに

例として、下記の表記がありますが、"M:LOGIN"のところを"M:PLAIN"にしました。

-AuthInfo:email-smtp.us-west-2.amazonaws.com "U:root" "I:USERNAME" "P:PASSWORD" "M:LOGIN"

+AuthInfo:email-smtp.us-east-1.amazonaws.com "U:root" "I:USERNAME" "P:PASSWORD" "M:PLAIN"


なお、例はオレゴンリージョンを利用していますが、サーバ名はリージョンに合わせて変更します。

私は、バージニア北部を利用したので、email-smtp.us-east-1.amazonaws.comを利用しました。



portを25から587に

sendmail.cfの設定時、例は25番ポートを使っていますが、587とかじゃないと動きません。

define(`SMART_HOST', `email-smtp.us-west-2.amazonaws.com')dnl

-define(`RELAY_MAILER_ARGS', `TCP $h 25')dnl
+define(`RELAY_MAILER_ARGS', `TCP $h 587')dnl
define(`confAUTH_MECHANISMS', `LOGIN PLAIN')dnl
FEATURE(`authinfo', `hash -o /etc/mail/authinfo.db')dnl
MASQUERADE_AS(`YOUR_DOMAIN')dnl
FEATURE(masquerade_envelope)dnl
FEATURE(masquerade_entire_domain)dnl


あと、挿入位置に注意が必要です。MAILER()定義の前に挿入する必要があります。



sendmail.cfのパーミッションは666ではなく、644

sendmail.cfのパーミッションが666だと怒られます。

-sudo chmod 666 /etc/mail/sendmail.cf

+sudo chmod 644 /etc/mail/sendmail.cf


再起動して送信テスト

手順どおりですが、sendmailの再起動を忘れずに。


制限解除申請

メールが問題なく送れているようなら、Sending Statisticsメニューを選択すると[Request a Sending Limit Increases]というボタンがあるので、クリックして制限解除申請を行います。


5時間後くらいに承認メールがきました。1万通/日, 10件/secで申請しましたが、5万件/日, 14件/secで承認されたようです。



参考サイト