SPF 记录怎么生成?从发信 IP 到 TXT 内容逐项核对
给域名配置 SPF,先要知道哪些服务器确实代表它发信。网站所在的 IP、接收邮件的 MX、第三方邮件服务,不一定是同一套资源。没有核对发信来源,就把生成器里的选项全部打开,可能把授权范围写得比需要的大。
本文使用 example.com、文档保留地址 192.0.2.10 和虚构的 _spf.example.com,演示宝塔拨测 SPF 记录生成器的操作。它们不是可直接用于生产发信的配置;本次只生成文本,没有修改 DNS,也没有发送邮件。
先生成一条只包含演示 IP 的记录
进入「站长工具 → SPF 记录生成」。填写:
- 域名:
example.com。 - IPv4:
192.0.2.10。 - MX 和 A:保持
No。 - IPv6 和引用 SPF:留空。
- 策略:先保留
-all · Fail,用于看清生成结构。

页面会随输入自动更新,不需要另找“生成”按钮。本次 SPF 内容为:
v=spf1 ip4:192.0.2.10 -all
v=spf1 标明版本,ip4:192.0.2.10 列出授权的 IPv4,最后的 -all 对前面未匹配的来源给出 Fail 判断。这里展示的是规则含义,不是对任何一次真实投递的检测结果。
SPF 主要核对 SMTP 会话中的发信 IP 与 MAIL FROM 等身份使用的域名,不是单看收件人界面里显示的发件人名称。因此,正式整理授权范围时,应从邮件服务商提供的发信配置和实际邮件头入手,不要凭网站地址猜。
BIND 整行和 SPF 内容不要复制混了
页面同时给出 BIND 与 SPF 两种展示。本例 BIND 为:
example.com. IN TXT "v=spf1 ip4:192.0.2.10 -all"

如果 DNS 控制台已经分别提供“类型、主机记录、记录值”,通常应选择 TXT 类型,把 v=spf1 ... 这段内容放进记录值,不能把整行 example.com. IN TXT 一起贴进去。BIND 整行适用于相应的区域文件语法,具体仍以 DNS 产品的输入格式为准。
页面下方的记录预览在本例显示主机为 @,表示当前区域的根域。若实际要配置的是发信子域名,应确认完整记录名和 DNS 区域,不能看到 @ 就照填到任何域名下。复制后还要核对是否多了换行、外层引号或漏掉末尾策略。
引用邮件服务商的 SPF,先确认来源
在「引用 SPF」中填入 _spf.example.com,再将策略改成 ~all · SoftFail。本次结果变为:
v=spf1 ip4:192.0.2.10 include:_spf.example.com ~all

输入框里填写域名,生成器会加上 include:,不用再把这个前缀写一遍。本例的引用域名只是模拟输入,没有验证它存在 SPF,也没有证明它能授权任何真实邮件服务。生产环境应使用邮件服务商明确提供的引用域名,并先确认该服务确实替你发信。
-all、~all、?all 分别对应未匹配来源的 Fail、SoftFail、Neutral 结果。收件系统最终怎样接收、标记或拒绝邮件,还受自身策略影响,不能把某个选项解释成“必定进入收件箱”或“必定直接拒收”。在发信来源尚未整理完整时,也不应只为让文字更严格就贸然更改策略。
本次另把 A 和 MX 改为 Yes,输出增加了 a mx。这两个机制会依据域名相关地址记录参与授权,不是单纯的说明文字。只有这些服务器也属于预期发信来源时才应选择;存在网站或收信 MX,本身不足以成为开启理由。
文本出来后,还要检查现有记录和查询限制
发布前先查询当前域名的 TXT,找出已有的 v=spf1 记录,整理原有来源后合并。不要为每个邮件服务商再新增一条独立 SPF 记录;同一个名称下存在多条 SPF 记录会造成错误,其他用途的 TXT 则不必因此删除。
还要检查 DNS 查询限制。RFC 7208 对 SPF 评估过程中会引发 DNS 查询的机制与修饰项规定了最多 10 项的上限,涉及 include、a、mx 等,嵌套引用也要计入;这不是“最多能写 10 个 IP”。ip4 和 ip6 本身不占这项查询额度,超出限制可能得到 PermError。
生成器显示出一行文本,没有替你证明引用链存在、查询次数合规或现有 DNS 已更新。完成真实 DNS 配置后,应重新查询公开 TXT,并结合实际测试邮件的认证结果核对发信来源。即使 SPF 通过,也不能据此承诺送达率或收件箱位置,DKIM、DMARC 与收件方判断仍需分别检查。