SPF 记录里有 redirect= 和 include:,不都是引用外部域名吗?区别是什么?

36 SPF 记录里有 redirect= 和 include:,不都是引用外部域名吗?区别是什么?
核心区别

include:(机制)和 redirect=(修饰符)都引用了另一个域名的 SPF 记录,但工作方式完全不同:

• include:(包含机制)
引用目标域名的 SPF 记录,将其中的 IP 范围“扩展”到当前 SPF 记录中。不改变当前的 qualifier(限定词)。当前记录最后必须有自己的 ~all-all
示例:v=spf1 include:_spf.google.com -all
→ 只有 google.com 的 SPF 中列出的 IP 可以发信。

• redirect=(重定向修饰符)
完全用目标域名的 SPF 记录替代当前记录。如果 redirect= 出现在记录中,后面的所有机制和限定词都会被忽略
示例:v=spf1 redirect=_spf.example.com
→ 实际 SPF 策略完全由 example.com 的 SPF 记录决定。

选型原则

用 include:你的域名自己也有出信服务器,只是额外授权给第三方发信。比如自己的 MTA + 使用邮件营销平台。写法:v=spf1 mx include:thirdparty.com -all

用 redirect:你的域名完全不发信,完全由另一个域名代发。比如子域名 mail.example.com 完全委托给主域名管理。写法:v=spf1 redirect=example.com

实际案例
假设 A 公司用自家 MTA + 昆仑邮件系统托管一部分:v=spf1 mx include:spf.kunlunmail.com -all(用 include,因为自家 MTA 也要发信)。同事自己没有 MTA,完全通过昆仑邮件系统发信:v=spf1 redirect=spf.kunlunmail.com(用 redirect)。

易错点

1. include 链有限制:DNS 查询链最大 10 跳,每多一个 include 就多加一跳。redirect 算 1 跳。
2. redirect= 必须是 SPF 记录中最后一个有效元素——后面的内容均被忽略。
3. redirect= 不继承原始记录的 -all——它完全引用目标域名的整个 SPF 策略,包括它的 -all
4. 两者可一起用但少见:v=spf1 include:internal -all redirect=fallback.example.com → 先处理 include,然后 redirect 被忽略因为 -all 提前结束了。如果去掉 -all 则后续 redirect 生效。

RFC 7208 §5.2 (include) · RFC 7208 §6.1 (redirect) · RFC 7208 §10.1 (10-query limit)