SPFとSenderIDで曖昧な部分を整理

SPFについてブログやドキュメントを読んでも何を言っているのか分からないところを整理しました。
実際に検証したところもあり、英文を探して分かったところもあります。

SPFとSenderIDはどのドメインを確認するか

  • SPFはMAIL FROMコマンド(いわゆるEnvelope From)に指定されるメールアドレスのドメイン部のSPFレコードをチェックします。
  • SenderIDはPRA(Purported Responsible Address)といって、メールヘッダーにある最終的に責任があるメールアドレスのドメイン部のSPFレコードをチェックします。
    • PRAを抽出するアルゴリズムRFC4407の2. Determining the Purported Responsible Addressに書いてあります。

下記は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の違い

  • includeはincludeの右に指定したメールサーバのSPF設定を参照する上に自分のSPF設定を追加できます
example.org. IN TXT "v=spf1 include:_spf-a.example.com include:_spf-b.example.com include:_spf-c.example.com -all"
  • redirectはredirectの右に指定したメールサーバのSPF設定しか利用できません。自分のSPF設定を追加できません。完全に委任するということです。
example.net. IN TXT "v=spf1 redirect=example.org"
  • まとめると、includeとredirectの違いは自分のSPF設定を追加できるかどうかです。