SPF 记录中的 include 与 a 机制有什么区别?

SPF 配置中 includea 机制到底有什么区别?为什么不能随意堆叠 include?

SPF(Sender Policy Framework)通过 DNS TXT 记录声明允许使用某个域名发送邮件的 IP 地址列表。RFC 7208 定义了多种机制(mechanism)用于匹配发件方 IP,其中 ainclude 是最常用的两种,但二者语义完全不同。

a 机制:直接匹配域名 A/AAAA 记录

a 机制指示验证方查询指定域名的 A(IPv4)和 AAAA(IPv6)记录,若发件 IP 匹配其中任何一个,则为通过(pass)。例如:

v=spf1 a:mailer.domain.com -all

这意味着:发件 IP 必须出现在 mailer.domain.com 的 DNS A/AAAA 记录中才算授权。如果未指定域名,a 默认使用当前域名本身(也就是 SPF 记录所在域名)。a 机制消耗 1 次 DNS 查询。

include 机制:引用另一个域的完整 SPF 策略

include 机制指示验证方去查询并评估另一个域的完整 SPF 记录,若被引用域的策略判定为 pass,则当前域的策略也判定 pass。例如:

v=spf1 include:_spf.google.com -all

这效果等同于说:"Google 的 SPF 说能发的 IP,我也认。" include 不是简单地导入 IP 地址列表,而是递归地执行被引用域的完整 SPF 评估——包括该域自身的 all、include、a、mx 等全部机制。

关键区别总结

区别a 机制include 机制
语义匹配域的 A/AAAA 记录递归评估被引用域的完整 SPF
DNS 查询消耗1 次至少 1 次 SPF 查询 + 被引用域内部的递归查询
典型用途授权自己的某台服务器 IP授权第三方邮件服务商(如 SendGrid、腾讯企业邮)

为什么不能随意堆叠 include?

RFC 7208 第 4.6.4 节规定,SPF 评估过程中的 DNS 查询总数不得超过 10 次。每个 include 都会深度递归(每次递归也会消耗查询次数),过多的 include 链很容易突破 10 次限制,导致 SPF 结果为 permerror(永久性错误),直接影响邮件投递成功率。

最佳实践:用 amx 覆盖自有 IP,用 include 引入第三方服务商。定期使用 SPF 检查工具(如 SPF Toolbox)验证查询次数是否在限制范围内。

参考来源:RFC 7208 — Sender Policy Framework (SPF) for Authorizing Use of Domains in Email