DMARCを監視モードで公開する
Fromアドレスのドメインの_dmarcにTXTレコードを1つだけ追加します。p=noneは配信に影響せず、ruaは受信側に集計レポートを依頼します。レポートには、どのサーバーがそのドメインとしてメールを送っているか、またアラインメントの取れたSPFまたはDKIMを通過しているかが示されます。レポートの送り先が別のドメインなら、そのドメインで受け取りを許可するレコードを公開する必要があります。
; DMARC record for example.com, monitoring only
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@example.com"
; Only if rua points to another domain, for example rua=mailto:reports@example.net,
; example.net publishes:
example.com._report._dmarc.example.net. TXT "v=DMARC1"
quarantineを経てrejectへ移行する
正規の送信元がすべて通過しているとレポートで確認できたらp=quarantineに切り替え、もう一度レポートを確認してからp=rejectに移行します。RFC 7489には、失敗したメールの一部にだけポリシーを適用するpctがありました。これを置き換えるRFC 9989は、部分的な値の扱いが受信側でばらついたためpctを廃止し、公開したポリシーより1段階弱く適用するよう求めるt=yを追加しています。RFC 7489に従う受信側はt=yを無視するため、テスト中はpct=0も併記してください。同じく1段階弱い扱いを求めることになります。本適用時は両方のタグを外します。
; Publish one version at a time, in this order, after p=none
; 1. Quarantine in test mode (t=y, plus pct=0 for RFC 7489 receivers), then in full
_dmarc.example.com. TXT "v=DMARC1; p=quarantine; t=y; pct=0; rua=mailto:dmarc-reports@example.com"
_dmarc.example.com. TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com"
; 2. Reject in test mode, then in full
_dmarc.example.com. TXT "v=DMARC1; p=reject; t=y; pct=0; rua=mailto:dmarc-reports@example.com"
_dmarc.example.com. TXT "v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com"
SPFレコードはドメインごとに1つ
1つの名前に置けるv=spf1で始まるTXTレコードは1つだけです。2つあるとSPFは恒久的なエラーで失敗します。すべての送信元を1つのレコードにまとめてください。include:はプロバイダー自身のレコードを確認し、redirect=はポリシー全体を別のドメインに委ねます。複数のドメインで1つのポリシーを共有するときに便利です。レコードにallも含まれていると、redirect=は無視されます。
; Before: two SPF records on one name (permerror)
example.com. TXT "v=spf1 include:_spf.mailhost.example ~all"
example.com. TXT "v=spf1 include:spf.newsletter.example ~all"
; After: one record
example.com. TXT "v=spf1 include:_spf.mailhost.example include:spf.newsletter.example ~all"
; Another domain that uses the same policy
example.org. TXT "v=spf1 redirect=example.com"
DNSルックアップは10回まで
SPFでは、DNSルックアップが必要な項目(include、a、mx、ptr、exists、redirect)は、入れ子のincludeも含めて合計10個までです。1つでも超えるとSPFは恒久的なエラーで失敗します。使わなくなったサービスのincludeを削除し、aとmxを自分で管理するip4またはip6の範囲に置き換え、ptrを外し、大量配信のサービスは専用のSPFレコードを持つサブドメインに移してください。プロバイダーのアドレスをレコードに直接書き写してもルックアップは減りますが、プロバイダーがアドレスを変えると古くなります。このチェッカーが数えるのは最上位の項目だけです。
; One lookup each: include, a, mx, ptr, exists, redirect (plus every lookup inside an include)
; No lookup: ip4, ip6, all
; Before: 4 lookups in the top-level record alone
example.com. TXT "v=spf1 a mx include:_spf.mailhost.example include:spf.oldtool.example ~all"
; After: fixed address, unused service removed, bulk mail on its own subdomain
example.com. TXT "v=spf1 ip4:192.0.2.10 include:_spf.mailhost.example ~all"
news.example.com. TXT "v=spf1 include:spf.newsletter.example ~all"
~allと-allは慎重に選ぶ
レコードの末尾は~all(softfail)か-all(fail)にし、どのサーバーでも通過させる+allは使わないでください。-allのほうが強い指定ですが、SPFを早い段階で確認する受信側は、DMARCが有効なDKIM署名を確認する前に転送メールを拒否することがあります。DMARCポリシーを適用しているなら、~allにすると判断をDMARCに任せられます。メールを送らないドメインはv=spf1 -allを公開できます。
; Choose one ending for example.com, not both
example.com. TXT "v=spf1 include:_spf.mailhost.example ~all"
example.com. TXT "v=spf1 include:_spf.mailhost.example -all"
; A domain that sends no mail
example.net. TXT "v=spf1 -all"
DKIMをFromドメインとアラインさせる
DMARCは、Fromアドレスとアラインしたドメインについて、SPFまたはDKIMが通過すれば合格です。多くのサービスは既定で自社のドメインで署名するため、DKIMは通過してもアラインメントは取れません。各サービスで自分のドメインによる署名を有効にして署名にd=example.comが入るようにし、サービスが示す鍵またはCNAMEをそのセレクターの下に公開してください。既定の緩いアラインメントでは同じ組織ドメインのサブドメインも一致とみなされ、adkim=sとaspf=sでは完全一致が必要です。
; Key for a sending service, selector s1: a CNAME or a TXT record, as the service says
s1._domainkey.example.com. CNAME s1.dkim.mailhost.example.
s1._domainkey.example.com. TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOC..."
; Aligned signature in a delivered message: d= matches the From domain
From: news@example.com
DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=s1; ...
DNSの変更がすべてのリゾルバーに届くまで、古いレコードのTTLと同じだけ時間がかかることがあります。その後、Fromアドレスのドメインでチェッカーを再実行してください。チェッカーは入力したホスト名そのものを読みます。