SPFレコード確認・SPFチェック
SPFチェッカーで、あらゆるドメインのSPFレコードを受信メールサーバーと同じ方法で確認できます:includeごとのDNSルックアップのコスト、上限10回に対する累計、voidルックアップ、そして送信元IPごとの結果と、それを決めた項目。SPFレコードのチェックも、IPのテストもこれ1つで行えます。
入力した名前そのものを確認します。SPFに継承はないため、mail.example.com には専用のレコードが必要です。
SPFレコードとは
SPFレコードは、ドメインに代わってメールを送信してよいサーバーを列挙したTXTレコードです。v=spf1で始まり、送信元を項目ごとに指定し、最後にそれ以外すべてを受信サーバーがどう扱うべきかを示します(RFC 7208、2014年4月。現在も最新の標準です)。
受信サーバーは、接続してきたサーバーのアドレスと、エンベロープ送信者であるMAIL FROM(Return-Path)のドメインに照らして確認します。読み手に見えるFrom:の行ではありません。SPFをFrom:に結び付けるのは、DMARCの役割です。
レコードが対象にするのは、設定した名前そのものだけです。SPFに継承はないため、mail.example.com には専用のレコードが必要です。メールを送らないドメインは、v=spf1 -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レコードではありません。redirect=は確認を別のレコードに引き継ぎ、exp=はfailの理由を説明します。~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 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"
- v=spf1で始まるレコードは1件です。 その隣にある他のTXTレコード23件(認証用のトークンなど)はSPFには関係ありませんが、応答のサイズには影響します。
- 2個の文字列、空白なしで結合。 255バイトの区切りは
ip4:62.253.227.114の途中に入っています:受信サーバーは文字列をつなぎ直すので、問題ありません。 - TTLは5 分です。 変更後、リゾルバーがこのコピーを保持できる時間です。ゾーン自身のサーバーは5 分と返し、リゾルバーはコピーの残り時間を示します。
- includeはそれぞれ別の問い合わせです。 github.comのレコードをたどるには、ネストしたものも含めて10回のルックアップが必要です。digが表示するのは1回に1つの名前だけで、10回までの合計は自分で数えることになります。
$ nslookup -type=TXT github.com 8.8.8.8
# その名前のすべてのTXTレコード(Google Public DNSから) PS> Resolve-DnsName -Name github.com -Type TXT -Server 8.8.8.8
結果の見方:includeのツリー
判定は、レコードに記載のない送信元に対して受信サーバーが得る結果を示します:末尾とともに有効(~allならsoftfail、-allならfail)、原因つきのpermerror、またはDNSが応答しなかった場合の「確認できませんでした」です。
紺色の列はルックアップの予算です:DNSルックアップ1回につき1つのセルで、それを消費したincludeごとに色分けし、10回に対する累計と、voidルックアップを輪で表示します。10回目を過ぎるとセルが赤くなり、受信サーバーが止まる枝に印が付きます。
ツリービューでは、読み取り結果を失敗が先になる順に、RFCのセクションと修正方法とともに並べ、続いてすべてのルックアップを受信サーバーが問い合わせる順に表示します。

判定レコードに記載のない送信元に対して受信サーバーが得る結果と、それを決める末尾の指定です。項目ごとのレコード項目を種類ごとに色分け。includeには運用者のマークと、そのルックアップのコストが付きます。読み取り結果レコードは1つか、構文は有効か、ルックアップ、void、末尾、ptr、DMARC:失敗が先で、それぞれに修正方法が付きます。ルックアップの予算DNSルックアップ1回を1セルで表し、消費したincludeごとに色分けして、上限10回と比べます。各includeのコストincludeごとの枝:そのセル、ネストの内容、累計を表示します。voidルックアップ空の応答だった問い合わせを輪で表示:3回目で確認が終わります。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回以内に収めるには、使っていない送信元を削除し、一括送信元を専用のレコードを持つサブドメインに移してください。
v=spf1 include:spf.protection.outlook.com include:_netblocks.mimecast.com include:mailgun.org include:sendgrid.net -all
それ以外もすべてpermerrorになり、レコードの-allによるfailにはなりません:受信サーバーはそこに到達する前に止まります。
- _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回のルックアップ
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であり、受信サーバーはたいてい後で再試行します。
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
exists:%{i}._spf.mta.salesforce.com192.0.2.1._spf.mta.salesforce.com → NXDOMAIN · 3回目のルックアップ · _spf.salesforce.com内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(空の応答)mx:shop.example.com、存在しなくなった名前で、すでにvoidが2回ある状態:受信サーバーはここで止まります。NXDOMAINpermerrorinclude:_spf.vendor.exampleに対するSERVFAILまたはタイムアウト:DNSが失敗したので、voidとしては数えません。SERVFAILtemperror、voidではないblastmailのinclude include:spf.bmv.jpは、このようなexists項目2つで始まっています:記載のないアドレスでは、許容される2回のvoidをそれだけで使い切ります。
SPFのフラット化:役立つ場合と壊れる場合
フラット化は、includeをそれが記載しているアドレスに置き換えて、レコードのルックアップを減らす方法です。めったに変わらない範囲には有効ですが、プロバイダーがコピーしていないサーバーを追加すると逆効果になり、そのサーバーからのメールはSPFで失敗します。
Microsoftはinclude:spf.protection.outlook.comをフラット化しないよう案内しており、GoogleとMicrosoftのincludeは、すでにそれぞれ1回のルックアップです。一括送信元を news.example.com のようなサブドメインに移せば、専用のレコードと10回のルックアップが得られます。
前
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で失敗します。
- コピー
- Mailgunが範囲を追加
- そこからのメールがSPFで失敗
~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)。
~all-all?all?allで終わっています:includeの中ではpassだけが一致するので、問題ありません。+all-allとDMARC p=reject
- SPFがfail
- SMTPで拒否
- DKIMは確認されない
SPFを先に判断する受信サーバーもあるため、有効なDKIM署名のある転送メールが、DMARCが実行される前に拒否されることがあり、その損失はDMARCレポートに表れません。
~allとDMARC p=reject
- SPFがsoftfail
- DMARCがDKIMを確認
- アラインした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になります。一方、ドメイン末尾のドットは有効です。
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 -all14回のルックアップ
修正:使っていない送信元を削除するか、一括送信元に専用のサブドメインを用意します。
3回目のvoidルックアップpermerror
v=spf1 a:old.example.com mx:gone.example.net exists:%{i}.spf.example.org -allvoid 3回
修正:存在しない名前の項目を削除し、existsのincludeは最後に置きます。
SPFレコードのないincludepermerror
v=spf1 include:spf.retired-vendor.example -all修正:名前を修正するか、利用をやめたベンダーを削除します。
–allのenダッシュpermerror
v=spf1 include:_netblocks.mimecast.com –allMimecast自身のドキュメントにこの形で掲載されています
修正:通常のハイフンにします:-all。
include:の後の空白permerror
v=spf1 a mx include: spf.mtasv.net ~allPostmark自身のドキュメントにこの形で掲載されています
修正:include:spf.mtasv.net
aaaaメカニズムpermerror
v=spf1 aaaa:example.com ~allTwilio 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のドメインは、プロバイダーのバウンスドメインではなく、自分のものでなければなりません。
| Gmail | Yahoo | Outlook.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.27 | YahooSPFについては案内なし | Outlook.com550 5.7.515 |
日本:NTT docomoの最も厳しい設定である「全て拒否する」では、ドメインのSPFレコードが許可していない送信元IPからのメールと、SPFレコードをまったく公開していないドメインからのメールを拒否します。 docomo.ne.jp
情報源support.google.comsenders.yahooinc.comtechcommunity.microsoft.com
SPFレコード検索とdig・nslookupの違い
digとnslookupが表示するのは、リゾルバーが持っているTXTレコードです:SPFレコードと、その名前にある他のレコード。includeはたどらず、ルックアップやvoidも数えず、受信サーバーがどう判断するかも示しません。
このようなSPFレコード検索は、レコード全体をたどるため、数値が受信サーバーの計算と一致します。1つの名前を見るならdig、判定を知るならこのチェッカーを使ってください。
dig TXT | nslookup -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 DNS | dig TXTはい | nslookup -type=TXTはい |
SPFチェッカー:よくある質問
SPFレコードの確認とは何ですか?
v=spf1で始まるTXTレコード)を読み取り、受信メールサーバーと同じようにたどります:すべてのincludeとredirectをたどり、DNSルックアップを上限10回、空の応答を上限2回と照らして数えます。最後に、記載のない送信元に対して受信サーバーが得る結果、またはpermerrorとその原因を示します。IPアドレスが自分のドメインのメールを送信できるか、SPFチェックでテストするには?
「SPF DNSルックアップが多すぎる」とはどういう意味ですか?
SPFのpermerrorとは何ですか?
SPFのvoidルックアップとは何ですか?
SPFレコードの末尾は ~all と -all のどちらにすべきですか?
1つのドメインにSPFレコードを2つ設定できますか?
SPFのフラット化とは何で、使うべきですか?
サブドメインにも専用のSPFレコードは必要ですか?
SPFがここではpassするのに、Gmailではfailになるのはなぜですか?
SPF、DKIM、DMARCの違いは何ですか?
SPFレコードの変更が反映されるまでどれくらいかかりますか?
関連するメールとDNSのツール
MX検索
メール交換レコードとメールサーバーの詳細を検索
DMARCチェッカー
ドメインのDMARCポリシーとアライメント設定を確認
DKIMチェッカー
セレクター自動検出付きでDKIMレコードを検証
メールヘッダー解析
メールヘッダーを解析してメールの経路を追跡
IPブラックリストチェック
IPアドレスがスパムまたはマルウェアブラックリストに登録されていないか確認
逆引きDNS
PTRレコードでIPアドレスに関連するホスト名を検索
DNS検索
ドメイン自身のネームサーバーから全DNSレコードを取得し、GoogleとCloudflareのキャッシュと比較
SPFレコード作成ツール
メールサービスとサーバーに合わせた有効なSPF TXTレコードを作成し、DNSルックアップ10回の上限をリアルタイムでチェック
