电子邮件认证完全指南:SPF、DKIM 和 DMARC 配置详解
你发送的每封电子邮件都会声明:”我被允许代表此域发送。”SPF、DKIM 和 DMARC 是三条 DNS 记录,让接收服务器验证该声明。配置正确,你的邮件将进入收件箱;配置错误——或干脆忽略——Gmail、Yahoo 和 Outlook 会越来越多地将其发送到垃圾箱或直接拒收。
自 2024 年以来,Gmail 和 Yahoo 要求批量发件人设置 SPF、DKIM和 DMARC 策略。这是一份实用的、可直接复制粘贴的指南,帮助你正确设置这三项、从命令行验证它们,以及在不破坏现有邮件的情况下推出 DMARC 策略。
如果你首先想要每一项的概念背景,请参见什么是 DKIM?、什么是 SPF 记录?和什么是 DMARC?。这篇文章是那三篇的实操配套指南。
90 秒心智模型
这三条记录回答关于邮件的三个不同问题:
- SPF — “此服务器是否被允许为此域发送?” 一条 DNS
TXT记录,列出获得授权发送的服务器/服务。针对信封发件人(Return-Path)进行检查,而非可见的 From:。 - DKIM — “此邮件确实由域授权,且未被修改抵达?” 发件人用密钥对每条邮件进行加密签名;公钥存在 DNS 中。有效签名证明真实性和完整性。
- DMARC — “如果 SPF 或 DKIM 失败,我应该怎么做,以及向哪里报告?” 一条策略记录,将 SPF 和 DKIM 绑定到可见的 From:域(这种绑定称为对齐),告诉接收方是否隔离或拒绝失败,并请求报告。
SPF 和 DKIM 进行检查;DMARC 将这些检查转化为策略并为你提供可见性。你需要全部三项。
SPF:授权你的发件人
SPF 是显示在你信封发件人中的域上的单条 TXT 记录。如果你通过 MailerToGo 从 mtg.yourdomain.com 发送:
mtg.yourdomain.com. TXT "v=spf1 include:_spf.mailertogo.net ~all"
include:_spf.mailertogo.net引入 MailerToGo 的授权发送 IP(由我们管理并保持最新——你永远不需要硬编码 IP)。~all是一个软失败(标记但接受未授权发件人);一旦你确信每个合法发件人都已列出,就改为-all(硬失败)。
两条容易让人犯错的规则:
- 每个域一条 SPF 记录。 切勿在同一名称上发布两条
v=spf1记录——那是永久性错误,SPF 会失败。将它们合并为一条:"v=spf1 include:_spf.mailertogo.net include:_spf.google.com ~all"。 - 10 次查询限制。 SPF 在评估时最多允许 10 次 DNS 查询。每条
include:都计数。将你的 ESP、Google、Microsoft 和 MailerToGo 堆叠到一条根记录上可能会超过这个限制,从而破坏所有SPF——这是从专用子域发送应用邮件的重要原因。(参见为什么 MailerToGo 从 mtg.yourdomain.com 发送。)
DKIM:签署每条邮件
DKIM 用私钥签署每条邮件;接收方从 DNS 获取匹配的公钥。使用 MailerToGo,你无需生成或粘贴密钥——你发布一条 CNAME,将每个账户特定的选择器指向我们的密钥,我们为你轮换基础密钥:
; 选择器特定于你的账户——使用仪表板中的确切值
mtg1._domainkey.mtg.yourdomain.com. CNAME mtg1.dkim.mailertogo.net.
因为它是指向我们控制的记录的 CNAME,密钥轮换是自动的:当我们轮换密钥时,发布的公钥会在我们的一侧改变,你的 DNS 无需编辑。如果你检查已解析的记录,会看到标准 DKIM 公钥:
mtg1._domainkey.mtg.yourdomain.com. TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSq...QAB"
有效的 DKIM 签名也是让你的邮件在转发中存活的东西,在转发中 SPF 通常会失败——所以 DKIM 是两个认证信号中更耐用的。
DMARC:设置策略并获取报告
DMARC 位于固定名称 _dmarc.<domain>,将 SPF/DKIM 结果与可见的 From: 域绑定。从监控模式开始,这样你在强制执行前可以学到什么在实际发送:
_dmarc.yourdomain.com. TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@yourdomain.com; fo=1; adkim=s; aspf=s"
按标签分析:
p=none— 仅监控;对失败不采取任何行动(目前)。rua=mailto:...— 在此发送汇总报告(谁以你名义发送的每日 XML 摘要)。这是从none开始的全部要点——你获得可见性零风险。fo=1— 当任一 SPF 或 DKIM 失败时请求失败详情。adkim=s/aspf=s— 严格对齐(签名/信封域必须与 From: 域完全匹配)。如果你用父域签名,使用宽松的(r,默认值)。- 如需要,添加
sp=为子域设置单独的策略。
DMARC 对齐是微妙的部分:SPF 或 DKIM通过还不够——它们通过的域必须对齐可见 From: 中的域。这是为什么发送架构很重要,以及为什么完全由你控制的子域使对齐变得直接。
从命令行验证所有内容
不要假设记录是实时的——检查它。dig(或 Windows 上的 nslookup)准确显示解析器看到的内容:
# SPF — 期望单行 v=spf1
dig +short TXT mtg.yourdomain.com
# DKIM — 跟随 CNAME 到发布的密钥
dig +short CNAME mtg1._domainkey.mtg.yourdomain.com
dig +short TXT mtg1._domainkey.mtg.yourdomain.com
# DMARC — 始终在 _dmarc.<domain>
dig +short TXT _dmarc.yourdomain.com
然后向自己发送真实邮件并读取收据。在 Gmail 中,打开邮件 → ⋮ → 显示原始内容。你想看到:
SPF: PASS with domain mtg.yourdomain.com
DKIM: PASS with domain mtg.yourdomain.com
DMARC: PASS
如果全部三项都以对齐域说 PASS,你就完成了。
推出 DMARC 强制执行而不破坏邮件
破坏合法电子邮件的错误是直接跳到 p=reject。应该按梯度逐步推进,在每个步骤监视你的 rua 报告:
p=none— 监控 1-2 周。读取汇总报告;确认每个合法发件人都在通过且对齐。p=quarantine; pct=25→ 逐步提高pct至 100。失败进入垃圾箱,而非虚空,所以错误是可恢复的。p=reject— 完全强制执行。仅在报告干净时来这里。这是 Gmail/Yahoo 奖励的级别,也是阻止精确域欺骗的级别。
常见失败及其含义
- SPF 永久错误 / “DNS 查询过多” — 你超过了 10 次查询。合并 include 或将应用邮件移到子域。
- 两条 SPF 记录 — 合并为一条
v=spf1字符串。 - DKIM “正文哈希未验证” — 传输中有内容修改了邮件(邮件列表页脚、扫描程序)。DKIM 在工作;签名后内容改变了。
- DMARC 失败尽管 SPF/DKIM 通过 — 对齐问题:通过的域与 From: 域不匹配。检查你的信封发件人/DKIM 域和 From: 是否共享组织域。
简短版本,以及 MailerToGo 的帮助
SPF 说明谁可以发送,DKIM 证明邮件真实且未修改,DMARC 将两者绑定到你的可见域并告诉接收方该怎么做。配置全部三项,用 dig 和 Gmail 的显示原始内容验证,并从 none → quarantine → reject 逐步推进 DMARC。
使用 MailerToGo,DKIM 密钥及其轮换由我们处理,你的仪表板显示要发布的确切 SPF/DKIM/DMARC 记录。如果你使用委托的 mtg.yourdomain.com 子域,我们从单条 NS 记录发布和维护所有记录——根本无需手动 DNS。更喜欢自己拥有记录?手动子域设置指南分步讲解应用配置(信封发件人 vs. From:)。