邮件送达率与 DNS

SPF 查询限制:如何解决 DNS 参照超限问题

作者:Alexey Bulygin
SPF 查询限制与嵌套 DNS 引用示意

SPF 查询限制的核心很简单:如果评估 SPF 策略需要超过 10 个触发 DNS 查询的项,接收方可以停止处理并返回永久错误。因此,即使邮件的 DNS 设置看起来正常,实际认证仍可能失败。如果你正在整理域名邮箱,可以先阅读小企业商务邮箱,再回来处理这个往往在后续才暴露的问题。

很多团队都会遇到这种情况:先接入 Google Workspace,再接入 Microsoft 365、Mailchimp、CRM 和客服系统。每家供应商都说:“加上我们的 include 就行。”几个月后,SPF 记录语法依然有效,实际评估却可能失败。邮件开始进入垃圾邮件文件夹,有些还被退回。由于记录乍看并无异常,团队往往找不到原因。

好消息是,解决办法通常并不复杂:删除停用的条目;确有需要时才使用 `mx`;将营销邮件转移到子域名;让主域名的配置保持简洁。

什么是 SPF 查询限制?

SPF 查询限制是 RFC 对评估过程中触发 DNS 查询的 SPF 项设定的上限。接收方在整个 SPF 评估路径中不得处理超过 10 个此类项,嵌套的 `include` 链也要计入。如果策略超过限制,SPF 可能返回 `permerror`,邮件就会失去一个重要的认证信号。

RFC 7208规定了这项规则,目的是避免 SPF 产生过多 DNS 流量或被用于 DNS 放大。这不是可选建议,而是协议限制。

容易忽略的是,SPF 查询限制采用累计计数。主记录不是可以使用 10 次,然后每个 include 再各用 10 次。整个实际评估路径共用一个预算。

SPF 机制查询开销实用建议
include:1很常见,但嵌套 include 会快速累积开销
a1适合小型配置,但往往并非必要
mx1+通常不适合作为出站发送授权方式
ptr1+避免使用;RFC 7208 明确不建议使用
exists1不常见,容易配置不当
redirect=1适用于特定设计,但仍占预算
ip4 / ip60SPF 评估时不触发 DNS 查询
all0仅定义最终策略,不触发查询

为什么看似正常的记录会被 SPF 查询限制影响

SPF 查询限制会影响看起来没有问题的记录,因为 SPF 不关心主 TXT 记录是否整齐,而是关心实际评估链中 include、redirect、`a` 和 `mx` 等触发 DNS 的项。表中的开销是简化示意,不能直接当作底层 DNS 数据包数量。

例如:

你发布 `v=spf1 include:_spf.google.com include:spf.protection.outlook.com include:servers.mcsv.net -all`,以为只用了三次查询。其实 Google 和 Microsoft 的记录可能继续引用其他记录。可见的记录很短,完整评估路径却未必短。

所以,SPF 查询限制经常不是第一天就出问题。供应商调整自己的 SPF 树后,即使你没有修改 DNS,评估开销也可能增加。

还有一个陷阱:空查询,也叫 void lookup。RFC 7208 建议实现将空查询限制为两次。空查询指返回无数据响应或 `NXDOMAIN` 的 DNS 查询。一个 include 拼写错误不一定导致失败,但两个无效引用就可能触发问题。此时,除了SPF 查询限制,还可能出现 `permerror`,即使总数仍低于 10。

Google 公布的发件要求也说明了后果:批量发件人的认证缺失或配置错误,可能导致邮件被放入垃圾邮件文件夹或被拒收。Google 文档要求此类发件人配置 SPF、DKIM 和 DMARC;不符合发件要求的邮件可能被拒收或归入垃圾邮件。参阅Google 发件要求常见问题

如何计算 SPF 查询预算的使用量

要检查SPF 查询限制,从主 SPF 记录开始,沿实际评估路径累计所有触发 DNS 的机制。既要看自己的项,也要看供应商记录中的下层引用。可先展开递归树检查潜在路径;若某条实际路径超过 10,评估可能失败。

先查看主记录:

dig +short txt example.com

示例输出:

"v=spf1 include:_spf.google.com include:spf.protection.outlook.com -all"

再检查每个被引用的域名:

dig +short txt _spf.google.com

dig +short txt spf.protection.outlook.com

继续追踪,直到只剩 `ip4`、`ip6` 或终止策略项。

按以下方式计数:

  1. 计入实际遇到并评估的每个 includeamxptrexistsredirect
  2. 也要计入被包含记录中实际评估的嵌套项。
  3. 不要计入 ip4ip6all
  4. 标记所有不返回数据的 include 目标,它们可能造成空查询问题。

在 TrekMail 中设置域名时,如果想快速检查 DNS,可以先阅读检查 DNS 状态必需的 DNS 记录文档。

常见的 SPF 查询限制配置错误

多数SPF 查询限制问题来自几类重复出现的错误:在主域名上叠加供应商、保留旧服务商、用 `mx` 代替明确授权,以及手动展开记录却没有维护流程。这些通常不是特殊技术难题,而是 DNS 配置长期缺乏整理的结果。

最常见的情况包括:

错误影响更好的做法
保留旧供应商浪费查询预算,并扩大风险删除已不再用于发信的服务
mx 授权出站发送接收邮件的 MX 主机往往不是实际发件主机明确授权真正的发送系统
使用 ptr速度慢、不推荐,也容易出错删除它
所有邮件都从同一域名发送营销和事务邮件共用一个 SPF 预算将邮件流分配到不同子域名
手动展开 SPF供应商更换 IP 后可能失效自动更新,或避免展开

团队还容易把可见复杂度和实际复杂度混为一谈。一个供应商 include 展开后可能消耗多个查询项。因此,面对SPF 查询限制,“再加一个发件服务”并不是可靠的规划方式。

为某项业务选择转发、别名还是独立邮箱时,也要考虑它与发件配置的关系。相关阅读:域名邮箱别名与邮箱的区别以及邮箱别名转发

如何降低 SPF 查询开销,减少对邮件的影响

处理SPF 查询限制时,风险较低的做法是减少策略复杂度,而不是继续叠加补丁。先清理停用的发送服务,再将高流量系统移至子域名。只有能够自动保持更新时,才考虑展开 SPF。

1. 删除冗余配置。

删除不再使用的供应商,移除 `ptr`,并用实际需要的发件授权替代 `mx`。许多有问题的策略经过一次清理,就能重新满足SPF 查询限制

2. 按子域名拆分邮件流。

对于不断增长的团队,这通常是更实用的方案。

; Primary company mail
example.com.              TXT  "v=spf1 include:spf.trekmail.net -all"

; Marketing mail
marketing.example.com.    TXT  "v=spf1 include:servers.mcsv.net include:hubspotemail.net -all"

; Transactional app mail
notify.example.com.       TXT  "v=spf1 include:amazonses.com -all"

每个子域名都有自己的 SPF 策略和查询预算。这有助于减轻主域名负担,也让SPF 查询限制更容易管理。

3. 将展开 SPF 作为最后选择。

展开 SPF 会把 include 替换为直接列出的 IP 范围:

; Before
v=spf1 include:vendor-a.example include:vendor-b.example -all

; After
v=spf1 ip4:192.0.2.10 ip4:192.0.2.11 ip4:198.51.100.0/24 -all

这样能将查询开销降至接近零,却增加了维护负担。供应商更换 IP 后,旧记录可能导致认证失败。如果采用展开方案,应自动更新。

旧方式与新方式:用 TrekMail 管理 SPF 查询限制

处理SPF 查询限制的旧方式,是不断把邮箱供应商、营销平台和中继堆到同一主域名上,直到 DNS 配置难以追溯。新方式则是减少依赖,并从一开始就区分发件角色。

旧方式:主域名 SPF 记录拥挤,旧供应商仍然保留,营销邮件与日常邮箱邮件混用,谁有权发信也缺乏明确责任人。

新方式:简化邮箱托管,把大批量发件服务放到子域名上,并为主域名保留简短且有余量的 SPF 策略。

TrekMail 可以帮助简化这种配置。使用付费套餐的托管发送时,所描述的 DNS 设置需要在 SPF 记录中加入 `include:spf.trekmail.net`。该 include 本身计为一次查询项,是否存在下层引用仍应检查。文中介绍的套餐起价为 $3.50/月,并列出自定义域名、IMAP 邮箱、catch-all、邮箱转发、内置迁移工具和 API 访问。付费套餐描述了 14 天免费试用,需要信用卡;Nano 则描述为持续免费的非试用套餐,使用 BYO SMTP。配置前请确认当前价格、功能和条件。

使用 Nano 时,可以由 TrekMail 提供邮箱层,发送则交给 SES、Mailgun 或其他中继。应认真规划子域名,避免主域名策略触及SPF 查询限制。TrekMail 的自定义 SMTP(BYO)托管 TrekMail SMTP从控制面板启动迁移文档介绍了操作方法。

如果正在整合多个域名,也可以阅读多域名邮箱托管在自己的域名上设置邮箱

总结:如何保持在 SPF 查询限制以内

要满足SPF 查询限制,关键是让策略保持简单。主域名只保留必要的发送服务,把批量邮件和应用邮件移至子域名,每接入一个新工具就重新检查供应商 include。策略接近 10 时,就应提前减少开销。

SPF 查询限制不是只存在于 RFC 中的理论边界,而是实际运行中的硬性约束。不断叠加供应商会让它越来越难管理。保持记录简短,明确 DNS 配置负责人。否则,让五家供应商共用一个有限的认证路径,可能会让你在凌晨 2 点还在排查邮件头。

如果想简化配置,TrekMail 描述的服务包括按固定费用托管多个域名、不按用户收费、共享存储、内置 IMAP 迁移,以及 BYO SMTP 或 TrekMail 托管 SMTP 的选择。请在TrekMail 价格页核实当前套餐,或直接访问TrekMail

分享这篇文章

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

登录 TrekMail

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

12 个字符 两次密码一致

重置邮件已发送

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

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