SPFレコード確認・SPFチェック

SPFチェッカーで、あらゆるドメインのSPFレコードを受信メールサーバーと同じ方法で確認できます:includeごとのDNSルックアップのコスト、上限10回に対する累計、voidルックアップ、そして送信元IPごとの結果と、それを決めた項目。SPFレコードのチェックも、IPのテストもこれ1つで行えます。

情報源:ドメインのTXTレコードとすべてのinclude(Google Public DNS経由、その先にCloudflare 1.1.1.1) · RFC 7208 check_host(当サイトのサーバーで実行) · 何も保存しません

SPFレコードとは

SPFレコードは、ドメインに代わってメールを送信してよいサーバーを列挙したTXTレコードです。v=spf1で始まり、送信元を項目ごとに指定し、最後にそれ以外すべてを受信サーバーがどう扱うべきかを示します(RFC 7208、2014年4月。現在も最新の標準です)。

受信サーバーは、接続してきたサーバーのアドレスと、エンベロープ送信者であるMAIL FROM(Return-Path)のドメインに照らして確認します。読み手に見えるFrom:の行ではありません。SPFをFrom:に結び付けるのは、DMARCの役割です。

レコードが対象にするのは、設定した名前そのものだけです。SPFに継承はないため、mail.example.com には専用のレコードが必要です。メールを送らないドメインは、v=spf1 -allを公開してください。

SPFレコードを項目ごとに見るgoogle.com · TXT · 2026年10月24日に記録 · TTL 5 分
v=spf1バージョンinclude:_spf.google.comメカニズム · 1回のルックアップ~all修飾子 ~ · メカニズム all

includeの宛先は_spf.google.comです · 8範囲、これ以上のルックアップなし

ip4:74.125.0.0/16ip4:209.85.128.0/17ip6:2001:4860:4864::/56ip6:2404:6800:4864::/56ip6:2607:f8b0:4864::/56ip6:2800:3f0:4864::/56ip6:2a00:1450:4864::/56ip6:2c0f:fb50:4864::/56~all

バージョン先頭は必ずv=spf1:これ以外で始まるレコードはSPFレコードではありません。
メカニズムinclude、a、mx、ip4、ip6、exists、ptr、all を左から順に評価し、最初に一致したものが結果を決めます。
修飾子+ pass(既定)、- fail、~ softfail、? neutral。メカニズムの前に付けます。
モディファイアredirect=は確認を別のレコードに引き継ぎ、exp=はfailの理由を説明します。
google.comのレコード全体は3項目です:受信サーバーはincludeを取得し、送信元IPをその範囲に照らして一致させるか、~allに到達します。2026年10月24日にGoogle Public DNSで記録しました。

SPFレコードの確認方法

上にドメインを入力すると、チェッカーがそのTXTレコードを読み取り、v=spf1で始まるものを選んで、受信サーバーと同じようにすべてのincludeとredirectをたどり、DNSルックアップを1回ずつ数えます。

手作業で確認するなら、TXTレコードを問い合わせます:dig TXT example.com +shortまたはnslookup -type=TXT example.com。応答にはその名前のすべてのTXTレコードが含まれ、SPFレコードはv=spf1で始まるものです。長いレコードは複数の引用符付き文字列で返され、SPFはそれらを空白なしで結合します。includeはそれぞれ1回ずつ別の問い合わせになるため、数えるのは自分で行う必要があります。

特定のサーバーが送信できるかどうかを見るには、IPをテストに切り替えてください。同じ確認をそのアドレスに対して実行し、一致した項目を表示します。

dig TXT example.com +short

リゾルバーが持っている、その名前のすべてのTXTレコード。SPFレコードは v=spf1 で始まるものです。includeごとに繰り返し実行してください。

digが示すもの、示さないものgithub.com · dig TXT · 2026年10月24日に記録
ターミナルTXTレコード24件中の1件
$ dig TXT github.com @dns1.p08.nsone.net +norec +noall +answer
github.com.  300  IN  TXT  "v=spf1 ip4:192.30.252.0/22 include:spf.protection.outlook.com include:_netblocks.google.com include:_netblocks2.google.com include:mail.zendesk.com include:_spf.salesforce.com include:servers.mcsv.net include:mktomail.com include:sendgrid.net ip4:62.253.2" "27.114 ip4:166.78.69.169 ip4:166.78.69.170 ip4:166.78.71.131 ~all"

# 続いて、includeを1つずつ問い合わせます:
$ dig +short TXT _spf.salesforce.com
"v=spf1 exists:%{i}._spf.mta.salesforce.com -all"
  1. v=spf1で始まるレコードは1件です。 その隣にある他のTXTレコード23件(認証用のトークンなど)はSPFには関係ありませんが、応答のサイズには影響します。
  2. 2個の文字列、空白なしで結合。 255バイトの区切りはip4:62.253.227.114の途中に入っています:受信サーバーは文字列をつなぎ直すので、問題ありません。
  3. TTLは5 分です。 変更後、リゾルバーがこのコピーを保持できる時間です。ゾーン自身のサーバーは5 分と返し、リゾルバーはコピーの残り時間を示します。
  4. includeはそれぞれ別の問い合わせです。 github.comのレコードをたどるには、ネストしたものも含めて10回のルックアップが必要です。digが表示するのは1回に1つの名前だけで、10回までの合計は自分で数えることになります。
Windows
$ nslookup -type=TXT github.com 8.8.8.8
PowerShell
# その名前のすべてのTXTレコード(Google Public DNSから)
PS> Resolve-DnsName -Name github.com -Type TXT -Server 8.8.8.8
github.comのTXT応答(ドメイン自身のネームサーバーから):SPFレコードは2つの文字列として届き、ドメインの他のTXTレコードの中に空白なしで結合されます。

結果の見方:includeのツリー

判定は、レコードに記載のない送信元に対して受信サーバーが得る結果を示します:末尾とともに有効(~allならsoftfail、-allならfail)、原因つきのpermerror、またはDNSが応答しなかった場合の「確認できませんでした」です。

紺色の列はルックアップの予算です:DNSルックアップ1回につき1つのセルで、それを消費したincludeごとに色分けし、10回に対する累計と、voidルックアップを輪で表示します。10回目を過ぎるとセルが赤くなり、受信サーバーが止まる枝に印が付きます。

ツリービューでは、読み取り結果を失敗が先になる順に、RFCのセクションと修正方法とともに並べ、続いてすべてのルックアップを受信サーバーが問い合わせる順に表示します。

github.comのSPFレコード確認の画面:DNSルックアップは10回中10回、void 1回、各includeのコストをルックアップの予算で表示github.comのSPFレコード確認の画面:DNSルックアップは10回中10回、void 1回、各includeのコストをルックアップの予算で表示判定レコードに記載のない送信元に対して受信サーバーが得る結果と、それを決める末尾の指定です。項目ごとのレコード項目を種類ごとに色分け。includeには運用者のマークと、そのルックアップのコストが付きます。読み取り結果レコードは1つか、構文は有効か、ルックアップ、void、末尾、ptr、DMARC:失敗が先で、それぞれに修正方法が付きます。ルックアップの予算DNSルックアップ1回を1セルで表し、消費したincludeごとに色分けして、上限10回と比べます。各includeのコストincludeごとの枝:そのセル、ネストの内容、累計を表示します。voidルックアップ空の応答だった問い合わせを輪で表示:3回目で確認が終わります。
github.comのSPFチェック:判定、項目に分けたレコード、読み取り結果、各includeのコストを示すルックアップの予算。数字を選ぶと、各部分の意味が表示されます。

SPFレコードのルックアップ上限10回と「DNSルックアップが多すぎる」(permerror)

受信サーバーは、DNSの問い合わせが必要なすべての項目(include、a、mx、ptr、exists、redirect)を、ネストしたincludeの中まで数え、10回で止まります。11回目でpermerrorになります(RFC 7208 §4.6.4)。ip4、ip6、all、expは消費しません。

これはfailではなくpermerrorです:受信サーバーがそれをどう扱うかは各社の判断ですが、DMARCではpermerrorがpassになることはありません。また、確認は最初に一致したところで止まるため、上限を超えたレコードでも、早い位置に記載された送信元は引き続きpassし、遅い位置に記載された送信元だけが失敗します。

コストはincludeの中に隠れています:include:_netblocks.mimecast.comはそれだけで9回、Yandex 360は8回、Freshdeskは7回、Mailgunは5回を消費します。GoogleとMicrosoft 365のincludeは、それぞれ1回です。10回以内に収めるには、使っていない送信元を削除し、一括送信元を専用のレコードを持つサブドメインに移してください。

10回のルックアップを消費するのは誰かコストは2026年10月24日に計測 · 実在のincludeでつくった架空のレコード

v=spf1 include:spf.protection.outlook.com include:_netblocks.mimecast.com include:mailgun.org include:sendgrid.net -all

17回のルックアップが必要
最初の10回以内に記載:passMicrosoft 3651Mimecast2–10
10回目より後に記載:permerrorMailgun11–15Twilio SendGrid16–17

それ以外もすべてpermerrorになり、レコードの-allによるfailにはなりません:受信サーバーはそこに到達する前に止まります。

includeごとのコスト各プロバイダー自身が案内しているinclude · 2026年10月24日に計測
  • _netblocks.mimecast.comMimecast9回のルックアップ
  • _spf.yandex.netYandex 3608回のルックアップ
  • email.freshdesk.comFreshdesk7回のルックアップ
  • mailgun.orgMailgun5回のルックアップ
  • icloud.comiCloud+5回のルックアップ
  • spf.titan.emailTitan Email4回のルックアップ
  • secureserver.netGoDaddy3回のルックアップ
  • _spf.google.comGoogle Workspace1回のルックアップ
  • spf.protection.outlook.comMicrosoft 3651回のルックアップ
RFC 7208 §4.6.4と同じ方法で数えたルックアップ:include自身に、その中身すべてを加えた数です。このページのライブの数値は、常にこの表ではなく、実際にたどった結果に基づきます。

voidルックアップとは

voidルックアップとは、レコードが1件も返らなかった問い合わせのことです:名前が存在しない(NXDOMAIN)か、名前はあっても求めたレコードがありません。受信サーバーは2回までを許容すべきで、3回目はpermerrorです(RFC 7208 §4.6.4)。

存在しなくなったホストを指す項目、たとえばa:old.example.comは、それだけではエラーではありません:一致せず、voidが1回数えられるだけです。exists:%{i}._spf.mta.salesforce.comも、Salesforceが記載していないすべての送信元について同じ扱いになり、そのためincludeの順序が重要です。

サーバーの障害やタイムアウトはvoidではありません:temperrorであり、受信サーバーはたいてい後で再試行します。

4つの応答、3つの結果RFC 7208 §4.6.4

192.0.2.1の場合のsalesforce.com自身のレコード(2026年10月24日に記録)

v=spf1 include:_spf.google.com include:_spf.salesforce.com exists:%{i}._spf.corp.salesforce.com ~all

voidルックアップ2 / 23回目:permerror
  1. exists:%{i}._spf.mta.salesforce.com192.0.2.1._spf.mta.salesforce.com → NXDOMAIN · 3回目のルックアップ · _spf.salesforce.com内
  2. exists:%{i}._spf.corp.salesforce.com192.0.2.1._spf.corp.salesforce.com → NXDOMAIN · 4回目のルックアップ · salesforce.com内

結果:softfail(許容される2回のvoidを使い切った状態)

名前はあるが、レコードがない名前は残っていますが、アドレスがなくなったものへのa:mail.example.com:応答なしのNOERROR。一致せず、voidが1回で、確認は続きます。NODATAvoid(空の応答)
名前が存在しないexists:%{i}._spf.mta.salesforce.comは送信元IPごとに名前を組み立てます。Salesforceが記載していないアドレスでは、応答はNXDOMAINになり、そのたびにvoidが1回です。NXDOMAINvoid(空の応答)
3回目のvoidmx:shop.example.com、存在しなくなった名前で、すでにvoidが2回ある状態:受信サーバーはここで止まります。NXDOMAINpermerror
応答がまったくないinclude:_spf.vendor.exampleに対するSERVFAILまたはタイムアウト:DNSが失敗したので、voidとしては数えません。SERVFAILtemperror、voidではない

blastmailのinclude include:spf.bmv.jpは、このようなexists項目2つで始まっています:記載のないアドレスでは、許容される2回のvoidをそれだけで使い切ります。

voidとして数えるのは、空の応答だけです。障害はtemperrorで、確認は後でやり直されます。

SPFのフラット化:役立つ場合と壊れる場合

フラット化は、includeをそれが記載しているアドレスに置き換えて、レコードのルックアップを減らす方法です。めったに変わらない範囲には有効ですが、プロバイダーがコピーしていないサーバーを追加すると逆効果になり、そのサーバーからのメールはSPFで失敗します。

Microsoftはinclude:spf.protection.outlook.comをフラット化しないよう案内しており、GoogleとMicrosoftのincludeは、すでにそれぞれ1回のルックアップです。一括送信元を news.example.com のようなサブドメインに移せば、専用のレコードと10回のルックアップが得られます。

includeを1つフラット化するmailgun.org · 2026年10月24日に記録

前

include:mailgun.org

ルックアップ
5
取得するレコード
5
レコードのバイト数
19
Mailgunが範囲を変更
すぐに反映

後

ip4:159.135.224.0/20 ip4:69.72.32.0/20 ip4:204.220.90.0/23 ip4:204.220.92.0/22 他18件

ルックアップ
0
レコードのバイト数
450
必要なTXTの文字列
2
Mailgunが範囲を変更
コピーが古くなる

コピーが古くなるリスク。 今日は22範囲をコピーしますが、Mailgunが範囲を追加すると、誰かが気づいてレコードを更新するまで、そこからのメールはSPFで失敗します。

  1. コピー
  2. Mailgunが範囲を追加
  3. そこからのメールがSPFで失敗
フラット化する 自社サーバーのアドレスなど、めったに変わらない範囲だけ。
フラット化しない Microsoft 365:Microsoftは送信アドレスが頻繁に変わると説明しているので、includeを残します。
おすすめ 一括送信元ごとにサブドメインを用意:それぞれが専用のレコードと10回のルックアップを持てます。
フラット化は、ルックアップと引き換えに保守の手間を負うことです:コピーが正しいのは、プロバイダーが範囲を変更するまでの間だけです。

~all と -all の違い(DMARCとの関係)

最後の項目は、記載のないすべての送信元をどう扱うかを示します。-allはfailで最も強い表明、~allはsoftfailで「おそらく違う」、?allはneutralで受信サーバーはSPFなしと同じに扱い、+allは誰でもpassにするため、決して公開してはいけません。

~allと-allのどちらにも、間違いはありません。Googleは Google Workspace に~all、Microsoftは Microsoft 365 に-allを案内しています。DMARCを強制ポリシーで運用している場合、~allならDMARCがDKIMで判定します:受信サーバーによっては、DMARCがpassするDKIM署名を確認する前に-allを理由に拒否するため、転送されたメールが返送されることがあります(RFC 9989 §7.1)。

4つの末尾の指定RFC 7208 §2.6 · RFC 9989 §7.1
~all
softfail「おそらく許可されていない」:受信サーバーは、これだけを理由に拒否すべきではありません。
案内しているプロバイダーGoogle WorkspaceMailguniCloud+
-all
fail最も強い表明:受信サーバーはSMTPの段階でメッセージを拒否できます。
案内しているプロバイダーMicrosoft 365ZendeskGoDaddy
?all
neutral何も表明しません:受信サーバーはSPFなしとまったく同じに扱います。
案内しているプロバイダーFastmailIONOS、OVHcloudのincludeも?allで終わっています:includeの中ではpassだけが一致するので、問題ありません。
+all
pass for everyoneインターネット上のどのサーバーも、そのドメインとしてpassします。
決して公開しないでください

-allとDMARC p=reject

  1. SPFがfail
  2. SMTPで拒否
  3. DKIMは確認されない

SPFを先に判断する受信サーバーもあるため、有効なDKIM署名のある転送メールが、DMARCが実行される前に拒否されることがあり、その損失はDMARCレポートに表れません。

~allとDMARC p=reject

  1. SPFがsoftfail
  2. DMARCがDKIMを確認
  3. アラインしたDKIM:pass

DMARCが判定します。ただしDKIM署名がない場合、MicrosoftはDMARCが~allによる失敗に対して事実上無視されると説明しており、そのため-allを推奨しています。

~allも-allも有効な選択です。?allは何も表明せず、+allは誰でもpassにします。

SPFレコードのよくあるエラーと修正方法

壊れたレコードのほとんどは、3つの誤りから生まれます:最初のレコードとまとめずに2つ目のSPFレコードを追加した、すでに使っていないベンダーのincludeが残っている、ドキュメントからコピーした値にタイプミスがあった。

ベンダーのドキュメント自身がこれらの一部を載せています:Mimecastは–allをenダッシュで、Postmarkはinclude: spf.mtasv.netを空白入りで、Twilio SendGridは存在しないaaaaメカニズムを掲載しています。構文エラーが1つでもあると、レコード全体がpermerrorになります。一方、ドメイン末尾のドットは有効です。

8つのレコード、8つの結果実際にある誤りの架空の例

SPFレコードが2つpermerror

v=spf1 include:_spf.google.com ~allv=spf1 include:sendgrid.net ~all

修正:1つにまとめます:v=spf1は1つ、includeはそれぞれ1回、末尾の指定は1つ。

10回を超えるルックアップpermerror

v=spf1 include:_netblocks.mimecast.com include:mailgun.org -all

14回のルックアップ

修正:使っていない送信元を削除するか、一括送信元に専用のサブドメインを用意します。

3回目のvoidルックアップpermerror

v=spf1 a:old.example.com mx:gone.example.net exists:%{i}.spf.example.org -all

void 3回

修正:存在しない名前の項目を削除し、existsのincludeは最後に置きます。

SPFレコードのないincludepermerror

v=spf1 include:spf.retired-vendor.example -all

修正:名前を修正するか、利用をやめたベンダーを削除します。

–allのenダッシュpermerror

v=spf1 include:_netblocks.mimecast.com –all

Mimecast自身のドキュメントにこの形で掲載されています

修正:通常のハイフンにします:-all。

include:の後の空白permerror

v=spf1 a mx include: spf.mtasv.net ~all

Postmark自身のドキュメントにこの形で掲載されています

修正:include:spf.mtasv.net

aaaaメカニズムpermerror

v=spf1 aaaa:example.com ~all

Twilio SendGrid自身のドキュメントにこの形で掲載されています

修正:a:example.com。aがすでにIPv6の送信元のAAAAレコードにも一致します。

末尾のドット有効

v=spf1 include:spf.protection.outlook.com. -all

有効:RFC 7208 §7.3では公開しないよう定めていますが、受信サーバーは受け付けなければなりません。

Zendeskのヘルプにも「redirect: syntax is supported」とありますが、モディファイアはredirect=と書きます(RFC 7208 §6.1)。

どのレコードも架空の例ですが、誤りは受信サーバーが最もよく目にするものです。

Gmail、Yahoo、Microsoftが求めるSPFの要件

2024年2月から、GmailとYahooはすべての送信者にSPFまたはDKIMの設定を求めています。一括送信者には両方に加え、少なくともp=noneのDMARCレコードと、そのどちらかとアラインしたFrom:ドメインが必要です。Outlook.comは大量送信者にSPFとDKIMの両方を求め、2025年5月5日からは、それらがないメールを拒否しています。

Gmailのしきい値は個人アカウントへ1日5,000通を超える場合で、Yahooはしきい値を公表していません。SPFだけでメールが「アラインした」ことにはなりません:MAIL FROMのドメインは、プロバイダーのバウンスドメインではなく、自分のものでなければなりません。

3つのメールボックスプロバイダーのルール各プロバイダー自身のページで2026年10月24日に確認
GmailYahooOutlook.com
一括送信のしきい値Gmail個人のGmailアカウントへ1日5,000通を超える場合(プライマリドメインごとに集計)Yahoo公表なし:「We will not specify a volume threshold」(しきい値は明示しません)Outlook.com1日5,000通を超える場合(Microsoftのブログ)、1つのFrom:ドメインから5,000通以上(サポート記事)
すべての送信者GmailSPFまたはDKIM、加えて正引きと逆引きのDNS、TLS、0.3%未満のスパム率YahooSPFまたはDKIM、加えて正引きと逆引きのDNS、0.3%未満のスパム率Outlook.com厳格なルールなし
一括送信者GmailSPFとDKIMの両方、DMARC(p=noneで可)、SPFまたはDKIMとアラインしたFrom:、マーケティングメールにはワンクリック配信停止YahooSPFとDKIMの両方、少なくともp=noneでpassするDMARC、SPFまたはDKIMとアラインしたFrom:、ワンクリック配信停止Outlook.comSPFがpassしなければならず、DKIMもpassしなければならない。DMARCは少なくともp=none、SPFまたはDKIMとアライン
適用開始Gmail2024年2月1日。拒否は2025年11月から強化Yahoo2024年2月Outlook.com2025年5月5日(拒否)
SPF失敗の表示Gmail4.7.275.7.27YahooSPFについては案内なしOutlook.com550 5.7.515

日本:NTT docomoの最も厳しい設定である「全て拒否する」では、ドメインのSPFレコードが許可していない送信元IPからのメールと、SPFレコードをまったく公開していないドメインからのメールを拒否します。 docomo.ne.jp

情報源support.google.comsenders.yahooinc.comtechcommunity.microsoft.com

各プロバイダーのルールを、2026年10月24日時点のそれぞれのページの記載どおりに示しています。

SPFレコード検索とdig・nslookupの違い

digとnslookupが表示するのは、リゾルバーが持っているTXTレコードです:SPFレコードと、その名前にある他のレコード。includeはたどらず、ルックアップやvoidも数えず、受信サーバーがどう判断するかも示しません。

このようなSPFレコード検索は、レコード全体をたどるため、数値が受信サーバーの計算と一致します。1つの名前を見るならdig、判定を知るならこのチェッカーを使ってください。

SPFを見る3つの方法それぞれが示すもの
このチェッカーdig TXTnslookup -type=TXT
TXTレコードを表示このチェッカーはい項目に分けて表示dig TXTはいnslookup -type=TXTはい
長いレコードの文字列を結合このチェッカーはい受信サーバーと同じdig TXTいいえ文字列を別々に表示nslookup -type=TXTいいえ文字列を別々に表示
すべてのincludeをたどるこのチェッカーはいツリー全体dig TXTいいえ1回の問い合わせで1つの名前nslookup -type=TXTいいえ1回の問い合わせで1つの名前
10回までのルックアップを数えるこのチェッカーはいincludeごとの累計dig TXTいいえ手作業nslookup -type=TXTいいえ手作業
voidルックアップを数えるこのチェッカーはい名前つきdig TXTいいえnslookup -type=TXTいいえ
レコード2つ = permerror と判定このチェッカーはいdig TXTいいえ両方を表示nslookup -type=TXTいいえ両方を表示
送信元IPをテストこのチェッカーはいcheck_hostと一致した項目dig TXTいいえnslookup -type=TXTいいえ
自分のリゾルバーに問い合わせるこのチェッカーいいえ当サイトのサーバーからGoogle Public DNSdig TXTはいnslookup -type=TXTはい
同じ問いを3通りの方法で尋ねたもの:digとnslookupは自分のリゾルバーが持っている内容、チェッカーは受信サーバーが計算する内容を示します。

SPFチェッカー:よくある質問

SPFレコードの確認とは何ですか?

SPFレコードの確認では、ドメインのSPFレコード(v=spf1で始まるTXTレコード)を読み取り、受信メールサーバーと同じようにたどります:すべてのincludeとredirectをたどり、DNSルックアップを上限10回、空の応答を上限2回と照らして数えます。最後に、記載のない送信元に対して受信サーバーが得る結果、またはpermerrorとその原因を示します。

IPアドレスが自分のドメインのメールを送信できるか、SPFチェックでテストするには?

「IPをテスト」を選び、ドメインと送信サーバーのアドレス(IPv4またはIPv6)、必要ならMAIL FROMアドレスとHELO名を入力します。チェッカーはそのアドレスに対してcheck_hostを実行し、pass、fail、softfail、neutral、permerrorのいずれかと、一致した項目、その修飾子、そこに至るincludeの連なりを表示します。

「SPF DNSルックアップが多すぎる」とはどういう意味ですか?

レコードの確認に、RFC 7208の上限である10回を超えるDNSルックアップが必要という意味です。include、a、mx、ptr、exists、redirectは各1回で、includeの中にネストしたものも数えます。受信サーバーは11回目でpermerrorとして止まるため、それより後に記載された送信元はSPFをpassしなくなります。使っていないincludeを削除するか、送信元を専用のレコードを持つサブドメインに移してください。

SPFのpermerrorとは何ですか?

permerrorは、SPFで「このレコードは評価できない」ことを示す結果です。10回を超えるDNSルックアップ、2回を超えるvoidルックアップ、同じ名前にSPFレコードが2つある、SPFレコードのない名前のinclude、構文エラーのいずれかで発生します。failではありません:受信サーバーが扱いを決めますが、DMARCではpassになることはありません。

SPFのvoidルックアップとは何ですか?

voidルックアップは、SPFの項目のために行ったDNSの問い合わせが、空の結果で返ることです:名前が存在しない(NXDOMAIN)か、求めた種類のレコードがありません。RFC 7208では、受信サーバーは2回まで許容すべきとされ、3回目はpermerrorです。サーバーの障害やタイムアウトはvoidではなくtemperrorで、受信サーバーはたいてい後で再試行します。

SPFレコードの末尾は ~all と -all のどちらにすべきですか?

どちらも有効です。-all(fail)は最も強い表明で、Microsoftが Microsoft 365 に案内しています。~all(softfail)は Google が Google Workspace に案内しているものです。DKIM署名とquarantineまたはrejectのDMARCを併用する場合は、受信サーバーによってはDMARCがpassするDKIM署名を確認する前に-allで拒否するため、~allのほうが安全なことが多くあります。

1つのドメインにSPFレコードを2つ設定できますか?

できません。同じ名前に v=spf1 で始まるTXTレコードが2つあると、受信サーバーはどちらかを選べず、すべての送信元について、ルックアップの前にpermerrorで確認が終わります(RFC 7208 §4.5)。新しいプロバイダーのレコードを古いレコードの隣に追加したときによく起こります。v=spf1を1つ、includeをそれぞれ1回、末尾の指定を1つにして、1つのレコードにまとめてください。

SPFのフラット化とは何で、使うべきですか?

フラット化は、includeをそれが記載しているIPの範囲に置き換えて、必要なDNSルックアップを減らす方法です。めったに変わらない範囲には有効ですが、プロバイダーがサーバーを追加した時点でフラット化したコピーは古くなり、そのサーバーからのメールはSPFで失敗します。使っていないincludeの削除や、一括送信元への専用サブドメインの用意を優先し、Microsoft 365のincludeは決してフラット化しないでください。

サブドメインにも専用のSPFレコードは必要ですか?

必要です。SPFに継承はなく、レコードが対象にするのは公開した名前そのものだけです。そのため mail.example.com や news.example.com がMAIL FROMやHELOに現れるなら、専用のレコードが必要です。この点は、組織のドメインにさかのぼるDMARCとは異なります。メールを送らないサブドメインは v=spf1 -all を公開できます。

SPFがここではpassするのに、Gmailではfailになるのはなぜですか?

多くの場合、Gmailが別のドメインやアドレスを確認したためです。SPFはMAIL FROM(Return-Path)のドメインと接続してきたサーバーのIPで評価され、それは自分のドメインではなく、プロバイダーのバウンスドメインのことがあります。転送もSPFを壊します。転送元のIPが自分のレコードにないためです。実際のメールのAuthentication-Resultsヘッダーを確認し、そのIPとドメインをここでテストしてください。

SPF、DKIM、DMARCの違いは何ですか?

SPFは、ドメインに代わって送信してよいサーバーを列挙し、エンベロープ送信者に対して確認されます。DKIMは、DNSに公開した鍵でメッセージごとに署名するため、署名は転送されても残ります。DMARCは、それらを読み手に見えるFrom:アドレスに結び付けます:From:とアラインしたドメインでSPFまたはDKIMがpassすればDMARCもpassし、そうでない場合の扱いはポリシーが決めます。

SPFレコードの変更が反映されるまでどれくらいかかりますか?

リゾルバーが古いレコードを保持している間です:最長でドメインが設定したTTLまで(確認時点で、google.comとgithub.comは300秒、microsoft.comは1時間)。受信サーバーは自分のリゾルバーに問い合わせるため、変更はキャッシュされた各コピーが期限切れになると表示されます。このチェッカーは、ドメイン自身のネームサーバーが返すTTLを表示します。その時間が過ぎてから、もう一度確認してください。