コンテンツへスキップ

認証メールが届かない問題の 3 点セット — SPF・DKIM・DMARC を揃えて迷惑メール誤判定を解消する

認証メールが届かない問題の 3 点セット — SPF・DKIM・DMARC を揃えて迷惑メール誤判定を解消する

経緯

ユーザー登録時に送る認証メールが、海外の Gmail や Outlook に届かない(または迷惑メールに落ちる)問題が継続していた。調査した結果、wpmm.jp のドメインには SPF と DKIM は設定済みだったが、DMARC レコードが未設定だったことが最大の要因と判明した。

SPF・DKIM・DMARC それぞれの役割

SPF(Sender Policy Framework) は「このドメインからメールを送ってよい IP アドレス」を DNS に宣言する仕組みだ。受信サーバーは送信元 IP を SPF レコードと照合し、正規の送信元かを確認する。

DKIM(DomainKeys Identified Mail) はメール本文とヘッダーに電子署名を付与する。受信サーバーは公開鍵(DNS に登録)で署名を検証し、メールが改ざんされていないことと、署名したドメインの管理者が送ったことを確認する。

DMARC(Domain-based Message Authentication, Reporting and Conformance) は、SPF と DKIM の検証結果をもとに「アライメントが取れていないメールをどう扱うか」を受信サーバーに指示し、さらに集計レポートを特定のアドレスに送る仕組みだ。

DMARC が重要なのは、SPF と DKIM はそれぞれ独立した検証であり、どちらが通っても「送信元ドメインとの整合性」を DMARC なしに全体として判定できないからだ。Gmail をはじめとする主要メールプロバイダは、DMARC なしのドメインからのメールをより厳しく扱う傾向がある。

DMARC レコードの追加

wpmm.jp の DNS に次のレコードを追加した。

_dmarc.wpmm.jp  TXT  "v=DMARC1; p=none; rua=mailto:info@wpmm.jp"

p=none は「DMARC 検証に失敗したメールをポリシーで拒否・隔離はしないが、レポートは収集する」モードだ。最初から p=rejectp=quarantine にすると、DKIM アライメントが想定外にずれていた場合に正規メールがブロックされるリスクがある。p=none で様子を見ながらレポートを収集し、問題がなければ段階的に強化するアプローチが安全だ。

rua=mailto:info@wpmm.jp は集計レポート(Aggregate Report)の送信先。Google などの受信サーバーが定期的に「このドメインから送られたメールの SPF/DKIM 結果をまとめた XML」を送ってくれる。これにより正規メールが pass しているか、偽装スパムが fail しているかを機械的に確認できるようになった。

Xserver の権威 DNS と Google Public DNS の両方で伝播を確認してから稼働とした。

register_free.php の堅牢化

DMARC 追加と同時に、送信処理自体も見直した。

送信失敗の握り潰しを解消: mb_send_mail() は失敗時に false を返すが、これまで戻り値を確認していなかった。失敗してもユーザーには「送信しました」と表示され、サーバーログにも何も残らなかった。

// 修正前: 戻り値を無視
mb_send_mail($to, $subject, $body, $headers);
echo json_encode(['status' => 'ok']);

// 修正後: 失敗を検出してエラーを返す
if (!mb_send_mail($to, $subject, $body, $headers)) {
    http_response_code(500);
    echo json_encode(['status' => 'error', 'message' => 'メールの送信に失敗しました']);
    exit;
}

スパムスコアを下げるヘッダーの追加: Reply-ToDateMessage-ID の 3 つを明示的に付与した。

$headers .= "Reply-To: info@wpmm.jp\r\n";
$headers .= "Date: " . date('r') . "\r\n";
$headers .= "Message-ID: <" . uniqid('wpmm-', true) . "@wpmm.jp>\r\n";

Message-ID がないメールはスパムフィルターのスコアが上がりやすい。Date も RFC 5322 では必須ヘッダーだが、mb_send_mail() が自動付与しない場合があるため明示した。

変化

DMARC レコードの追加後、Google から info@wpmm.jp への集計レポートが届くようになった。現状は wpmm.jp から送られる正規メールはすべて DKIM アライメントが pass しており、偽装スパムは fail として検知されている。

到達性の問題は「対策した → 即改善が数値で見える」ものではなく、レピュテーションが積み上がるにつれて改善していく性質がある。DMARC によって、少なくとも「どのメールが通っているか通っていないか」を受動的ではなく能動的に把握できる状態になった。


関連記事: アプリを閉じても認証待ち画面に戻れる設計 — pending_email resume でメール認証の中断 UX を解消する