邮件送达率与 DNS

SPF 记录生成器:发布前检查错误与 DNS

作者:Alexey Bulygin
使用 DNS 命令检查 SPF 记录生成器的输出

你找到了一款免费的SPF 记录生成器,勾选了所有选项,包括 Google Workspace、Mailchimp 和你的 CRM,然后把生成结果直接粘贴到 DNS 中。两周后,Gmail 可能会以 550 5.7.26 拒收你的发票邮件,Outlook 可能返回 550 5.7.515,支持队列也随之堆满。

SPF 记录生成器给出的是语法有效的内容,却不代表这条记录能正常工作。这个差距往往会影响邮件送达率。如果你还在配置完整的 DNS 体系,可以先阅读为域名设置电子邮件,因为 SPF 只是 MX、DKIM 和 DMARC 整体配置的一部分。

本指南将说明自动生成器为何可能在生产环境中失效、如何用现有工具在五分钟内审核输出,以及可用于生产环境的 SPF 记录通常是什么样子。

SPF 记录生成器实际做了什么

SPF 记录生成器是一种网页工具,它会根据你勾选的服务商,将各服务商的 include: 机制拼接成一条 TXT DNS 记录。选择发件服务后即可得到字符串。它通常不会查询你的实时 DNS,也不会统计递归查询,更不知道你的域名已有多少条 SPF 记录。

许多免费的 SPF 记录生成器本质上只是字符串拼接工具,它们能生成看起来正确的内容,却不会验证该内容是否适用于你的实际 DNS 环境。语法正确并不等于运行正常。

SPF 记录生成器容易遗漏的 3 种故障

生产环境中常见的 SPF 严重故障通常源于以下三类问题。标准 SPF 记录生成器往往无法发现它们,因为生成器既无权访问你的实时 DNS 数据,也不具备收件服务器在评估时实际采用的查询计数逻辑。

1. 双记录导致的 PermError

一个域名应当只有一条 SPF 记录。RFC 7208 明确规定,如果收件服务器发现两条以 v=spf1 开头的 TXT 记录,就会返回 PermError,也就是永久性错误。Gmail 和 Yahoo 可能会将 PermError 按未配置 SPF 的情况处理,邮件可能被退回或悄然进入垃圾邮件箱。

生成器通常不会检查现有记录。如果域名已经使用了几个月,很可能已有一条记录,可能来自域名注册商、之前的托管服务商,或三年前配置 Google Workspace 的人员。未经检查便发布生成器结果会造成重复记录,从而破坏原本可用的配置。

2. 递归查询次数限制

RFC 7208 将 SPF 评估限制为 10 次 DNS 查询。计数包括每个 include:amxexistsredirect,还包括这些 include 触发的每一次嵌套查询。SPF 记录生成器只会统计你选择的机制,通常不会计算其中嵌套的内容。

所选服务商生成器计数实际查询次数
Google Workspace14(嵌套 _netblocks.google.com 等)
Zendesk12-3
Mailchimp12
Salesforce12-3
总计410-12 → PermError

生成器显示 4 次查询,但收件服务器执行到第 #11 次时可能会中止评估,使该域名的邮件无法通过 SPF。界面中可能没有警告,也不一定会收到退信通知,问题有时要等客户反馈后才会暴露。

3. 无结果查询限制(RFC 7208 §11.1)

还有一项次级限制:返回空结果(NXDOMAIN)的 DNS 查询不得超过 2 次。include: 中的一个拼写错误就会产生一次无结果查询。出现两个此类错误时,整条 SPF 记录可能失效,即使生成器的语法检查已经通过。

示例:include:spf.trekmaill.net(多了一个“l”)。它在语法上有效,SPF 记录生成器可能会将其标记为正确。收件服务器执行查询后找不到结果,这就是无结果查询 #1。再出现一个错误的 include,整条记录便可能失效。

部署前如何审核 SPF 记录生成器的输出

发布 SPF 记录生成器提供的任何内容前,请针对实时 DNS 执行以下三项检查。通常只需五分钟,便可发现生成器容易遗漏的关键问题,包括重复记录、查询层级过深和语法错误。相关命令适用于 macOS、Linux 和 Windows 命令提示符。

步骤 1:检查现有记录

更改任何 DNS 配置前,请运行:

nslookup -type=txt yourdomain.com

如果看到两行以 v=spf1 开头的内容,就存在重复记录。发布任何新内容前,应先手动将它们合并成一条记录。

# Broken - two records, PermError guaranteed:
"v=spf1 include:_spf.google.com -all"
"v=spf1 include:spf.trekmail.net -all"

# Fixed - merged into one:
v=spf1 include:_spf.google.com include:spf.trekmail.net -all

步骤 2:统计递归查询

对记录中的每个 include: 查询其内容:

dig +short txt _spf.google.com

输出:

"v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all"

仅这一项 include:_spf.google.com 就会触发 4 次实际查询。对记录中的每个服务商重复此操作并计算总数。如果总数超过 10,就需要调整结构,常见做法是把事务邮件移至子域名(send.yourdomain.com),并为其配置更短的独立记录。

步骤 3:审核各项机制

按照下表检查 SPF 记录生成器产生的字符串:

机制状态处理方式
ptr已弃用删除。RFC 7208 明确不建议使用,该机制速度较慢且可靠性不足。
+all不安全删除。它会授权互联网上的任何来源以你的域名发送邮件。
ip4: 1.2.3.4语法无效删除空格,必须写成 ip4:1.2.3.4
?all较弱避免使用。中性策略无法提供有效的仿冒防护。
~all可接受SoftFail。可在迁移期间使用,不建议作为永久设置。
-all适用HardFail。未获授权的发件来源可能被拒绝,生产环境中通常使用此设置。

SPF 语法检查清单

无论初稿来自 SPF 记录生成器还是手动编写,都应在修改 DNS 前完成以下检查。这些项目涵盖生成器可能无法发现的故障,包括重复记录、递归查询限制和不安全的策略标记。

  1. 每个域名一条记录。如有重复,请先合并,不要发布两条记录。
  2. v=spf1 开头。不要使用变体,字符串应准确无误。
  3. -all~all 结尾。不要使用 +all?all
  4. IP 写在 include 之前。ip4:ip6: 机制不消耗 DNS 查询次数,把它们列在前面有助于加快评估。
  5. 不要自我引用。include:yourdomain.com 会形成无限循环,应将其删除。
  6. 不要手动展开 IP,除非有自动化机制持续更新。若 Google 轮换 IP 而记录没有同步更新,邮件可能在没有明显提示的情况下发生故障。
  7. 查询总数 ≤ 10。计算所有查询,包括嵌套 include。

一条可用于生产环境的记录示例:

v=spf1 ip4:192.0.2.1 include:spf.trekmail.net include:_spf.google.com -all

IP 在前(不消耗查询次数),include 在后,末尾使用硬失败机制,结构就是这样。

为什么代理机构和中小企业不再只依赖 SPF 记录生成器

对于只有一个域名和一两个发件来源的场景,SPF 记录生成器通常可以满足起步需求。一旦规模扩大,例如代理机构管理数十个客户,或中小企业使用完整的 SaaS 工具栈,它就可能成为反复出现的运营风险,因为缺少对整个域名组合中查询次数和重复记录的集中视图。

传统做法是为每个客户单独创建 SPF 记录,每次使用不同的生成器会话,也没有审核记录。某个域名达到查询上限后,可能过了三天才有人发现,客户的送达信誉也可能因此受损。

如需从企业层面全面了解如何保护邮件基础设施,请参阅企业邮件安全指南,其中介绍了 SPF 之外的完整基础配置。

TrekMail 如何减少 SPF 生成器带来的问题

SPF 的复杂性主要来自管理多个第三方发件来源,同时还要保持在 10 次查询上限以内。对于主要邮件基础设施,TrekMail 可帮助减少这两方面的复杂性,因此核心发信域名通常不必反复运行 SPF 记录生成器、统计嵌套查询或审核各种机制。

面向中小企业:一个 Include,简化维护

使用 TrekMail Starter 套餐($3.50/月)时,出站投递通过 TrekMail 的托管 SMTP 运行。你的 SPF 记录可以简化为一行:

v=spf1 include:spf.trekmail.net -all

TrekMail 在该 include 后端管理 IP 轮换和发件信誉,因此通常无需频繁修改记录,也不必再次运行 SPF 记录生成器。六个月后新增 SaaS 工具时,仍应根据实际发件配置确认是否需要重新审核查询。

面向代理机构:一个模板,适用于各客户

传统做法是:100 个客户,通过 100 次不同的生成器操作建立 100 条 SPF 记录,每条记录都有各自的递归查询风险,其中任何一条都可能在没有及时警报的情况下失效。

TrekMail 的做法是:在各客户域名中使用同一个模板:

v=spf1 include:spf.trekmail.net -all

使用 Agency 套餐($23.25/月)时,你可以从一个控制面板管理 1,000+ 个域名。将 TrekMail 标准化用于企业邮件,有助于减少核心通信渠道中的递归查询问题。如果你正在扩展多域名配置,请了解多域名邮件托管如何改变管理方式。

关于 TrekMail 除 SPF 外还需要的完整 DNS 配置,包括 MX、DKIM 和 DMARC,请参阅必需的 DNS 记录文档,其中集中介绍了全部四类记录。

SPF 记录生成器常见问题

首次使用 SPF 记录生成器后,如果得到的记录无法正常工作,通常会出现以下问题。它们都与语法验证和运行验证之间的差异有关:前者是生成器检查的内容,后者则需要检查实时 DNS。

可以用两个生成器交叉核对输出吗?

可以,但运行第二个 SPF 记录生成器并不能解决核心问题。两个工具可能给出两个不同的字符串,而且都不一定能发现实时 DNS 中的重复记录,也未必能准确统计递归查询。上文的命令行步骤通常是更可靠的检查方式。

生成器显示记录有效,为什么邮件仍被退回?

在 SPF 记录生成器中,“有效”通常只表示语法正确,并不表示该记录能在你的环境中正常工作。造成这种差异的两个常见原因是:重复记录触发 PermError,或递归查询次数超过 10。两者都需要检查实时 DNS,仅靠界面验证无法确认。

什么时候使用 -all,什么时候使用 ~all

生产环境通常使用 -all(HardFail),未获授权的发件来源可能被直接拒绝。只有在迁移期间尚未确认已列出每个发件来源时,才考虑使用 ~all(SoftFail)。它应当是一种临时状态,而不是最终配置。若 SPF 记录生成器默认使用 ?all+all,它往往更侧重于让配置看似可用,而不是提供合适的送达策略。

简要总结

免费的 SPF 记录生成器可以作为起草字符串的合理起点,却不适合直接作为生产配置的终点。它容易遗漏的三类故障,包括重复记录、递归查询超限和无结果查询错误,可能造成不易察觉的退信和 PermError,而且排查往往需要较长时间。

解决方法通常不是换一个更好的 SPF 记录生成器,而是花五分钟完成命令行审核:检查重复记录、统计嵌套查询,并检查各项机制,然后再发布。

如果希望跳过生成器流程,TrekMail 可以将出站发信整合到一个 include: 中。DNS 中只需一行核心配置,也能减少查询计算和 PermError 排查工作。

开始 14 天免费试用,需要信用卡,可随时取消。

分享这篇文章

我们使用运行和保护 TrekMail 所必需的技术。确认后还会允许《Cookie 政策》中所述的有限分析和广告衡量。

登录 TrekMail

访问您的控制面板、邮箱和 DNS。

12 个字符 两次密码一致

重置邮件已发送

如果该邮箱对应已有账户,我们已发送密码重置说明。

继续即表示您同意 TrekMail 的 服务条款隐私政策.