Mailgun 邮件认证:SPF、DKIM 与 DMARC 配置指南

Mailgun 发信域名认证全解:SPF TXT、DKIM CNAME 与 krs._domainkey、退信 MX、2048 位密钥、双路验证,以及需自行发布的 DMARC。
4 分钟阅读
更新于 2026-11-04
平台专区
mailgunspfdkimdmarcesp

Mailgun 的接入流程替你干了大部分活:添加发信域名,整套 DNS 记录就生成好了。但记录只是原料,配错照样出事:漏发 MX 会让退信无处可去,重复 SPF 会让整条记录失效,忘了 DMARC 则连"哪里出了问题"都看不见。这些记录只有全部发布(包括纯粹用于退信的 MX 对,哪怕你只用 Mailgun 发信)、且只发布一次时才有价值;此外还要配上 Mailgun 不会替你创建的 DMARC 记录。

本指南逐条讲清记录集、每条记录存在的原因、验证方法与常见坑。协议背景见邮件认证总览;正在选型的读者可与SendGrid 配置指南对照。

准备工作

  • Mailgun 账号,能进入 Sending > Domains。
  • DNS 写权限。Cloudflare 的常见坑集中在Cloudflare DNS 指南。
  • 区域(US 或 EU)决策——添加域名时就要定,因为记录值不同,且必须与应用里配置的账号区域一致。这一点最容易被忽略,也最难排查。

第一步:添加发信域名

进入 Sending > Domains > Add New Domain 输入域名。Mailgun 推荐专用子域(如 mail.yourdomain.com)而非根域名:你给它什么域名,它就为那个域名生成自己的 SPF 和 DKIM 记录;直接放在根域上会与你企业邮箱的记录打架——两条 SPF 并列,谁都不生效。选好区域后添加。

第二步:发布记录集

打开域名详情查看 Mailgun 给出的 DNS 记录。以 mail.yourdomain.com 为例:

Type   Host                      Value
TXT   mail.yourdomain.com        v=spf1 include:mailgun.org ~all
CNAME  smtp._domainkey.mail      dl._domainkey.mail.yourdomain.com.wl123.mailgun.org
TXT    krs._domainkey.mail       (额外的 DKIM 公钥)
MX     mail.yourdomain.com (10)  mxa.mailgun.org
MX     mail.yourdomain.com (10)  mxb.mailgun.org
CNAME  email.mail                (链接/打开追踪)
  • SPF TXT 为信封域名授权 Mailgun 的发信 IP。邮件以 mail.yourdomain.com(From 域名的子域)封装,SPF 因而能在 DMARC 宽松模式下对齐——与SendGrid 指南同一原理。注意这条记录写在子域上,根域那条与此互不干扰。
  • smtp._domainkey 的 CNAME 是 Mailgun 签名所用 selector 的 DKIM 密钥(d= 你的域名,因此对齐)。做成 CNAME 让 Mailgun 能在自己那侧轮换密钥。签名固定 2048 位,不要降级。
  • krs._domainkey TXT 是独立 selector 下的追加 DKIM 公钥,出现在较新的记录集中。照原样发布。
  • 两条 MX 在 mail.yourdomain.com 收集退信,供抑制列表与统计使用。只发不收也要发布:没有退信通路,无效地址会不断累积,你却一直在为投递它们付费、赔信誉。
  • 追踪 CNAME 把链接重写到你的子域。它走 HTTP,是唯一可以开 Cloudflare 代理的邮件记录。

不要把 SPF TXT 合并进根域而让子域空白——信封发件人用的是子域,SPF 必须存在于子域上。根域那条记录留给其他发件源。

第三步:验证并激活

点 Verify DNS Settings,Mailgun 会逐条复查并标绿;传播通常几分钟,最坏 24–48 小时。想独立确认:

dig TXT mail.yourdomain.com +short
dig CNAME smtp._domainkey.mail.yourdomain.com +short

不想开终端也行:TXT 查询加 DKIM 检测(selector 填 smtp)。三项全绿后域名进入 Active,可以正式发信。Mailgun 还会发出 "DNS records verified" 的 webhook 事件,可用来触发自动化激活流程。

第四步:DMARC 得自己来

Mailgun 不会替你发布 DMARC。自己在 _dmarc.yourdomain.com 创建 TXT(也可以在 _dmarc.mail.yourdomain.com 另立策略):

v=DMARC1; p=none; rua=mailto:dmarc-reports@yourdomain.com; fo=1

从 p=none 起步,用 DMARC 报告分析器确认每条 Mailgun 流都对齐,再逐步收紧。绝不要跳过监控期直接上 p=reject——那等于把还没被识别出来的合法发件源一次性拒掉。记录用 DMARC 生成器生成。

端到端验证

通过 Mailgun 向外部邮箱发测试信,查看邮件头——Gmail 用显示原始邮件,或交给邮件头分析器:

spf=pass smtp.mailfrom=mail.yourdomain.com
dkim=pass (2048-bit key) header.d=mail.yourdomain.com
dmarc=pass header.from=yourdomain.com

然后跑 邮件健康检查或完整的 邮件投递测试扫全域名,放量之前再用 黑名单查询确认发信信誉。共享 IP 的新域名尤其要看这一项:预热期投递量上得太快,既可能触发限流,也可能让域名在头几天就被打上"可疑"标签,之后要花几周洗白。

常见错误

  • 把 Mailgun 的 SPF 发布到根域。记录集是为子域生成的。只把 include 塞进根域而不搭子域,对齐必挂。
  • 跳过 MX 记录。退信无处可去,Mailgun 无法抑制无效地址。
  • 发布重复 SPF。子域上若已有旧服务商的 v=spf1 TXT,必须替换,两条会永久失败。
  • Cloudflare 上 CNAME 被代理。DKIM 与 Return-Path 记录必须 DNS only,只有追踪 CNAME 例外。
  • 忽视区域选择。US 与 EU 使用不同主机,走错区域通不过认证。

常见问题

为什么 DKIM 既有 CNAME 又有 TXT?

smtp._domainkey 的 CNAME 指向 Mailgun 托管的密钥,轮换不必动 DNS;额外的 TXT(如 krs._domainkey)在独立 selector 下发布更多密钥。你的记录集给什么就发什么,不同账号时期与区域略有差异。

根域 SPF 也要 include:mailgun.org 吗?

只有当你在根域名的 From 地址上也用 Mailgun 发信时才需要。按推荐的子域方案,起作用的是子域自己的 SPF,根域保持干净。

追加的 DKIM 密钥该选 2048 位吗?

该选。Mailgun 新建密钥时可选 1024 或 2048 位;1024 位已被视为弱密钥,部分接收方直接拒收。2048 位的值更长,DNS 服务商可能需要拆成多段 TXT 字符串——按给定的值原样发布,拆分位置由服务商的值决定,不要自己改。

验证一直不过怎么办?

先分清是"没发布"还是"没解析对"。用 TXT 查询直接看子域上有什么,用 DKIM 检测(selector smtp)看密钥能不能取到。两条都正常,就是 Mailgun 侧尚未重跑检测,点一次 Verify 即可;都不正常,多半是主机名多写了域名后缀。

这篇指南有帮助吗?