Help us understand the problem. What is going on with this article?

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

参考サイト

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした