エンジニアレポート

AWS SESを使ってメール送信でのスパム判定を回避する

2019年03月07日

こんにちは。DataStadiumの菅です。
実は10年以上前はISPでメール関連のエンジニアをやっており、日々大量のスパムメールと格闘していました。

そんな私ですが、最近、AWS EC2でpostfix立ててメール送信、みたいなことをやってるとGmailからほぼ100%スパム判定を受けております。DKIMはまだしも、SPFレコードを指定しておけばいいと思っていたのですが、どうやらAWSのEIPは、GmailのAnti-SPAMでほぼ100%の確率でSPAM判定を受けるようです。

残念ですね。

ということで、Amazon SESを使って上記を回避した例を紹介させていただきます。

そもそもAmazon SESとは

Amazon SES(Simple E-mail Service)は、AWSで提供されているクラウドベースの電子メール送信サービスです。

システムに通知メールやDM配送(いわゆるbulk配送)を実装したい場合に、専用の配信サーバやMTAを構築することなく、SESの配送APIなどを用いてメールを送信することが可能になります。高い配信性能とコスト効率(EC2からの送信だと毎月62,000通まで送信が無料!)を誇りますので、安定かつ安価なメール配信機能を実装できます。また、送信だけでなく特定アドレスでメールを受信して、AWS Lambdaの処理を実行するみたいな使い方もできるようです。

SES導入のパターン

お題) From: hogehoge.com(仮)でメールをSESから送信したい

  • hogehoge.comのメールサーバは存在している
     1. 既に存在するメールサーバの代替でSESからメール送信する
     
  • hogehoge.comのメールサーバは存在していない
     2. hogehoge.comのメールサーバとしてSESを利用する
     

基本的には、2の導入が基本線ですが、

 通常は、元からあるhogehoge.comのメールサーバから送信する
 ただし、system@hogehoge.comからのメールはSESから送信する

みたいな場合は、1での導入も可能です。
今回は、

 system@hogehoge.comからのメールはEC2に立てたpostfixから送る....
 がしかし、SPAM判定されたので、SESから送信する

という形になりました。

SESから送信するとSPAM判定されにくいのか?

オフィシャルによると、

Amazon SES には、送信者の評価の保護および強化に役立つ、コンテンツフィルタリングテクノロジー、専用 IP アドレス、評価ダッシュボードなどの機能が含まれています。

ということですが、上述したようにすぐにブラック判定されてしまうAWS EIPとは別に、専用のIPから配信されており、かつ、そのレピュテーションもダッシュボードで参照できるようになっています。

また、基本的にはエンベロープFromがAWSドメインでの送信となり、そちらのSPF/DKIM等の設定も問題無いようです。

SES導入のワークフロー

上記の形で導入する場合、以下のようなワークフローになります。

  1. Amazon SESの利用開始
  2. 送信元メールアドレスの決定
  3. 送信元メールアドレスの認証
  4. 自メール送信テスト
  5. 送信制限解除申請
  6. 利用開始
1.Amazon SESの利用開始

まずは、SESを利用開始します。
AWSの管理コンソールからSESを選択して利用開始すると、リージョンを選択することになります。

region

SESは現在(2019年2月20日現在)のところ
- 米国東部(バージニア北部)
- EU(アイルランド)
- 米国西部(オレゴン)
の3リージョンでしか提供されていません。

今回は米国東部(オレゴン)を選択しました。

2.送信元メールアドレスの決定

SESの利用開始後、まずは、送信元となるアドレスを決定しなければいけません。
今回のケースで言うと、

system@hogehoge.comをsender fromとしてメールを送信したい

ということなります。ですので、このアドレスからメールを送信することとします。

3.送信元メールアドレスの認証

次に、上記メールアドレスをSESで認証し利用できるようにします。
SESのメニューからIdentity Management -> Email Addressを選択します。

ses menu

次に、Verify a New Email Addressを実行します。

ses email01

モーダルダイアログで、認証したいアドレス(今回はsystem@hogehoge.com)を入力し、Verify This Email Addressを押します。

ses email02

すると、SESからsystem@hogehoge.com宛に認証用のメールが送信されます。

ses email03

メール内に記載されたURLをクリックすると、認証完了です。

ses email04

4.自メール送信テスト

次に、sandboxテストとして、system@hogehoge.comからのメール送信をテストします。ただし、外部に向けて送信ができないようになっているので、

 system@hogehoge.comから、system@hogehoge.com

つまり自分から自分に送信してのテストになります。

SESのコンソールで先ほどのIdentity Management -> Email Addressを選択すると、メールアドレスが認証済み(verified)となっているのが分かります。

ses email05

該当のメールアドレスを選択して、send a Test Emailを選択すると、メール送信テストができます。

ses email06

自分から自分に送るので、Toにもsystem@hogehoge.comを入力し、Subject:とBody:を適当に入力して、Send Test Emailすると、メールが配信されるハズです。

5.送信制限解除申請

自メール送信が確認できたら、次にAWSに対して送信制限の解除申請を行います。これを実施するまでは、外部に向けて送信ができません。

SESの管理コンソールから、Email Sending の Sending Statisticsを選択すると以下のような画面になります。

ses email07

Request a Sending Limit Increaseをクリックすると、AWSに解除申請を送るフォームに遷移します。

ses email08

フォームの設問と記入例ですが、以下のような感じでしょうか?

  • Q.メールの種類
    • A.システム通知
  • Q.私は明確にリクエストされた受信者にのみメールを送信します
    • A.はい
  • Q.バウンスや苦情を処理するプロセスがあります
    • A.はい
  • Q.リージョン
    • A.(今回の例)オレゴン
  • Q.Limit
    • A.希望する1日あたりの送信クォータ
    • A.(今回の例)1000通 ※ちなみに経験上、10000通とかにしても大丈夫でした。
  • Q.Case description
    • A.システム通知メッセージとしてEmailを利用。ユーザーへの自動応答など。

申請が受理されるとAWSから受理された旨のメールがきて、外部への送信が可能になります。先ほどのSend a Test Mailから、今度は適当な別アドレスをTo:に指定してテストメールを送信してみましょう。

受信が確認できたら、準備完了です。

利用開始

ここまででSES利用のための準備が整いました。
いよいよSESを利用したメール送信を実装しますが、方法はいくつか考えられます。

  1. SESにSMTP接続して送信する
  2. AWS APIを利用して送信する
  3. Postfixなどの自前で立てたメールサーバからRelayさせる
1.SESにSMTP接続して送信する

もっとも一般的かつ汎用性が高いのがこのやり方でしょうか。
SESの管理コンソールからEmail Sending → SMTP Settingsをクリックすると接続先SMTPサーバのFQDNやPortが確認できます。

ses email09

さらにCreate My SMTP CredentialsをクリックするとSMTP認証(SMTP-Auth)用のID/PasswordがDLできます。

これらの情報を基にメール送信プログラムを実装すれば、SESを利用したメール送信が実装できます。

2.AWS APIを利用して送信する

AWSCliでのメール送信例

aws --region us-west-2 ses send-email \
--to test@hogehoge.com --from system@hogehoge.com \
--subject "TEST MAIL" \
--text "THIS IS TEST MAIL"
3.Postfixなどの自前で立てたメールサーバからRelayさせる

最後はちょっと特殊ですが、すでに自前で立てたメールサーバでの送信を実装済みのアプリケーションで、実装を変更せずにSESからの送信に切り替える場合などでしょうか。

postfixの場合だと、master.cfを以下のように書き換えてあげます。

【main.cfの設定変更】

relayhost = [Amazon SESのホスト名]:587
smtp_sasl_auth_enable = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd

【sasl_passwdの作成】

[Amazon SESのホスト名]:587 SESユーザー名:SESパスワード

詳細は、以下のオフィシャルも参考にしてみてください。
https://docs.aws.amazon.com/ja_jp/ses/latest/DeveloperGuide/postfix.html

まとめ

SESは一度慣れてしまうと、非常に簡単に導入できます。
運用フェーズ移行後の「メールが届かない問題」に悩まされている方は、一度導入を検討することをお勧めします。

エンジニア募集中!

データスタジアムでは一緒に働いていただけるエンジニアを募集しています。野球、サッカー、バスケなどスポーツが好きな方であれば、とても面白い仕事ができる会社です。興味を持たれた方はぜひこちらをご覧ください。

エンジニアトップ エンジニアインタビュー エンジニアレポート

  • 採用情報
  • おしらせ
  • 掲載事例

ページトップヘ