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が動いている(前提)
を前提として、
- /etc/mail/authinfoの作成と編集(なかったので新規作成)
- /etc/mail/authinfo.dbの生成
- /etc/mail/accessの編集
- /etc/mail/access.dbの再生成
- /etc/mail/sendmail.mcの編集
- /setc/mail/sendmail.cfの再生成(とパーミッション変更)
- sendmailの再起動
- メール送信テスト
- (制限解除申請)
という感じ。
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で承認されたようです。