邮件送达率与 DNS

创建 SPF 记录:规划发信来源与 DNS 查询预算

作者:Alexey Bulygin
展示 SPF 记录 DNS 配置及相关查询链结构的示意图

如果你需要为域名创建 SPF 记录,目标很简单:授权正确的发件服务,不要把 DNS 配置堆成半年后就会出问题的乱局。故障往往从同一个过程开始:先接入一个服务商,再加一个。随后 Microsoft 返回 550 5.7.515,Google 返回 550 5.7.26,你只能在晚上 11 点翻查 TXT 记录。

问题就在这里。SPF 看起来容易,直到根域名的记录变成各种服务的公共授权清单。递归 include 越积越多,再多评估一个会触发 DNS 查询的项,就可能出现 PermError。对于企业域名、客户邮件系统或多品牌环境,这不是小问题:收件方可能根据自己的策略拒收邮件。想先了解域名配置的整体思路,可以阅读小企业的商务邮箱

这篇指南介绍一种更稳健的架构:企业日常邮件留在根域名,批量邮件和应用邮件按子域名拆分,并把查询预算当作有限资源。这样创建的 SPF 记录通常不必频繁整体重写,但仍需要定期检查和维护。

为什么很多 SPF 记录会出问题

SPF 评估限制的是会触发 DNS 查询的项数,而不是所有 DNS 数据包的总数。在同一个域名上叠加过多 include,检查可能超出限制并返回 PermError。即使语法看起来正确,收件方也可能根据其策略拒收;PermError 本身并不意味着一定拒收。

RFC 7208 对此有明确规定。触发 DNS 查询的项包括 includeamxptrexistsredirect。收件方必须将评估时的总数,包括递归评估,限制在 10 以内。超出后得到的是永久错误,不是警告。同一主机名存在多条 SPF 记录也会导致 PermError,但与 SPF 无关的其他 TXT 记录可以共存。

这就是常见建议不够可靠的原因。一般教程让你把所有发件服务塞进 @ 下的同一个 TXT 值。表面上很整齐,实际上让根域名同时承载邮件简报、客服系统、应用通知、客户开发工具和员工邮箱的授权。某个服务商扩展 include 链,就可能影响整个根域名的 SPF 检查。

不理想的做法:用根域名的一条 SPF 记录,授权公司曾经使用过的所有工具。

Google 的发件人指南也强调正确认证和清晰的域名对齐,尤其是批量邮件。SPF 只是其中一环,但 SPF 出错往往是最先显现的问题。

真正的限制:10 项 DNS 查询预算

硬性规则是:SPF 评估最多使用 10 个触发 DNS 查询的项。预算按递归计算。如果评估某个 include 时还需要评估更多此类项,它们也计入总数。DNS 服务商再可靠,也无法弥补过度堆叠的 SPF 结构。

计入预算的项:

  • include
  • a
  • mx
  • ptr(不要使用)
  • exists
  • redirect

不计入预算的项:

  • ip4
  • ip6
  • all

无结果查询,也就是 void lookup,同样值得注意。RFC 7208 建议收件方把这类查询限制为两次。include 目标中的拼写错误可能消耗部分额度。错误引用在超过建议上限时可能引发另一种 PermError;仅仅达到上限并不等于超限。

机制计入查询预算?运维提示
include:spf.trekmail.net也要检查当前的递归链
include:vendor.example可能继续展开更多 include
ip4:203.0.113.10适合完全可控的静态发件地址
mx经常被过度使用或误解
ptrSPF 不建议使用,应省略
-all明确规定未授权发件人的处理结果

如果一个域名通过四五家服务商发信,最好尽早核算预算。问题不在于 SPF 天生脆弱,而在于服务商的递归链可能给架构带来压力。

用分流架构创建 SPF 记录

稳健的做法是将日常人工邮件与批量邮件、应用邮件分开。主要邮箱服务使用根域名,营销、客服平台和应用发件服务使用子域名。不过,只有实际 MAIL FROM 或 Return-Path 使用对应子域名,才会拥有独立的 SPF 预算。仅修改用户看到的 From 地址并不能实现隔离。DMARC 仍需要对齐的 SPF 或 DKIM 认证,严格对齐和宽松对齐的要求也不同。

架构如下:

  1. 根域名 @ 用于日常人员之间的邮件。
  2. 邮件简报、客服、交易通知等专用邮件流使用子域名,并正确配置邮件信封域名。
  3. 每个主机名只保留一条 SPF 记录。删除重复和遗留 SPF 记录;无关的 TXT 记录可以保留。

TrekMail 托管发件的根域名记录示例,使用前应确认符合当前服务商要求:

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

结构清晰:一个 include,一条明确策略。不过,仍需检查其递归评估和完整的实际发件人清单。

营销子域名示例:

v=spf1 include:servers.mcsv.net include:hubspot.com -all

这些服务商值只是示例,不是通用配置。请查阅 Mailchimp 和 HubSpot 当前的官方指南,包括是否支持以及如何配置自定义 MAIL FROM。只有 SPF 实际针对 marketing.example.com 评估时,其预算才与 example.com 上的企业邮件预算分开。

旧做法分流做法
根域名授权所有发件服务根域名只授权主要邮箱的邮件流
一家服务商变更可能影响全部外发邮件SPF 故障可以局限于相应的信封子域名
所有服务共享查询预算每个实际参与 SPF 检查的域名有自己的预算
SPF 经常需要整体重写架构更能适应服务商变更,但仍需检查

TrekMail 也可以融入这样的架构。其域名设置文档将 include:spf.trekmail.net 列为基础 include,DNS 检查工具可帮助发现冲突,但不能代替完整的发件人核查。如果你还在添加邮箱和配置 DNS,可以参考向 TrekMail 添加域名检查 DNS 状态,以当前配置要求为准。

逐步创建 SPF 记录,不靠猜测

要让 SPF 便于维护,应先列出所有发件服务,再为每个服务分配合适的主机名,最后才创建 TXT 记录。不要从 DNS 界面开始,而应先明确谁负责什么邮件流,避免把不必要的 include 堆到根域名上。

按以下流程操作:

  1. 列出所有代表你的域名发信的服务。
  2. 把每个服务归类为企业邮件、交易邮件、客服或营销。
  3. 确定每个服务使用的主机名和实际 MAIL FROM 域名。
  4. 为该域名采用最精简且正确的 SPF 策略。
  5. 每个主机名发布一条 SPF TXT 记录,其他用途的 TXT 记录独立保留。
发件服务邮件类型主机名示例
TrekMail企业邮件@
Amazon SES应用通知alerts.example.com
Mailchimp邮件简报news.example.com
Zendesk客服工单support.example.com

然后根据服务商官方要求和信封域名配置创建实际记录。

TrekMail 托管 SMTP 示例:

Type: TXT
Host: @
Value: v=spf1 include:spf.trekmail.net -all
TTL: 3600

Nano 套餐或混合环境中 TrekMail 加自备 SMTP 的组合示例,仅适用于确实需要同时授权这两条发件路径的情况:

Type: TXT
Host: @
Value: v=spf1 include:spf.trekmail.net include:amazonses.com -all
TTL: 3600

自备 SMTP 时,应在对应信封域名上授权实际使用的 SMTP 服务商,而不是自动加入 TrekMail、Amazon SES 或其他人的 include。使用 SES 尤其要核对当前自定义 MAIL FROM 要求。本文所述 Nano 模式需要你自行提供外发 SMTP 服务。所引用的产品示例称,付费套餐从每月 $3.50 起并包含托管 SMTP,Nano 为长期免费套餐;付费套餐提供 14 天免费试用,需要信用卡。这些信息受当前套餐条款约束。配置说明见自备 SMTP(BYO)TrekMail 托管 SMTP

发布并验证记录

创建 SPF 文本后,将其作为 TXT 记录发布,并检查公共 DNS 返回的结果。不要只相信注册商界面、控制台缓存或某个工具的绿色标记。以下命令通常查询递归解析器,可能返回缓存结果,并不保证直接查询权威 DNS 服务器。确认只有一条有效 SPF 记录,同时考虑各处缓存的有效期。

Mac 或 Linux:

dig txt example.com +short

Windows:

nslookup -type=txt example.com

你应看到一条以 v=spf1 开头的 SPF 值,而不是多条 SPF,也不是当前记录旁边还留着三年前迁移时忘记删除的记录。其他 TXT 记录本身不会构成 SPF 冲突。

快速检查:

  • v=spf1 开头
  • 在完成测试和完整发件人盘点后,以 -all 结尾
  • 只包含实际需要的发件服务
  • 每个主机名只有一条 SPF 记录

迁移到新服务商时,旧 MX 和 SPF 记录经常一起遗留。TrekMail 的 DNS 文档提醒了这类冲突;应核对适用于本次迁移的具体步骤。若要进行更全面的平台迁移,可以参考如何创建自定义域名邮箱多域名邮件托管

常见 SPF 错误与快速处理

常见 SPF 故障主要来自查询预算超限、重复 SPF 记录、发件域名错误,以及 include 拼写错误。有清晰的发件服务映射,问题更容易发现;随意拼凑配置则会让排查迅速变得费时。

错误常见含义快速处理
PermError查询预算超限、语法错误或存在多条 SPF 记录保留一条正确 SPF 记录并缩减 include 链
TempErrorDNS 超时或临时查询失败稍后重试,再检查 DNS 可用性
550 5.7.515Microsoft 拒绝了认证结果检查 SPF、DKIM、DMARC 和域名对齐
550 5.7.26Google 拒收认证不足的邮件修复 SPF 或 DKIM,并验证 DMARC 对齐

两条实用规则能减少很多麻烦:

  1. 完全可控且地址固定的发件服务可使用 ip4,它不消耗 SPF 的 DNS 触发项预算。
  2. 没有充分理由,就不要让营销平台与管理层邮件共用同一个信封域名。这里的隔离不能只靠可见 From 地址。

Google 的发件人文档明确了真正的目标:认证加域名对齐,而不是单独让 SPF 通过。即使 SPF 通过,如果认证域名与可见 From 域名不符合要求,邮件仍可能无法通过策略检查。DMARC 接受对齐的 SPF 或 DKIM,具体取决于所配置的严格或宽松模式。排查批量邮件投递问题时,可阅读Google 邮件发件人指南常见问题

TrekMail 在哪些情况下可以简化配置

当你希望多个域名的 SPF 配置保持简洁时,TrekMail 可以作为一种选择。本文介绍的运营特点包括 TrekMail include、共享存储、非按用户计费、内置 IMAP 迁移,以及根据套餐和发件模式选择自备或托管 SMTP。功能是否可用、限制和设置方式以当前产品为准;单个 include 也需要检查递归链。

对独立创业者,这种方案可能更简单:让根域名邮件结构清晰,用 TrekMail 托管邮箱,避免按席位付费。对团队,统一配置有助于接入员工。代理机构和 MSP 可以在大量域名上复用同一架构,但每个域名和服务商要求仍需单独核查。

与其为每个客户搭建不同且脆弱的 SPF 组合,不如采用可重复的架构、统一控制台和经过验证的根域名 include。这改善的是运维模式,不只是 TXT 字符串,但也不代表无需维护。

本文引用的 Nano 示例提供 10 个域名、5GB 共享存储和自备 SMTP,无需信用卡。需要托管发件或更高限额时,文中列出的付费套餐从每月 $3.50 起,提供 14 天免费试用并要求信用卡。决定前请在TrekMail 价格页面核对当前功能、限额和条款。

总结:先设计 SPF 架构,再减少反复修改

要创建能长期使用的 SPF 记录,不要只想着根域名上的庞大许可清单,而应从架构入手:日常邮件使用根域名,专用邮件流使用正确的信封子域名,尽量少用 include,完整核查发件人后明确设置 -all,发布后检查 DNS。

这种做法有助于控制查询预算、减少意外故障,并简化服务商变更,但不能保证 SPF 永远不需维护。如果你正在重建邮件系统,可以了解TrekMail,判断当前方案是否适合业务增长。

分享这篇文章

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

登录 TrekMail

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

12 个字符 两次密码一致

重置邮件已发送

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

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