【AWS】SESをキャリアメールに対応させるためにやったこと

AWS Cognitoを使っていてMFAの認証コード送信をemailを対象に飛ばしています。

その際、困ったことにキャリア(au, softbank, docomo)へのメールのバウンス率が高いとのお達しがあり、SESの設定周りでできる限り対処したことをメモしておきます。

CognitoではデフォルトSESがあたっています。これだとバウンス率が5%を超えるとアラートメールが送信されてくるようになり、10%を超えると使用不可となるような制約があるようです。

なので今回はCognito用にカスタマイズSESを用意しRoute53にてドメインも取得している前提で設定内容を備忘録としてまとめました。

メール設定に必要となるキーワードをおさえておく

まず、設定をすすめる上で理解しておくべきキーワードを説明します。

MTA(Mail Transter Agent)

ネットワーク上でメールを転送するソフトウェア。
MTAはメールを受け取って次の配信先を決定するのが役割。実際の送信はMDA(Mail Delivery Agent)が担う。
MTA間のメールの送受信にはSMTP(Simple Mail Transger Protoco)という通信プロトコルが標準的に用いられる。

SPF(Sender Policy Framework)えすぴーえす

電子メールの送信元ドメインが詐称されていないかをチェックする仕組み。
SMTP(Simple Mail Transger Protoco)はFromアドレスを自由に設定することが可能。そのため「なりすましメール」を簡単に送信することが可能となる。
こうした「なりすまし」を防ぐためにDNSを利用する。ドメインをSPFに対応させるには、そのドメインのゾーンデータにSPFレコードを追加する。SPFレコードにはそのドメイン名を送信元としてメールを送っても良いIPアドレス等を記載する。
受信側は送信元のドメインのSPFレコードをDNSに問い合わせることで送信ドメインに詐称がないかをチェックする。
※認証情報としてIPアドレスを使う。

DKIM(DomainKeys Identified Mail)でぃーきむ

送信側メールサーバの公開鍵をDNSサーバに登録しておき、送信時に自身の秘密鍵による電子署名をつけてメール送信する。受信側メールサーバは、メールヘッダから特定したドメインのDNSサーバから公開鍵を取得し、電子署名を検証する。この検証によってなりすましやメールの改ざんの有無を確認できる。
※電子署名で認証をおこなう。

DMARC(Domain-based Message Authentication , Reporting and Conformance)でぃーまーく

SPFおよびDKIMをベースにしており、送信元アドレスドメインがなりすまされていないか、信頼できるものかどうかを判断することができる最初の標準技術。
SPFおよびDKIMをパスしたあとに送信者は以下のいずれかを指定できる。
モニター(none):認証に失敗したすべてのメッセージを可視化するために、メール認証エコエコシステムにレポートを送る。メッセージはそのまま配信される
メッセージを隔離(quarantine):DMARCに失敗したメッセージをスパムフォルダーなどに隔離する
メッセージを拒否(reject):DMARCに失敗したメッセージを拒否する (メールは配信されません)

※配信後にメールプロバイダーがフィルターを適用する

SES Domainsの設定

やることは下記4つ。

1.DKIMの設定

ここがすごく参考になります。

https://dev.classmethod.jp/articles/cognito-fromaddress-customize-route53/

2.カスタムのMAIL FROM Domainを設定

SES→Domains→MAIL FROM Domain→「Set MAIL FROM Domain」ボタン押下

カスタムMAIL FROM ドメインはメール送信元のドメインではダメ、といった制約もあるのでサブドメインで設定をおこなうこと。

「Set MAIL FROM Domain」ボタン押下。
MXおよびSPFレコードを含むウィンドウが表示されるので
・MX Record
・SPF Decord
・Hosted Zones
にチェックを入れて「Create Record Sets」押下。

5分ほど待って
MAIL FROM domain statusがverifiedになればOK。

3.DMARCポリシーの設定

Rouote53にいって対象のホストゾーンを選択

新規にレコードを作成

[レコード名] _dmarc.example.com
[レコードタイプ] TXT
[値] “v=DMARC1;p=quarantine;pct=25;rua=mailto:dmarcreports@example.com"
※example.comの部分を任意のドメインにする

まとめ

これらが設定できたら、
Domains一覧から対象のドメインを選択して「Send a Test Email」から送信してみる。

例えばGmailで受信すると「メッセージのソースを表示」からメールの詳細情報を確認することができる。

その項目に下記があることが確認できるはず

SPF: PASS with IP XX.XXX.XX.X 
DKIM: 'PASS’ with domain example.com
DMARC: 'PASS’

※青の部分が環境ごとに異なる

ここまで設定できてたらキャリアであっても基本メールは送れる、はず。

ただ、各キャリアで異なるフィルタリングをかけているのでなんとも言えませんが。

これでもバウンス率がおさえられないようであれば、どのキャリアで、どいうったことが原因で到達できていないか、をパケットレベルで解析・調査していくしかないですね。

Cognito、SESを使われる方々の手助けになれば。

それでは、また。