Notes / Web技術

mail-tester 7/10の真因はSPF includeのTEMPERROR。1行消して10/10に

Google Workspace + Xサーバー環境でmail-testerを回すと7/10になり「You are not allowed to use one of your sender email addresses (-3)」と指摘される。SPFレコード内のincludeがDNS lookupタイムアウトしている時のTEMPERRORが真因で、不要なincludeを1行削るだけで10/10になる、移行直後によくある落とし穴。

mail-tester SPF DNS email authentication

DNSをXサーバーからCloudflareに移した直後、念のため mail-tester.com でメール認証スコアを計測したら 7/10 が出ました。「Good stuff. Your email is almost perfect」というメッセージとともに、減点項目に「You are not allowed to use one of your sender email addresses (-3)」。

掘り下げると、犯人は SPFレコード内の include:spf.sender.xserver.jp で、これがDNS lookupタイムアウトを起こしてSPF評価全体がTEMPERRORと判定されていました。Web移行とセットでSPFレコードも簡素化したら、1行消すだけで10/10まで届きます。

出発点: 7/10とDMARC警告

mail-tester 7/10の評価内訳。

項目判定
SpamAssassin likes you
You are not allowed to use one of your sender email addresses-3
Your SPF signature is valid
Your message passed the DMARC test
Your hostname is assigned to a mail server
Your message could be improved
You’re not blocklisted
No broken links

不思議なのは「SPF signature is valid」「DMARC test passed」と同時に「-3 sender email addresses」が出ているところ。SPFもDMARCもpassしているなら、なぜ「許可送信元ではない」と言われるのか。

-3を開いて初めて分かるTEMPERROR

詳細を展開すると、こう書かれていました。

[SPF] <own-domain> does not allow your server <google-smtp-ip> to use <user>@<own-domain>

そして下の方のVerification detailsに、決定的な行が。

spfquery --scope mfrom --id <user>@<own-domain> --ip <google-smtp-ip> --helo-id <google-smtp-host>:
  temperror
  <own-domain> ... spf.sender.xserver.jp: Time-out on DNS 'TXT' lookup of 'spf.sender.xserver.jp'

temperror。SPF評価で spf.sender.xserver.jp のTXTレコードを引きにいったらDNS lookupがタイムアウト。SPF評価全体が temperror (一時的エラー) で完了できなかった、という結果。

メール本文のAuthentication-Resultsでは dkim=passdmarc=passReceived-SPF: Pass だったので、リアルタイムの受信判定はパスしていました。けれどmail-testerは独立にspfqueryを走らせて、SPFの解決可能性を厳しくチェック。タイムアウトするincludeが含まれていると -3。

なぜTEMPERRORが起きたか

問題のSPFレコードはこういう状態でした。

v=spf1 +a:sv<NNNNN>.xserver.jp +a:<own-domain> +mx include:spf.sender.xserver.jp include:_spf.google.com ~all

各エントリの役割と、Web移行後の状況。

エントリ役割移行後の状況
+a:sv<NNNNN>.xserver.jpXサーバー AレコードIPを許可Xserverから直接送信していないので不要
+a:<own-domain>apex AレコードIPを許可移行でapexがCF PagesのAnycast IPに変わり、意図せず広い許可になっている
+mxMX (SMTP.GOOGLE.COM) を許可include:_spf.google.com で網羅されるので冗長
include:spf.sender.xserver.jpXサーバー SPFサブドメインを取り込みDNS lookupタイムアウト = TEMPERRORの犯人
include:_spf.google.comGoogle Workspace SPFを取り込み必須
~all列挙外はsoft fail必須

spf.sender.xserver.jp のTXTが引けない状況は、Xサーバー側のSPFサブドメインの応答が止まっているのか、解決経路に問題があるのか、原因はいくつか考えられます。けれど そもそも使っていないincludeを残し続ける必要がないので、削除一択。

ついでに +a:<own-domain> も問題です。Web移行でapexのAレコードがCF PagesのAnycast IPに変わったため、「Cloudflare上の任意のIPが <own-domain> を名乗ってメール送信できる」という意図せぬ広い許可になっていました。これも削除。

1行に簡素化

メール送信ルートを棚卸しすると、このサイトのケースでは下記でした。

  • Google Workspace経由の手動 / システムメール送信
  • Xサーバーはcatch-all受信のみ (= 中継、<own-domain> を名乗って外部送信しない)
  • Sendgrid不使用 (DKIM CNAMEは過去の遺物として残存、別タスクで削除予定)
  • WordPress廃止済 (Web移行でAstroに書換、PHPからのシステムメール送信なし)

つまり実際の送信元はGoogle Workspace 1つ。SPFはこれで足ります。

v=spf1 include:_spf.google.com ~all

CF DNSでTXT <own-domain> のSPFレコードを編集して、コンテンツをこの1行に置換。保存即時で世界に伝播 (CF DNSの権威DNSは即時更新、ローカルキャッシュはTTL 300秒以内)。

再計測で10/10

5分後にmail-testerを再実行。

項目判定
SpamAssassin likes you
You’re properly authenticated✓ (前回の -3が解消)
Your message could be improved⚠ 警告のみ、減点なし
You’re not blocklisted
No broken links

総合10/10。「Wow! Perfect, you can send」。

「Your message could be improved」の警告は List-Unsubscribe headerなしの指摘で、これはnewsletter等の大量配信メール想定の要求項目。手動メール送信中心の運用では不要 (false positive) で、減点もありません。

転送と送信の違いに注意

ハマりやすいポイント。「Xサーバーでcatch-all転送している場合、SPFに include:spf.sender.xserver.jp を残すべきでは?」と考えるかもしれません。実は不要です。

転送 (forwarding) はSMTPリレーで、Xサーバーは中継しているだけ。

外部 (例: [email protected])
   ↓ 元メール (From: [email protected])
Google Workspace 受信
   ↓ Default Routing で SMTP リレー
Xサーバー SMTP
   ↓ 転送設定で <user>@<own-domain> へ
Google Workspace 再受信

この経路で Fromヘッダーは終始元の送信者 ([email protected]) のまま。Xサーバーは <own-domain> を名乗ったメールを新規発信していません。SPF評価は元の送信者 (gmail.com) のドメインに対して行われ、<own-domain> のSPFレコードとは無関係。

つまりcatch-all転送が動いているケースでも、<own-domain> のSPFにXサーバー関連エントリは不要です。

Web移行とSPF見直しはセットで

今回の経験から得られるSOP。

DNSを別の権威DNSに移行する時、必ずSPFレコードを棚卸しする。チェック項目:

  • +a:<own-domain> がある → Web移行でapexのAレコードが変わった可能性 → 削除
  • include:<old-provider> がある → 移行で旧プロバイダのメールサービスを使わなくなった可能性 → 削除
  • +mx がある → 同じ意図の include: があれば冗長 → 削除
  • 不要なincludeやaが残っていないか → DNS lookupがSPF評価のレートリミット (RFC 7208で10回まで) を消費する、シンプルに保つ

移行直前にメール送信ルートの全件洗い出しを実施し、本当に使っている送信ルートだけがSPFに残る状態にすると、mail-testerも含めた認証スコアが綺麗に出ます。


mail-testerで7/10が出たら、まず -3セクションを開いてVerification detailsのspfquery結果を読む。TEMPERRORが出ていたら、SPFのincludeのDNS lookupが失敗している。Web移行を経た直後なら、不要なincludeやaエントリが残っている可能性が高い。1行消すだけで10/10まで行ける典型例です。

Web移行とメール認証設計のご相談はお問い合わせから、業務領域の詳細はServicesへ。