SPFとSenderIDで曖昧な部分を整理
SPFについてブログやドキュメントを読んでも何を言っているのか分からないところを整理しました。
実際に検証したところもあり、英文を探して分かったところもあります。
SPFとSenderIDはどのドメインを確認するか
- SPFはMAIL FROMコマンド(いわゆるEnvelope From)に指定されるメールアドレスのドメイン部のSPFレコードをチェックします。
- SenderIDはPRA(Purported Responsible Address)といって、メールヘッダーにある最終的に責任があるメールアドレスのドメイン部のSPFレコードをチェックします。
下記はRFC4407でPRAを求めるアルゴリズムのStep 1からStep 6までを疑似コードで書いてみたのです。
def getPRA def step2_to_step6 # step 2 if Resent-From.isEmpty if Sender.isEmpty # step 4 if From.size == 1 return From[0] else throw new Exception end else # step 3 if Sender.size == 1 return Sender[0] else throw new Exception end end else return Resent-From end end # step 1 if Resent-Sender.isEmpty return step2_to_step6() else if Resent-From.isBefore(Resent-Sender) && (Received.isAfter(Resent-From) && Received.isBefore(Resent-Sender)) || (Return-Path.isAfter(Resent-From) && Return-Path.isBefore(Resent-Sender)) return step2_to_step6() else return Resent-Sender end end end
step1で条件が複雑ですが、Resent-Sender > Resent-From > Sender > Fromの順にチェックしていて、通常はFromのメールアドレスがPRAになると考えればよさそうです。
includeとredirectの違い
example.org. IN TXT "v=spf1 include:_spf-a.example.com include:_spf-b.example.com include:_spf-c.example.com -all"
example.net. IN TXT "v=spf1 redirect=example.org"
- まとめると、includeとredirectの違いは自分のSPF設定を追加できるかどうかです。