メールが届かない!DMARCエラーとSPF/DKIMのおはなし
はじめに
ある日、KINENBIのメールがエラーになって返ってきました。
550 5.7.26 Unauthenticated email from kinenbi.app is not accepted due to domain's DMARC policy. Please contact the administrator of kinenbi.app domain if this was a legitimate mail.
以前は正常に送れていたメールが突然届かなくなり、調査を進める中で「DMARC」や「SPF」「DKIM」といった、やや馴染みのない技術用語にたどり着きました。
本記事では、これらの用語について、可能な限りやさしく噛み砕いて紹介します。
DMARC?SPF?DKIM?
✉ メールって「お手紙」と同じ
メールを送るというのは、誰かに手紙を出すのと同じです。 でも、インターネットの世界には、ニセモノの手紙(スパムメールやなりすましメール)もたくさんあるのです。
だからこそ「これは本物の手紙です!」と証明するための仕組みが必要になります。
SPF(えすぴーえふ)
👮♂️「このポスト(サーバー)から出した手紙しか信用しないよ!」
これは「どのサーバーがこの差出人のメールを送ってよいか?」というルールです。
このポストから出した手紙ならOK!他のポストから出した手紙は怪しいよ!
DKIM(でぃーけーあいえむ)
🖊「ぼくのサインが入ってるから、この手紙は本物だよ!」
DKIMは「この人が本当にこの手紙を書いた」ということを電子署名で証明する仕組みです。
DMARC(でぃーまーく)
👩⚖️「SPFかDKIMが失敗したら、どうするかルールを決めよう!」
SPFやDKIMで怪しいと判断されたメールをどう扱うか、そのポリシーを決めるのがDMARCです。
DMARCのルール例
v=DMARC1; p=reject; aspf=s;
この設定が意味するのは、以下の通りです:
v=DMARC1
→ DMARCのバージョン(標準)p=reject
→ 認証に失敗したメールは完全に拒否aspf=s
→ SPFの差出人ドメインは完全一致でなければダメ
つまり、とても厳しいポリシーで、「ちょっとでも怪しかったらメールは届かないようにする」という設定です。
p=
の値(ポリシー)
DMARCの p=
は、メールが認証に失敗したときにどうするか?を指定します。
値 | 意味 | 処理の内容 |
---|---|---|
none |
通知だけ(何もしない) | 認証に失敗してもそのまま配信される。主にテスト用。 |
quarantine |
隔離 | 認証に失敗したメールは迷惑メールフォルダ行きの可能性あり。 |
reject |
拒否 | 認証に失敗したメールは完全に拒否される。本番運用向けの厳格な設定。 |
aspf=
の値(SPFアライメント)
DMARCでは、SPFが成功した場合でも、「どのドメインから送られてきたか」をさらに確認します。
この「From: のドメインと、SPFのドメインの一致具合」を制御するのが aspf=
です。
値 | 意味 | 判定ルール |
---|---|---|
r (relaxed) |
緩めの一致でOK | From: が mail.kinenbi.app 、SPFが kinenbi.app でもOK |
s (strict) |
完全一致のみOK | From: もSPFドメインも kinenbi.app 完全一致じゃないとNG |
よく使われる組み合わせ例
🔓 テスト運用中(ゆるめ)
v=DMARC1; p=none; aspf=r; rua=mailto:your@email.com
🟡 本番前の中間設定
v=DMARC1; p=quarantine; aspf=r; rua=mailto:your@email.com
🔒 本番環境での厳格設定
v=DMARC1; p=reject; aspf=s; rua=mailto:your@email.com
段階的に none → quarantine → reject
と移行していくのが安心です。
今回のエラー原因
いくつか設定を見直したので、どれが効いたかは正確ではないですが、下記対応をしました。
SPF設定の間違い修正
カスタムレコードが「kinenbi.app」ホストでSPFレコードが設定されていましたが、これは通常「@」または空白のホストに設定すべきものでした。
kinenbi.app v=spf1 include:_spf.firebasemail.com include:_spf.google.com ~all
↓
@ v=spf1 include:_spf.firebasemail.com include:_spf.google.com ~all
aspf=s → r に変更
From: support@kinenbi.app で送っている SPFは mailgun.kinenbi.app が認証成功してる → ドメイン名が完全一致じゃないのでNG!
おそらくこれが有力。
p=reject のまま。変更せず。
最終的にrejectで運用すべき。突然メールが届かなかったことからこちらは変更せずに修正しました。
おわりに
メールの世界は複雑で繊細ですね。
また一つ世界を知りました。それではまた!