Amazon SESのSPF・DKIM・DMARC設定。
Amazon SESは「アカウント単位」の送信サービスです。ルートドメインに貼り付ける共有のSPFの行はなく、DNSを管理してくれるドメイン認証ウィザードもありません。自社ドメインを確認してEasy DKIMを有効にすると、SESがアカウント単位のCNAMEレコードを3つ生成します。SESのデフォルトのエンベロープ送信者はamazonses.com上にあるため、SPFのアライメントも自社ドメインと一致させたい場合は、任意でカスタムMAIL FROMサブドメインを追加します。DKIMのCNAMEレコードが解決されると、SESはすべてのメールにd=yourdomain.comで署名するので、SPFに手を付ける前でも、DKIMのアライメントによってDMARCに成功します。
Amazon SESを認証すべき理由
SESは到達率の高い送信インフラをそのまま提供しますが、MailchimpやSendGridのウィザードのように認証を代行して公開することは意図的にしていません。その作業は利用者が担うものであり、これを省略していることが、SESのメールが迷惑メールに振り分けられやすい原因です。2024年2月以降、GmailとYahooは、すべての大量送信者(1日あたり約5,000通以上)に対し、SPF、DKIM、DMARCにアライメントが一致した状態で成功することを義務付けています。Microsoftも2025年に、要件を満たさないメールの拒否を始めました。Easy DKIMを有効にせずにSESで送信すると、メールには共有のamazonses.comの鍵による署名しか付きません。自社ドメインとアライメントが一致するものがなく、DMARCに失敗し、レピュテーションも他の未認証のSESテナント全体と共有されます。Easy DKIMを有効にすれば、この問題の核心を一度に解決できます。SESがd=yourdomain.comで署名し、DKIMのアライメントが一致して、DMARCに成功し、築いた送信レピュテーションは自社ドメインに蓄積されます。さらにカスタムMAIL FROMドメインを設定すれば、SPFのアライメントを重視する受信側のために、その一致も上乗せできます。
Amazon SESにおけるSPFの実情
Amazon SESはアカウント単位のサービスであり、「include」方式のサービスではありません。ほとんどの場合、ルートドメインのSPFレコードに追加すべきinclude:amazonses.comはなく、そこに追加すべきでもありません。SESはデフォルトで、エンベロープのMAIL FROM(Return-Path、バウンス先アドレス)をamazonses.comのサブドメインに設定します。そのためSPFはamazonses.comが公開するレコードに対してチェックされ、自動的に成功します。ただし成功するのはamazonses.comに対してであり、自社ドメインに対してではありません。つまり「アライメントが一致」した状態ではなく、それだけではDMARCには何の効果もありません。これは仕様であり、問題ありません。Easy DKIMが、DKIMのアライメントによってDMARCの成功を支えるからです(SESはd=yourdomain.comで署名します)。SPFのアライメントも自社ドメインと一致させたい場合は、カスタムMAIL FROMサブドメイン(例:mail.yourdomain.com)を設定し、v=spf1 include:amazonses.com ~allと、feedback-smtp.{region}.amazonses.comを指すMXレコードを1つ公開します。これは念のための保険ですが、SPFのアライメントを重視する受信側もあるため有用です。重要なのは、この2つのレコードをMAIL FROMサブドメインに置き、ルートドメインのSPFレコードには決して追加しないことです。ルートドメインのSPFレコードはそのままで、SESによってDNSルックアップが消費されることもありません。include:amazonses.comが登場するのは、その専用サブドメインだけです。
2つの設定方法
Easy DKIM:3つのCNAME(推奨)
- SESが2048ビットのRSA鍵ペアを生成します。利用者は、鍵をSESに委任する3つのCNAMEトークンを公開します
- 秘密鍵はSESが保持してローテーションします。生成、保管、バックアップ、ローテーションのいずれも不要です
- 3つのCNAMEレコードを公開するだけで、ドメインIDの確認とDKIM署名の有効化を1回で行えます
- d=yourdomain.comのアライメントがそのまま機能するので、SPFレコードを変更しなくても、DKIMによってDMARCに成功します
BYODKIM:1つのTXTレコード(独自の鍵を使用)
- RSA鍵を自分で生成し(1024~2048ビット、PKCS#1またはPKCS#8、base64/PEM)、公開鍵を含むselector._domainkeyのTXTレコードを1つ公開します
- ポリシー上、鍵を自社で管理する必要がある場合や、複数のサービスやリージョンで1つの鍵を再利用したい場合に便利です
- 鍵の保管とローテーションは利用者の責任です。SESが秘密鍵を見ることはありません
- DNSレコードは3つではなく1つで済みますが、鍵の自動ローテーションはありません
設定手順
- 1
ドメインIDを作成(または開く)
console.aws.amazon.com/sesでSES consoleを開き、Configurationの下でIdentities → Create identity → Domainを選びます。yourdomain.comを入力します。ドメインがすでにある場合は、それを開いてAuthenticationタブを使用します。
- 2
Easy DKIMをRSA_2048のままにする
Advanced DKIM settingsで、Identity type = Easy DKIM、DKIM signing key length = RSA_2048_BITのままにします(デフォルトで、より強力な選択肢です。RSA_1024_BITは強度の低い従来方式の設定にすぎません)。DKIM signatures = Enabledになっていることを確認します。独自の鍵を用意する必要がある場合にのみ、BYODKIMを選びます。
- 3
(任意)カスタムMAIL FROMドメインを設定
IDのページでCustom MAIL FROM domainのペインを開き → Edit → 「Use a custom MAIL FROM domain」にチェックを入れ、専用のサブドメイン(他の用途には使わないもの、例:mail.yourdomain.com)を入力します。DNSが反映されるまでの間、Behavior on MX failureは「Use default MAIL FROM domain」に設定します。
- 4
3つのDKIM CNAMEレコードを追加
SESには、token1._domainkey → token1.dkim.amazonses.comの形式のレコードが3つ表示されます(token2、token3も同様)。それぞれ表示どおりにCNAMEレコードとして追加します。これらを公開すると、ドメインの確認とDKIM署名の有効化の両方が完了します。Easy DKIMで貼り付けるTXTレコードはありません。
- 5
MAIL FROMのMXレコードとSPFレコードを追加(カスタムMAIL FROMを有効にした場合のみ)
MAIL FROMサブドメインに、優先度10、値がfeedback-smtp.{region}.amazonses.com(リージョン固有、例:us-east-1)のMXレコードを1つと、v=spf1 include:amazonses.com ~allのTXTレコードを1つ追加します。どちらもルートドメインではなく、mail.yourdomain.comに置きます。
- 6
DMARCレコードを公開(既存なら1つのまま)
_dmarc.yourdomain.comに、v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.comで始まるTXTレコードを追加します。_dmarcレコードはドメイン全体で1つだけにし、SES用に2つ目を追加しないでください。
- 7
CNAMEレコードのCloudflareのプロキシをオフにする
DNSがCloudflareにある場合は、DKIMの各CNAMEレコードを「DNS only」(グレーのクラウド)に設定します。プロキシが有効なオレンジのクラウドのCNAMEレコードは*.dkim.amazonses.comに解決されず、DKIMの確認が保留のまま進まなくなります。
- 8
SESがレコードを検出するのを待つ
コンソールに戻ると、DKIMのステータスがVerified/Successfulに変わり、設定した場合はカスタムMAIL FROMの状態がSuccessに変わります。検出は通常数分ですが、SESでは最大72時間かかる場合があります。それぞれ完了するとSESからメールが届きます。
- 9
本番アクセスをリクエスト(サンドボックスから出る)
新規アカウントはSESのサンドボックスから始まり、確認済みアドレスにしか送信できず、上限は1日200通、1秒あたり1通です。Account dashboardでRequest production accessを選んでください。そうしないと、DNSがどれほど完璧でも実際のメールは送信されません。
- 10
テストメールを送信してヘッダーを確認
そのドメインのアドレスから実際のメールを送り、Gmail → Show originalで開きます。DKIM: PASS(d=yourdomain.com)、SPF: PASS、DMARC: PASSを確認します。
追加するレコード
正確な値はAmazon SESのセットアップウィザードで生成されます。以下は、DNSホストに追加するレコードの形式を示したものです。
| タイプ | ホスト | 値 |
|---|---|---|
| CNAME | token1._domainkey | token1.dkim.amazonses.comEasy DKIM鍵1:トークンはアカウントとリージョンごとに固有で、SESがその背後の鍵をローテーションします |
| CNAME | token2._domainkey | token2.dkim.amazonses.comEasy DKIM鍵2(アカウント単位のトークン) |
| CNAME | token3._domainkey | token3.dkim.amazonses.comEasy DKIM鍵3(アカウント単位のトークン) |
| MX | feedback-smtp.us-east-1.amazonses.comカスタムMAIL FROMのみ:優先度10、リージョン固有のホスト。このサブドメインのMXレコードは1つだけにします | |
| TXT | v=spf1 include:amazonses.com ~allカスタムMAIL FROMのみ:置き場所はMAIL FROMサブドメインで、ルートドメインのSPFレコードではありません | |
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.comDMARCポリシー:1つのドメインにつき1つだけにし、p=noneから始めます |
ルートドメインのSPF(v=spf1)のTXTレコードは1つだけにし、すべての送信元をこの1行にまとめてください。SPFレコードが2つあると、それ自体がエラーになります。
DNSルックアップの10回制限
SPFのDNSルックアップは10回までに厳格に制限されており、超えるとpermerrorを返して、どの受信側でも検証されなくなります。Amazon SESの設定がこの上限のうち何回を消費するかは、次のとおりです。
Amazon SESの推奨設定はルックアップを消費しません。10回すべてを、includeが必要な他の送信元に使えます。
DKIM
DKIMはSESの要となるレコードで、Easy DKIMを使えば手間がかかりません。有効にすると、SESが2048ビットのRSA鍵ペアを生成し(コンソールのデフォルトはRSA_2048で、1024ビットは強度の低い従来方式の選択肢にすぎません)、3つのトークンが発行されます。これらをCNAMEレコードとして公開します。token1._domainkey.yourdomain.com → token1.dkim.amazonses.comのようになり、token2とtoken3も同様です。なお、鍵の長さによって保存する内容は変わりません。1024と2048のどちらを選んでも、Easy DKIMが公開するのは常に3つの短いCNAMEレコードです。実際の公開鍵はCNAMEの先のSES側にあり、自社のゾーンにはないからです。貼り付けるTXTレコードではなくCNAMEレコードでSESに委任するため、秘密鍵はSESが保持し、これらのセレクターの背後で公開する鍵をローテーションできます。その際にDNSを再度編集する必要はありません。すべてのメールにd=yourdomain.comで署名され、これによってDMARCのアライメントが一致します。現在のSES consoleでは、このCNAMEレコードの公開がドメインIDの確認(DKIMによる確認)も兼ねるため、通常は別途_amazonsesのTXTトークンを追加する必要はありません。注意点が2つあります。Cloudflareでは、CNAMEレコードを「DNS only」(グレーのクラウド)にする必要があります。また、SESのIDはAWSリージョン単位なので、2つ目のリージョンから送信すると、そのリージョン独自の3つのトークンが生成され、それらも公開する必要があります。CNAMEレコードを使えない場合の代替手段がBYODKIMです。自分で鍵を生成し、公開鍵を含むselector._domainkeyのTXTレコードを1つ公開します(この場合、2048ビットの鍵ではTXTの値が長くなり、DNSホストによっては複数の文字列に分割します)。ただし、ローテーションは自分で管理することになります。
DMARC
DMARCは、ルートドメインに設定する別のポリシーレコードです。SESが代わりに公開するものではありません。_dmarc.yourdomain.comに、v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.comで始まるTXTレコードを1つ追加します。p=noneは監視のみのため、SESのメールがアライメントの一致した状態で成功していることを確認している間、配信には影響しません。SES特有の注意点があります。SESのデフォルトのエンベロープのMAIL FROMはamazonses.comのサブドメインなので、SPFチェックには成功しても、自社ドメインとアライメントは一致しません。そのためデフォルトのSES構成では、DMARCの成功はすべてDKIMのアライメントに依存します。つまり、ポリシーを引き上げる前に、Easy DKIM(またはBYODKIM)を有効にして確認を済ませておく必要があります。DKIMが無効で、デフォルトのMAIL FROMを使うSES構成では、DMARCに完全に失敗します。1~2週間、集計レポート(rua)でSESがアライメントの一致した安定した送信元であることを確認できたら、p=noneからp=quarantine、最終的にp=rejectへと段階的に引き上げます。カスタムMAIL FROMドメインも設定すれば、さらにSPFのアライメントも得られ、それぞれ独立した2つの方法で成功できるようになります。送信元がいくつあっても、_dmarcレコードはドメイン全体で1つだけにし、SES用に2つ目を追加しないでください。
正しく設定できたか確認する
コンソールのバッジだけで判断せず、実際のメールで確認してください。SESでは、IDのDKIMステータスがVerified/Successfulになっていること、設定した場合はカスタムMAIL FROMの状態がSuccessになっていることを確認します。次に、そのドメインのアドレスから自分宛てにテストメールを送り、Gmailで開いて⋮ → Show originalを選びます。DKIM: PASSにd=yourdomain.com(amazonses.comではない)が示され、DMARC: PASSと表示されていれば成功です。SPF: PASSは、カスタムMAIL FROMを設定していればそのサブドメインに対して、設定していなければamazonses.comに対して表示されます。amazonses.comの場合は想定どおりで、DKIMが支えるためDMARCには成功するので、失敗として扱わないでください。Qualisendのドメイン診断でドメインをチェックし、3つのDKIM CNAMEレコードと、使用している場合はMAIL FROMのMXレコードとSPFレコードが解決されることを確認します。DMARCの集計レポートが届き始めたら、DMARCレポート解析にレポートをドロップします。SESは、アライメントの一致した、成功している送信元として表示されるはずです。
よくある注意点
- DNS設定
SESはリージョン単位です。ID、3つのDKIMトークン、feedback-smtpのMXホストは、すべて1つのAWSリージョンに紐づきます。us-east-1とeu-west-1の両方から送信する場合、各リージョンが独自の3つのDKIM CNAMEレコードとリージョン別のMXレコードを発行します。すべてのリージョンのレコードを公開してください。そうしないと、未設定のリージョンからのメールは認証されません。
- 適用範囲
新規アカウントはサンドボックスから始まります。Request production accessを行うまで、SESは確認済みの受信者にしか配信せず、上限は1日200通、1秒あたり1通です。サンドボックスのままなら、DNSが完璧でも意味がありません。
- 適用範囲
SPFのアライメントは自動ではなく、任意で設定するものです。デフォルトのエンベロープはamazonses.comのサブドメインなので、SPFチェックには成功してもアライメントは一致せず、DMARCの成否はすべてDKIMに依存します。「SPF: amazonses.com」と表示されるのは正常です。SPFのアライメントも一致させたい場合にのみ、カスタムMAIL FROMを設定してください。
- 認証失敗の原因
ルートドメインのSPFレコードにinclude:amazonses.comを追加しないでください。置き場所は、カスタムMAIL FROMサブドメインだけです。ルートドメインでは何の役にも立たず、SPFの10回のルックアップのうち1回を無駄に消費します。
- 適用範囲
MAIL FROMサブドメインのMXレコードは1つだけにします。そのサブドメインに複数のMXレコードがあると、SESのカスタムMAIL FROM設定は失敗します。他のメールの送受信には使わない専用のサブドメイン(mail.やbounce.)を使ってください。
- DNS設定
CloudflareのプロキシはDKIM認証を妨げます。3つのCNAMEレコードをすべて「DNS only」(グレーのクラウド)に設定してください。プロキシが有効なオレンジのクラウドのCNAMEレコードは*.dkim.amazonses.comに解決されず、IDは保留のままになります。
- 認証失敗の原因
レジストラでのホストの重複と末尾のドット:管理画面がドメインを自動で付加する場合は、完全なFQDNではなくラベルだけ(token1._domainkey、mail)を入力します。また、MXやCNAMEの値にFQDNを求めるホストでは末尾にドットを付けてください。そうしないと、feedback-smtp.us-east-1.amazonses.comが...amazonses.com.yourdomain.comのように変わってしまいます。
- 適用範囲
「Behavior on MX failure = Reject message」は初期段階では危険です。DNSの反映中(またはMXレコードが解決されなくなったとき)に、Rejectではすべてのメールがバウンスします。状態がSuccessになるまで、「Use default MAIL FROM domain」のままにしてください。
SPFレコードを作成
Amazon SESでは、ルートドメインにSPFのinclude:を追加する必要はありません。作成ツールを使って他の送信元用のクリーンなレコードを1つ組み立て、1行に収めてください。
送信元
メールの送信に使っているサービスを検索して、それぞれチェックを入れてください。
上の検索欄で利用中のメールサービスを検索するか、してください。
このドメイン自身のサーバー
ドメインが(上記のサービスを経由せず)直接メールを送信する場合は、ドメイン自体を許可します。
その他の送信元・IP
リストにないもの(別のサービスのSPFホストや特定のIPアドレス)を追加します。
接頭辞のinclude:は自動で付加されます。サービスのドキュメントに記載されているホスト名を入力してください。
その他すべての送信元へのポリシー
上記に記載されていないサーバーからのメールを、受信側がどう処理すべきかを指定します(allメカニズム)。
送信元がまだないため、すべてのメッセージに~allポリシーが適用されます。ステップ1で利用中のサービスを追加してください。
- ルートドメインにTXTレコードとして公開します。ホストは@(ドメインそのもの)、値は上記の文字列全体です。
- SPFレコードは1つのドメインにつき1つだけにします。すべての送信元をこの1行にまとめてください。v=spf1で始まるTXTレコードが2つあると、両方とも無効になります。
- DNSルックアップは10回以内に収めてください。include:、a、mxはそれぞれ1回とカウントされ、includeは内部でさらにルックアップを発生させることがあります。ip4:とip6:はカウントされません。
送信ドメイン認証の設定が済んだら、次は検証済みのクリーンなリストへの配信です。
リストを検証Amazon SESのSPFに関するよくある質問
関連記事
トランザクションメール・APIの他のサービス
すべてのSPFガイド公開したら、ドメイン診断ですべてのレコードが正しく解決されることを確認し、DMARCレポート解析で自社ドメインを名乗って送信している送信元を把握します。作成ツールではすべての送信元を確認できます。ただし、認証は到達率対策の半分にすぎません。送信IPやドメインがブラックリストに掲載されていると、SPFの設定がどれほど適切でも迷惑メールに振り分けられます。そのため、ブラックリスト監視で掲載状況を確認しておくことをおすすめします。
認証の次は、リストをクリーンに保つ
SPF、DKIM、DMARCに成功すれば受信トレイに届き、クリーンなリストならその状態を維持できます。お手持ちのリストも検証してクリーニングできます。100クレジット無料、クレジットカード登録不要で始められます。