LoopsのSPF・DKIM・DMARC設定。
Loops(loops.so)はAmazon SES上に構築されたアカウント単位の送信サービスです。そのため、ルートドメインに貼り付ける共有のSPF行も、DNSを代わりに編集してくれるウィザードもありません。代わりにSettings → Domainを開いてView recordsをクリックすると、Loopsがアカウント単位のDNSレコード一式を生成します。内容は、DKIMの3つのCNAMEと、専用のエンベロープサブドメインに置くSPFのTXTレコードおよびMXレコードです。これらをDNSホストにコピーし、Verify Recordsで確認します。Loopsは既定で、カスタムのMAIL FROM(Return-Path)をenvelope.yourdomain.comに用意します。そのためSPFとDKIMはどちらも最初から自社ドメインとアライメントが一致します。これにより、DMARCに成功し、Loopsのキャンペーンやトランザクションメールが受信トレイに届きます。
Loopsを認証すべき理由
Loopsのドメイン認証は形式的な作業ではありません。レコードの確認が済むまで、Loopsから自社ドメインとして送信することはできず、その確認こそが認証です。2024年2月以降、GmailとYahooは、すべての大量送信者(1日あたり約5,000通以上)に対し、SPF、DKIM、DMARCにアライメントが一致した状態で成功することを義務付けています。Microsoftも2025年に、大量送信者に同じ要件の適用を始めました。Loopsは共有のAmazon SESインフラ上で動作し、基盤となるSESアカウント、レピュテーション、送信上限を管理してくれます。そのため素のSESとは異なり、サンドボックスの操作や本番アクセスの申請は不要です。ただし、そのメールを自社ドメインに結び付ける認証レコードの公開は、自分で行う必要があります。レコードを追加して確認するまで、メールはSESの共有のamazonses.com鍵でしか署名されず、Fromドメインとはアライメントが一致せず、DMARCに失敗し、送信レピュテーションも未認証の他のSESテナントすべてと同じプールで扱われます。Loopsのレコード一式を公開すれば、これらがすべて一度に解決します。SESがd=yourdomain.comで署名してDKIMのアライメントが一致し、エンベロープのMAIL FROMによってSPFのアライメントも一致してDMARCに成功し、築いたレピュテーションは自社ドメインに蓄積されます。
LoopsにおけるSPFの実情
Loopsはアカウント単位のサービスで、include型ではありません。include:loops.soは存在せず、ルートドメインのSPFレコードにinclude:amazonses.comを追加することもありません。Loopsは代わりに、専用のサブドメインenvelope.yourdomain.comにカスタムのMAIL FROMを設定し、そこにSPFメカニズムを公開します。具体的には、ホストenvelopeに値v=spf1 include:amazonses.com ~allのTXTレコードを置き、同じホストenvelopeにfeedback-smtp.{region}.amazonses.comを指すMXレコードを1つ置きます。この2つのレコードは専用のエンベロープサブドメインにあり、ルートドメインには置かれません。そのため、ルートドメインのSPFレコードのDNSルックアップは1回も増えず、ルートドメインの既存のSPFレコードと衝突することもありません。Google WorkspaceやMicrosoft 365のSPF行に何かをまとめる必要はなく、そうすべきでもありません。またenvelope.yourdomain.comは表示されるFromアドレスと組織ドメインyourdomain.comを共有するため、SPFは緩和されたアライメントで自動的に一致します。これが素のAmazon SES設定との大きな違いです。LoopsがカスタムのMAIL FROMを設定してくれるので、amazonses.comに対してだけ成功するSPFではなく、最初からアライメントの一致したSPFが得られます。ルートドメインに1つだけ置くレコードは、DMARCです。
設定手順
- 1
ドメイン設定を開く
Loopsのダッシュボード(app.loops.so)で、歯車アイコン → Settings → Domainをクリックします。会社名と送信に使うドメインを入力し、DNSレコードの画面に進みます。
- 2
送信ドメインを選択
Loopsで送信に使うドメインを正確に入力します。ルートドメイン(yourdomain.com)か、send.yourdomain.comやupdates.yourdomain.comのようなサブドメインです。Loopsはまさにそのドメイン用に、DKIM、エンベロープのSPF/MX、DMARCのレコード一式を生成するため、何かをコピーする前に決めておいてください。
- 3
View recordsをクリック
レコード一覧(Settings → Domain → View records)を開きます。Loopsは各レコードをTypeの列(TXT、CNAME、MX)付きで表示します。各レコードは、わかりやすい名前(SPF、DKIM、MX)ではなくTypeに従って作成してください。名前は単なるラベルです。
- 4
DKIMのCNAMEレコードを3つ追加
Loopsの一覧には、DKIMの項目が3つ表示されます。形はホスト<token>._domainkey → 値<token>.dkim.amazonses.comです。それぞれ表示どおりCNAMEレコードとして追加します。TXTに変更しないでください。これらはローテーションするDKIM鍵をSESに委任するものなので、貼り付ける公開鍵はありません。
- 5
エンベロープサブドメインにSPFのTXTレコードを追加
ホストenvelope、値v=spf1 include:amazonses.com ~allでTXTレコードを追加します。これはenvelope.yourdomain.comに置くもので、ルートドメインには置きません。エンベロープサブドメインをAレコードやCNAMEレコードとして先に作成する必要はありません。そのホストラベルにTXTレコード(と次の手順のMXレコード)を追加するだけです。
- 6
エンベロープサブドメインにMXレコードを追加
ホストenvelope、優先度10、値feedback-smtp.{region}.amazonses.comでMXレコードを1つ追加します(リージョンはLoopsに表示される値に含まれています。例:us-east-1)。レジストラによって、優先度を別の欄に入力するものと、「10 feedback-smtp.…」のように値に含めるものがあります。管理画面の形式どおりに入力しないと確認に失敗します。
- 7
DMARCレコードをルートドメインに1つだけ置く
_dmarc.yourdomain.comに、v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.comで始まるTXTレコードを1つ公開(または維持)します。Loopsの一覧にもDMARCの項目がありますが、未設定の場合に備えたものにすぎません。必要なのはルートドメインの1つのDMARCレコードだけなので、2つにならないようにしてください。
- 8
CloudflareではCNAMEを「DNS only」にする
DNSがCloudflareにある場合は、DKIMの各CNAMEレコードを「DNS only」(グレーのクラウド)に切り替えます。オレンジのクラウドでプロキシが有効なCNAMEは*.dkim.amazonses.comに解決されず、DKIMは未確認のままになります。
- 9
LoopsでVerify Recordsをクリック
Loopsのドメインページに戻り、下部のVerify Recordsをクリックします。解決された行は緑になり、確認済みのチェックマークが付きます。DNSの反映は通常1時間以内ですが、最大24~48時間かかることがあります。それを過ぎても失敗するレコードがある場合、原因は反映ではなくDNSの設定ミスです。
- 10
テストメールを送信してヘッダーを確認
Loopsのドメインから実際にメールを送り、Gmailで開いて⋮ → Show originalを選びます。SPF: PASS(envelope.yourdomain.comを表示)、DKIM: PASS(d=yourdomain.com)、DMARC: PASSであることを確認します。いずれもamazonses.comではなく自社ドメインとアライメントが一致している必要があります。
追加するレコード
正確な値はLoopsのセットアップウィザードで生成されます。以下は、DNSホストに追加するレコードの形式を示したものです。
| タイプ | ホスト | 値 |
|---|---|---|
| CNAME | token1._domainkey | token1.dkim.amazonses.comDKIM鍵1の例です。トークンはアカウント固有なので、Loops → View recordsから正確なホストと値をコピーしてください。背後の鍵はSESがローテーションします。 |
| CNAME | token2._domainkey | token2.dkim.amazonses.comDKIM鍵2の例です(アカウント固有のトークンはLoopsのダッシュボードに表示されます)。 |
| CNAME | token3._domainkey | token3.dkim.amazonses.comDKIM鍵3の例です(アカウント固有のトークンはLoopsのダッシュボードに表示されます)。 |
| TXT | envelope | v=spf1 include:amazonses.com ~allカスタムのMAIL FROMのSPF:エンベロープサブドメインに置き、ルートドメインには置きません。ルートドメインのSPFレコードに追加されるルックアップは0回で、SPFのアライメントを自社ドメインと一致させます。 |
| MX | envelope | feedback-smtp.us-east-1.amazonses.comカスタムのMAIL FROMのMX:優先度は10です。リージョン(例:us-east-1)はLoopsに表示される値に含まれています。このサブドメインのMXレコードは1つだけにします。 |
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.comDMARCポリシー:ドメインごとに1つ、ルートドメインに置きます。p=noneで始め、quarantine/rejectへと引き上げます。 |
ルートドメインのSPF(v=spf1)のTXTレコードは1つだけにし、すべての送信元をこの1行にまとめてください。SPFレコードが2つあると、それ自体がエラーになります。
DNSルックアップの10回制限
SPFのDNSルックアップは10回までに厳格に制限されており、超えるとpermerrorを返して、どの受信側でも検証されなくなります。Loopsの設定がこの上限のうち何回を消費するかは、次のとおりです。
Loopsの推奨設定はルックアップを消費しません。10回すべてを、includeが必要な他の送信元に使えます。
DKIM
LoopsではDKIMが中心となるレコードです。Amazon SESのEasy DKIMで動作するため、手間は一切かかりません。Loopsは、token1._domainkey.yourdomain.com → token1.dkim.amazonses.comという形のCNAMEレコードを3つ生成します(token2、token3も同様)。3つすべてを、View recordsの画面に表示されたとおりCNAMEとして公開します。これらは貼り付けるTXTレコードではなくSESに委任するCNAMEなので、秘密鍵はLoopsとSESが保持し、DNSを編集し直さなくても、セレクターの背後で公開DKIM鍵をローテーションできます。コピーすべき公開鍵も、選ぶべき鍵長もありません。Loopsのメールはすべてd=yourdomain.comで署名されます。これがFromアドレスとのアライメントを一致させ、DKIMのアライメントでDMARCに成功するための条件です。トークンのホスト名はアカウント固有なので、他のドメインの値を流用せず、Loopsのダッシュボードからコピーしてください。DNSがCloudflareにある場合は、3つすべてを「DNS only」(グレーのクラウド)に設定します。そうしないと確認が完了しません。
DMARC
DMARCは、ルートドメインに設定する別のポリシーレコードで、Loopsが管理するものではありません。_dmarc.yourdomain.comに、v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.comで始まるTXTレコードを1つ追加します。p=noneは監視のみのため、Loopsのメールがアライメントの一致した状態で成功しているかを確認する間、配信には影響しません。Loopsのレコード一覧にもDMARCの項目がありますが、これは未設定の場合に備えたものです。必要なのはルートドメインの1つのDMARCレコードだけです。Google Workspace、Microsoft 365、または他の送信者向けにすでに公開しているなら、それを残してLoopsの分は追加しないでください(DMARCレコードが2つあると無効です)。Loopsの利点は、どちらかのメカニズムを選ばなくてよいことです。エンベロープのMAIL FROMがSPFのアライメントを、Easy DKIMがDKIMのアライメントを一致させるので、DMARCに成功する独立した経路が2つあります。1~2週間、集計レポート(rua)でLoopsがアライメントの一致した安定した送信元であることを確認したら、p=noneからp=quarantine、最終的にp=rejectへと段階的に引き上げます。
正しく設定できたか確認する
ダッシュボードだけで判断せず、実際のメールで確認してください。Loopsでは、Verify Recordsをクリックすると、ドメインページのすべての行に緑のチェックマークが付くはずです。次に、Loopsのドメインから自分宛てにテストメールを送り、Gmailで開いて⋮ → Show originalを選びます。SPF: PASS(amazonses.comだけでなくenvelope.yourdomain.comを表示)、DKIM: PASS(d=yourdomain.com)、DMARC: PASSと表示されていれば成功です。詳しいレポートが必要なら、check-auth@verifier.port25.com宛てにテストを送ると、全項目の結果がメールで返ってきます。Qualisendのドメイン診断でドメインをチェックし、DKIMの3つのCNAMEとエンベロープのSPF/MXが解決されることも確認できます。DMARCの集計レポートが届き始めたら、DMARCレポート解析にレポートをドロップしてください。Loops(Amazon SES経由)が、アライメントの一致した、成功している送信元として表示されるはずです。
よくある注意点
- 認証失敗の原因
レコードの置き場所は想像と異なります。SPFとMXのレコードはenvelope.yourdomain.comサブドメイン(LoopsのカスタムのMAIL FROM)に置くため、ルートドメインのSPFレコードに影響することも、衝突することもありません。include:amazonses.comはルートドメインのSPFレコードには絶対に追加しないでください。これはエンベロープサブドメイン専用で、ルートドメインでは何の役にも立たず、SPFのルックアップを消費するだけです。
- DNS設定
エンベロープサブドメインを事前に作成しないでください。envelopeのAレコードやCNAMEレコードを先に追加する必要はありません。そのホストラベルにSPFのTXTレコードとMXレコードを公開するだけで解決されます。
- DNS設定
MXレコードの優先度の形式でつまずきがちです。エンベロープのMXの優先度は10です。レジストラによって、優先度を別の欄に入力するものと、「10 feedback-smtp.…」のように値に含めるものがあります。管理画面の形式どおりに入力し、エンベロープサブドメインのMXは1つだけにしてください。
- DNS設定
わかりやすい名前ではなくTypeの列に従ってください。Loopsの各行には名前(SPF / DKIM / MX)が付いていますが、各レコードは実際のType(TXT、CNAME、MX)で作成する必要があります。DKIMのCNAMEをTXTで作成したり、SPFをCNAMEで作成したりするのが、Verify Recordsに失敗する最も多い原因です。
- DNS設定
Cloudflareのプロキシを有効にするとDKIMが機能しなくなります。DKIMのCNAMEレコード3つすべてを「DNS only」(グレーのクラウド)に設定してください。オレンジのクラウドでプロキシが有効なCNAMEは*.dkim.amazonses.comに解決されず、レコードは未確認のままになります。
- 認証失敗の原因
DMARCレコードはルートドメインに1つだけにしてください。Loopsの一覧にも未設定の場合に備えたDMARCの項目がありますが、同じドメインにDMARCレコードが2つあると無効です。他の送信者向けに_dmarc.yourdomain.comがすでにあるなら、それを残してLoopsの分は追加しないでください。
- 適用範囲
値はアカウント単位です。推測せずコピーしてください。DKIMのトークンと、MXのfeedback-smtpのリージョン(例:us-east-1)はLoopsのドメインごとに固有です。他のドメインや他のガイドの値を流用せず、View recordsの文字列を正確に貼り付けてください。
- 認証失敗の原因
ホスト名の重複と末尾のドットに注意してください。管理画面がドメインを自動で付加する場合は、ラベルだけ(envelope、token1._domainkey)を入力します。DNSホストがCNAME/MXの値にFQDNを求める場合は末尾にドットを付け、feedback-smtp.us-east-1.amazonses.comが…amazonses.com.yourdomain.comのように崩れるのを防ぎます。
SPFレコードを作成
Loopsでは、ルートドメインに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:はカウントされません。
送信ドメイン認証の設定が済んだら、次は検証済みのクリーンなリストへの配信です。
リストを検証LoopsのSPFに関するよくある質問
関連記事
トランザクションメール・APIの他のサービス
- MailerSend
- Mailgun
- Mailjet
- Mailtrap
- Mandrill (Mailchimp Transactional)
- Postmark
- Resend
- Scaleway Transactional Email
公開したら、ドメイン診断ですべてのレコードが正しく解決されることを確認し、DMARCレポート解析で自社ドメインを名乗って送信している送信元を把握します。作成ツールではすべての送信元を確認できます。ただし、認証は到達率対策の半分にすぎません。送信IPやドメインがブラックリストに掲載されていると、SPFの設定がどれほど適切でも迷惑メールに振り分けられます。そのため、ブラックリスト監視で掲載状況を確認しておくことをおすすめします。
認証の次は、リストをクリーンに保つ
SPF、DKIM、DMARCに成功すれば受信トレイに届き、クリーンなリストならその状態を維持できます。お手持ちのリストも検証してクリーニングできます。100クレジット無料、クレジットカード登録不要で始められます。