← RFC Reference

SPF — 送信者ポリシーフレームワーク

Internet Standard Email Authentication Obsoletes RFC 4408 Published March 2026
ELI5: あなたの会社に公式の便箋があると想像してください。SPFは、あなたの便箋に印刷することが許可されているプリンターのリストを公開するようなものです。あなたからの手紙だと主張する手紙を受け取った場合、その手紙が承認されたプリンターの1つから来たかどうかを確認できます。そうでない場合、それはおそらく偽造品であることがわかります。

このRFCが存在する理由

SMTPは1980年代初頭に設計されたもので、送信者検証機能がありませんでした。どのサーバーも任意のドメインからメールを送信していると主張できます。基本プロトコルにはそれを防ぐ仕組みがないのです。これにより、メールスプーフィングは簡単になりました。スパマーやフィッシング詐欺師は、銀行、同僚、または信頼できるブランドになりすますため、エンベロープ送信者アドレスを偽造できました。

RFC 7208で標準化されたSPF(Sender Policy Framework)は、ドメイン所有者がDNS TXTレコードを公開して、そのドメインからメールを送信することを明示的に許可されているIPアドレスとサーバーをリストアップできるようにすることで、この問題を解決しています。受信メールサーバーはSMTPトランザクション中にこのレコードをクエリし、権限のないソースからのメッセージを拒否またはフラグ付けできます。

RFC 7208は初期の実験的なRFC 4408に取って代わり、SPFを完全なインターネット標準に昇格させ、処理ルールを明確にしてDNSルックアップ制限をより厳しくしました。

動作方法

SPFはメッセージヘッダーレベルではなく、エンベロープレベルで動作します。チェックされるドメインは、MAIL FROMコマンド(Return-Pathまたはエンベロープ送信者とも呼ばれます)内のドメインであり、ユーザーが見るFrom:ヘッダーではありません。

SPFチェックフロー

  1. 送信サーバーが受信者に接続し、MAIL FROM:<user@example.com>を発行します。
  2. 受信者はエンベロープ送信者からexample.comドメインを抽出します。
  3. 受信者はv=spf1で始まるexample.comのDNS TXTレコードをクエリします。
  4. 受信者はSPFレコードのメカニズムを接続元IPアドレスと照合して評価します。
  5. 結果は次のいずれかです:passfailsoftfailneutralnonetemperror、またはpermerror

SMTPトランザクション例

# 送信サーバー198.51.100.25が接続
S: 220 mx.receiver.com ESMTP ready
C: EHLO mail.example.com
S: 250-mx.receiver.com Hello
S: 250 OK
C: MAIL FROM:<alice@example.com>
# 受信者が確認します:example.comのSPFレコードは198.51.100.25を許可していますか?
# DNSルックアップ:example.com TXT "v=spf1 ip4:198.51.100.0/24 -all"
# 198.51.100.25はip4:198.51.100.0/24に一致 => 結果:pass
S: 250 OK
C: RCPT TO:<bob@receiver.com>
S: 250 OK

重要な技術的詳細

SPFレコード構文

SPFレコードはバージョンタグv=spf1で始まるDNS TXTレコードで、その後に一連のメカニズムと各々のオプション修飾子が続きます。レコードは左から右に評価され、最初に一致するメカニズムが結果を決定します。

example.com. IN TXT "v=spf1 ip4:198.51.100.0/24 ip6:2001:db8::/32 include:_spf.mailertogo.com include:_spf.google.com -all"

メカニズム

メカニズム 説明
ip4:<range> 送信者のIPが指定されたIPv4 CIDRレンジ内にある場合に一致します。
ip6:<range> 送信者のIPが指定されたIPv6 CIDRレンジ内にある場合に一致します。
a 送信者のIPがドメインのA/AAAAレコードと等しい場合に一致します。
mx 送信者のIPがドメインのMXホストの1つのA/AAAAレコードと等しい場合に一致します。
include:<domain> 別のドメインのSPFレコードを再帰的に評価します。インクルードされたドメインからのpassは一致と見なされます。
exists:<domain> 指定されたドメインのDNS Aレコードが存在する場合に一致します(高度なマクロに使用)。
redirect=<domain> 修飾子:現在のSPFチェック全体を別のドメインのレコードで置き換えます。
all すべてに一致します。通常、レコードの末尾で-allまたは~allとして使用されます。

修飾子

修飾子 結果 意味
+(デフォルト) pass 許可された送信者
- fail 許可されていない — メッセージを拒否
~ softfail おそらく許可されていない — 受け入れるがマーク
? neutral アサーションなし

10ルックアップ制限

DNS乱用を防ぐため、RFC 7208はSPF評価が、メカニズム解決につながる10を超えるDNSルックアップを必要としないことを定めています。ルックアップをトリガーするメカニズムは:includeamxexistsredirect、およびptr(非推奨)です。生のip4およびip6メカニズムはカウントされません。10ルックアップを超えるとpermerror結果が生じ、通常はSPF保護が全くないことを意味します。

MXルックアップ制限

さらに、mxメカニズムは10を超えるMX名をクエリするべきではなく、それぞれは10を超えるA/AAAAアドレスに解決されるべきではありません。ptrメカニズムは明示的に非推奨です。

マクロ展開

SPFは評価中にコンテキスト固有の値に展開されるマクロをサポートしています。一般的なマクロには%{s}(送信者)、%{l}(ローカルパート)、%{d}(ドメイン)、および%{i}(IPアドレス)が含まれます。これらは主に複雑なユーザーごと、またはIP単位のポリシーのためのexists:メカニズムで使用されます。

DNSレコード例

基本:単一IPレンジ

example.com. IN TXT "v=spf1 ip4:203.0.113.0/24 -all"

一般的:サードパーティESP + Google Workspace

example.com. IN TXT "v=spf1 include:_spf.mailertogo.com include:_spf.google.com -all"

メールを送信しないドメイン

parked-domain.com. IN TXT "v=spf1 -all"

redirectを使用

subdomain.example.com. IN TXT "v=spf1 redirect=example.com"

一般的な間違い

配信性への影響

SPFはメール認証の3つの柱の1つです(DKIMDMARCと並んで)。配信性への影響は重大です:

Related RFCs