在更改 SPF 之前,先确认你的发送服务在 envelope-from 地址中使用的域名。该地址用于接收退信,可能与收件人看到的 From 地址不同。
SPF 检查哪个域名?
SPF 检查 SMTP MAIL FROM(即 envelope-from 地址)中的域名,或服务器的 HELO 身份。HELO 是发送服务器在发起 SMTP 会话时提供的主机名。
接收方在收到 MAIL FROM 时已经知道连接 IP,因此 SPF 可以在邮件正文到达之前运行。当 envelope 发件人为空时(如 MAIL FROM:<>),SPF 使用 HELO 身份。RFC 7208(SPF 标准)还建议单独检查 HELO。
SPF 不检查可见的 From 地址。DMARC 对齐将经过身份验证的域名与该地址关联起来。
SPF 记录是什么样的?
SPF 记录是一条 DNS TXT 记录,其值以 v=spf1 开头,后跟授权规则。
example.com TXT "v=spf1 include:mailprovider.example ~all"
这里,include:mailprovider.example 授权通过该提供商 SPF 策略的 IP。~all 对其他 IP 产生 softfail 结果。请将示例提供商替换为你的发送服务发布的策略。
机制和修饰符是什么意思?
机制根据条件测试连接 IP。redirect 修饰符在没有机制匹配时委托求值。
| 术语 | 作用 |
|---|---|
ip4、ip6 | 匹配直接写在记录中的地址或网段。 |
a | 匹配指定域名返回的地址,使用连接的 IP 协议族。 |
mx | 匹配指定域名的邮件交换服务器地址。 |
include | 当引用的策略对该 IP 返回 pass 时匹配。 |
exists | 当指定的 DNS 名称存在 A 记录时匹配;宏可以根据连接信息构造该名称。 |
redirect= | 在没有机制匹配时求值另一个域名的策略;all 机制会使其失效。 |
ptr | 检查经过验证的反向 DNS 名称;不要将其添加到新记录中,因为查询速度慢且不可靠。 |
all | 匹配所有剩余 IP,由其限定符决定结果。 |
地址机制的写法为 ip4 和 ip6。ptr 条目可能出现在较旧的策略中,但 RFC 7208 不建议使用它,同时要求验证器仍需支持。
all 限定符会改变什么?
限定符设置 IP 到达 all 时的 SPF 结果;接收方据此决定如何处理邮件。
| 结尾 | 结果 |
|---|---|
-all | Fail:域名不授权该 IP。 |
~all | Softfail:域名认为该 IP 很可能未被授权。 |
?all | Neutral:域名不作任何声明。 |
+all | 对所有 IP 返回 pass,移除 SPF 原本提供的限制。 |
示例记录如何求值?
以下每个示例展示一条独立的策略。其中的 IP 和域名均为文档示例,不是你应为发件人发布的值。
| 记录 | 授权内容 |
|---|---|
v=spf1 mx ip4:192.0.2.10 ip4:198.51.100.0/24 ~all | 域名的邮件交换服务器、一个 IP 和指定的网段;其他 IP 为 softfail。 |
v=spf1 a ip4:192.0.2.0/25 ip4:198.51.100.0/26 -all | 域名的地址记录和两个网段;其他 IP 为 fail。 |
v=spf1 -all | 不授权任何 IP;使用该域名的所有尝试均 SPF fail。 |
v=spf1 +all | 所有 IP,因此不提供任何发送限制。 |
v=spf1 redirect=_spf.example.com | _spf.example.com 处的策略所授权的内容。 |
v=spf1 exists:%{i}._spf.example.com ~all | 展开后查询名称返回 A 记录的 IP;其他 IP 为 softfail。 |
对于 exists 示例,来自 192.0.2.10 的连接产生查询名称 192.0.2.10._spf.example.com。你必须自行运维使该策略生效的 DNS 记录;该模式本身不会授权某个提供商。
SPF 可以使用多少次 DNS 查询?
SPF 允许在策略和嵌套求值中总共使用十个需要 DNS 查询的术语。第十一个会产生 permerror,因此添加另一个提供商可能导致求值中断而非授权成功。
计入次数的术语包括 include、a、mx、ptr、exists 和 redirect。字面量 ip4、ip6 和 all 术语不占用该配额。计数的是术语,而非每个 DNS 数据包。return-path CNAME 提供 Bird 的 SPF 授权,无需在顶级域名添加 include。
转发的邮件为什么会 SPF 失败?
转发器或邮件列表可能从原始 envelope-from 域名未授权的 IP 重新发送合法邮件。例如,校友邮箱转发到个人邮箱会改变最终接收方看到的连接服务器。
如果 envelope-from 地址保持不变,SPF 会根据原始域名的策略评估该新服务器。转发器可以使用 Sender Rewriting Scheme (SRS) 改写 envelope-from 地址来验证自己的域名。这本身不会将 SPF 与原始可见的 From 地址对齐。
完整且对齐的 DKIM 签名仍然可以提供 DMARC pass。身份验证不能证明邮件是收件人期望的,也不能保证进入收件箱。
你应该为 Bird 发布什么?
你需要发布为发送域名提供的 return-path CNAME。它指向 Bird 的退信基础设施,该设施已提供 SPF 授权。你无需在顶级域名额外添加 SPF include 即可通过 Bird 发送。
保留现有的顶级域名 SPF 记录,不要改动其他发件人的设置。复制该域名的 dns_records。验证 capabilities.return_path.status;检查 capabilities.sending.status 以确认所有发送要求均已就绪。两个状态字段使用以下值:
| 状态 | 含义与操作 |
|---|---|
pending | 验证尚未运行或正在运行;等待结果。 |
verified | 该功能的 DNS 记录与预期值匹配。 |
warning | 之前已验证的记录不再匹配;请在宽限期结束前修复。发送尚未受影响。 |
failed | DNS 值错误;请更正。 |
temporary_failure | DNS 查询暂时失败;验证会自动重试。 |
not_configured | 该功能尚未为此域名设置。 |
你需要在发送前验证 DKIM、return-path 和 DMARC。你可以更改 return-path 主机名。如果 DNS TXT 值需要多个带引号的字符串,DNS 记录拆分工具可以格式化这些字符串,而不影响 SPF 的查询配额。