18
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-04-28

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で承認されたようです。

参考サイト

18
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?