# SPF(Sender Policy Framework) SPF(Sender Policy Framework)は、送信ドメインがDNSのTXTレコードでメールの送信を許可するIPアドレスを公開し、受信側のSMTPサーバが送信元IPアドレスの正当性を検証する仕組み ## 検証の流れ 1. **メールの送信** ... 送信側のSMTPサーバが、受信側のSMTPサーバにメールを送信 2. **送信元ドメインの取得** ... 受信側のSMTPサーバが、エンベロープFrom(MAIL FROM)から送信元ドメインを取得 3. **SPFレコードの取得** ... 送信元ドメインのDNSに問い合わせ、SPFレコード(TXTレコード)を取得 4. **IPアドレスの照合** ... 実際に接続してきた送信側SMTPサーバのIPアドレスが、SPFレコードで許可されているかを確認 5. **検証結果の判定** ... 照合結果に応じて、pass(認証成功)やfail(認証失敗)などの結果を返す ## SPFレコードの設定例 特定のIPv4アドレスのみ許可する: ``` v=spf1 ip4:192.0.2.1 -all ``` - IPアドレスで指定する場合、`ip4:`もしくは`ip6:`をプレフィックスに用いる 複数のIPv4アドレスを許可する: ``` v=spf1 ip4:192.0.2.1 ip4:192:.0.0.2 -all ``` Aレコードに登録されたIPアドレスを許可する: ``` v=spf1 a -all v=spf1 a:mail.example.com -all ``` MXレコードが指すIPアドレスを許可する: ``` v=spf1 mx -all ``` 外部のメール送信サービスを利用する場合: ``` v=spf1 include:_spf.example.com -all ``` ## 補足:SPFレコードの識別 素朴な疑問: > SPFレコードってただのTXTレコードだから、複数のTXTレコードがあっても大丈夫なのだろうか 複数のTXTレコードが登録されている場合: ``` example.com. IN TXT "v=spf1 ip4:192.0.2.1 -all" example.com. IN TXT "google-site-verification=xxxxxxxx" example.com. IN TXT "example-verification=yyyyyyyy" ``` - `v=spf1`で始まるレコードがSPFレコードとして識別される - SPFレコードが複数存在する場合はNG