#80 DNS 记录如何帮助抵制垃圾邮件

SPF、DKIM、DMARC、BIMI 以及 IP 声誉简介

Design Scenes 第 80 期封面。采用了像素风格邮件和邮箱元素。

二十九年前,两位普通的移民律师 Laurence Canter 和 Martha Siegel 怎么也没想到他们的一个 Perl 脚本在日后开启了垃圾邮件魔盒。广告、钓鱼和诈骗总是和社会工程挂钩,让人防不胜防,其中邮件途径总是占据多数,以至于现在不得不使用多重手段来防止垃圾邮件入侵。

图表内容,折线图,代表逐年攀升的钓鱼邮件点击率

今年的 10 月初,Google 宣布将在 2024 年 2 月对每天群发 5,000 封邮件以上发件人做出限制,要求其必须严格遵守邮件身份验证限制,雅虎邮箱也是。趁此机会分享一下在 Mailgun 配置发送域名的一些见闻,在这个过程中也了解了现代收件服务商使用了哪些基础验证手段抵制垃圾邮件。

SPF

SPF 全称 Sender Policy Framework,世纪之初时为了防止 SMTP 协议随意伪造发件人而诞生。它是一串 TXT 类型的 DNS 解析记录,定义了发件域名和其 SPF 记录域名/地址是否一致。

上图:SPF 工作流程。图源:The basics of SPF records

比如你有一封邮件来自 IP 地址 123.456.7.89,并显示它来自 example.com,收件服务商(指 QQ邮箱、Gmail 等)在给你展示前,会验证该 IP 是否符合 example.com SPF 记录里的规则。如不通过会将其作为伪造邮件处理。关于 SPF 详细语法推荐阅读下面文章。

SPF 记录:原理、语法及配置方法简介 - Blog - Renfei Song

对于 Mailgun 这样的 ESP(邮件服务提供商),使用的是其内部规则:

v=spf1 include:mailgun.org ~all

意思是引用 mailgun.org 的 SPF 记录规则(mailgun 有很多 IP,而且分为两个区域),发件人 IP 来自 mailgun.org 的都会通过。

SPF 记录相当重要,几乎所有邮件域名都需要配置此项,所以你可以用一些 SPF 记录检查工具或者 nslookup 命令来查看邮送域,进而反推其背后的 ESP 是谁。比如 Substack 和 Quail 用的也是 Mailgun,WordPress 的邮件推送则是自建。

有时我们会配置一些邮箱之间的转发,此时就会在 DMARC 反馈里看到一些 SPF 失败,此时收件服务商会调用转发域名的 ARC 验证,如通过也能转发成功,但是不同收件服务商会有不同的转发提示来提醒用户。

DKIM

DKIM 全称 DomainKeys Identified Mail,简单讲就是非对称加密的邮件版本。

SPF 工作流程。图源:Understanding DKIM

依然以 Mailgun 为例,Mailgun 会给你的每个域名提供最多 3 个公钥,也是一串 TXT 记录。它的结构一般为:

k=rsa; p=[DKIM PUBLIC KEY]

从 Mailgun 正规发出的每封邮件都会在信头(header)包含一段 DKIM 信息,包括:

  • v :DKIM 版本
  • d :发件人域名,一般是签名所在域
  • s :选择器:selector,与查找 DNS 记录有关
  • h :用于创建签名的字段。Mailgun 使用的是 Message ID、发件收件人、日期和 Mime-Version 等信息创建的。不同 ESP 这里会有所不同。
  • bh :邮件正文哈希值
  • bh bh 和私钥共同生成的数字签名

收件服务商那边会使用 DNS 里面的公钥对 b 签名解密,如果正确使用了私钥加密,且 hbh 信息没变,即可通过验证。

你可以在 QQ 邮箱帮助中心 DKIM 指引中看到更多参数。

DKIM 公钥分 1024 和 2048 长度两种,后者更难以被破解利用。但其长度会超过 TXT 记录 255 字符限制,此时可以拆分为两个记录,详见

DMARC

一般有上面两者验证足矣,DMARC 的作用是,在发生 SPF 和 DKIM 验证失败时,如何操作这封问题邮件。

DMARC 全称 Domain-based Message Authentication Reporting and Conformance,是的又是 Domain-based,所以又要往 DNS 解析里加东西了。以 Design Scenes 的 DMARC 政策为例:

v=DMARC1; p=quarantine; adkim=r; aspf=r; pct=100; rua=mailto:hi@fenx.work;
  • v 代表 DMARC 版本,目前必为 DMARC1;
  • p 代表收件服务商如何处理问题邮件。我选用 quarantine 代表会进入隔离区,如未特殊设置一般是垃圾箱;
    • 如果选用 none 代表不处理;
    • 如果选用 reject 代表直接拒收;
  • pct 代表有多少百分比问题邮件受 DMARC 政策影响。比如设置了 50 就代表有一半的问题邮件处理,另一半不处理;
  • rua 代表接收 DMARC 报告的邮箱。可设置多个,但前面必须都要有 mailto: 。建议单独申请一个邮箱专门用来接收 DMARC 报告……因为真的很多,十分不建议拿个人邮箱接收。不是 rua 小猫咪的那个 rua。
  • adkimaspf 代表的是 DKIM 和 SPF验证的匹配严格程度:设置 s 是严格匹配,设置 r 是宽松匹配。以 fenx.work 域名为验证标准举例:
    • 来自 newsletter@fenx.work: 无论设置 s 还是 r 都会通过验证
    • 来自 newsletter@mg.fenx.work: 设置 s 不会通过验证,设置 r 会通过;
    • 来自 newsletter@fenx.com: 无论设置 s 还是 r 都不会通过验证
  • 还有 fo 可选报告、rf 报告格式和 ri 报告频率等参数设置,不再赘述。

早期怕出现什么差错先用 r,之后看看改成 s 严格匹配。

你可以在 MX Tool Box 这篇文章有直观的说明。值得一提的是,在后面配置 BIMI 时会需要 DMARC 在一级域名处添加 TXT 记录。

DMARC 报告

配置后需要一段时间生效,之后就会有你发送的各大邮箱给你 DMARC 报告反馈。

收件箱里的 DMARC 报告邮件

每封报告邮件都会带有一个 XML 压缩包的附件,你可以按照XML 结构直接读取里面的信息,但非常不直观。我试过直接用开发模式 Excel 导入、pandoc 转换、在线转换,最后感觉都不如直接找个 DMARC 报告分析工具直观和准确,像 EASDMARC 这个工具就还可以,很多地方都会给出注解。

我个人的话也只会在大规模推送文章后抽时间简单查看一下。

不同邮箱还有自己的邮件数据服务,比如 QQ 邮箱有一个他域互通工具,可以查看收件率、投诉率等信息,详见官方说明。同理 Gmail 有 Postmaster Tools,Outlook 有 SNDS 和 JMRP

BIMI

BIMI 是基于 DMARC 的延伸概念,全称 Brand Indicators for Message Identification。2016 年从DMARC.org 独立出来,作为邮件品牌身份识别的新标准。简单说,使用这个标准的邮送域可以显示自定义的品牌头像。如下图:

Gmail 中是否有 BIMI 验证的对比

Steam 邮送域符合 BIMI 标准,会显示头像和一个认证徽章。未认证的 It's Nice That 没有相关设置,就是默认头像。

BIMI 同样是一条 TXT 记录,结构大致是:

v=BIMI1; l=<YOUR SVG URL>; a=<YOUR VMC URL>;
  • v 代表 BIMI 版本
  • l 代表你的邮箱品牌头像,SVG P/S 格式
  • a 代表你的 VMC (verified mark certificate) 证书地址,证书需要在 DigiCertEntrust 购买……每年一千多美元,与 SSL 证书独立付费;
  • BIMI 支持选择器来布置不同品牌的不同标识,详见

BIMI 生效的基础是 DMARC 中配置 pct=100 以及p≠none ,然后SVG 格式也一定要符合 SVG Tiny Portable/Secure (SVG P/S) 标准。这意味着从 Adobe Illustrator 导出 1.2 版本 SVG 是不够的,需要类似 SVG P/S Converter 这样的转换器以达到标准。你可以在本地使用 jingtrang 工具检验自己的 SVG 是否符合标准(需要提前配置 java 运行环境)。

#安装 jingtrang
pip3 install jingtrang 

#从该网址下载 rnc 校对文件(下载后改后缀名 .rnc)
http://bimigroup.org/resources/SVG_PS-latest.rnc.txt

#验证
pyjing -c <RNC FILE PATH> <YOUR SVG PATH> 

如果没有报错,即通过 SVG P/S 格式验证,你可以在这里查看详细

像 Gmail、iCloud、yahoo 等邮箱都支持 BIMI 标准(更多详见),但是只有在拥有 VMC 的情况下才会显示头像。所以这个思路和 𝕏 (前身 Twitter) 有些类似:你的真实性由你产出的价值不算,肯花大价钱出价格才算真实。

综合配置好了后,你可以使用一些 BIMI 检查器检查各项标准,比如 BIMI Inspector。fenx.work 是完全符合的。

IP 声誉

配置好上述域名记录验证,依然不足以让发件新人即刻开始群发邮件。广义上的垃圾邮件生产者依然有可能做到这些事,所以剩下的识别则是依靠 ISP(收件服务提供商)和接受人的反馈数据—— IP 声誉。

假设你课金新建一个 IP 专门发收邮件,那么你需要向 ISP 证明自己如何不会发布大量垃圾邮件。你的对应域名过去 30 天处于活动状态最好(否则新域名也应热身),然后你需要每天都向你的核心受众发送少许邮件,这些邮件要小心撰写,减少被直接误伤为垃圾邮件得概率。你的这些受众最好也是对方主动订阅接收你的邮件的,否则遭到拉黑投诉相当致命。在这个期间,ISP 会严格收集邮件发送数量、发送频率、投诉和退回率——也就是艰难的热身期,一般会维持 4-8 周——当然也可以继续课金购买自动热身服务。

一般非企业用户默认使用的是 ESP 提供的共享 IP。这个 IP 地址是很多发件人共享的,不用热身,但是会共享声誉。那么 ESP 这边就会限制新加入 IP 的账户,此时要做的事和 IP 热身差不多,但限制更多。以 Mailgun 为例,这段期间一个消息(即 Ghost 上一篇文章)只能发给 9 个收件人,每小时最多发 100 封邮件。Mailgun 官方的帮助和博客都写的很详细,可以参考。

The Ultimate Guide to Warm-Up Your IP and Domain Reputation | Mailgun
Domain reputation is important, but how do you go about building it? A proper domain warm-up will get you set on the right track to the inbox.
How do I warm up my IP ?
Build and protect your reputation from the start It’s important to remember that as you’re getting started with Mailgun, now is the best time to start off on the right foot. Your domains and IPs mi…

我自己的经历是:从竹白导出邮件列表,再群发是不可能的。Mailgun 的客服告诉我要和收件人建立起「双向关系」,于是我便从竹白那边发送「唤回」邮件,请以前的订阅者重新订阅新网站。然后自己筹集了 10 个测试账号,用 email only 测试文章向其中 9 个邮箱隔几个小时就发送一次,并且保持非常高的打开率和点击率。由于 Mailgun 后台完全没有解除限制的反馈,所以偶尔会给 10 个测试账号发送测试文章以查看是否解锁了限制。

这个过程 Mailgun 说一般会持续 3 天到 1 周,在和客服不断沟通后也还是用了 2 天多解锁。当时还是很心急的,毕竟网站和文章都准备好了就差解除发件限制,当时我在笔记写道:「Design Scenes 的受众们很大概率不会收到仿冒 fenx.work 域名的钓鱼/诈骗邮件,因为我自己都有概率发送不了邮件。」

作为共享发送 IP 的一员,后续邮件声誉也很重要——保持良好的参与度指标,尽量避免垃圾邮件常用排版(使用优惠文案,连续图片排版等等),以及清理那些失效的邮箱地址。如果你使用隐私优先的工具订阅了很多 newsletter,那么你肯定会收到过几封类似「我们发现您很久没有活跃,是否确认取消订阅本 newsletter」的邮件。这便是维护邮件到达率的手段之一,以防过多的退件影响 IP 声誉。

Stop emails from going to spam with these proven tips and strategies | Mailgun
Emails going to spam folders? Boost engagement & make it to the inbox. 11 proven tips from high-performing email senders. Root causes & solutions revealed!

其他

除上述需要配置的通用策略外,还有一些各大收件服务商自己配置的 ARC,即 Authenticated Received Chain,来调整邮件转发时的安全问题。ARC 在 2019 年才成为 RFC 标准,它的作用是收件服务商转发之间会附上自家的“担保”,当多次转发后就会形成一条带有各自担保的转发链。举个例子,你要开始长途星际旅行——

  • 先在地球备案,证明自己和自己的货仓合法,不是外星人。
  • 然后出发到火星,火星会开始检测你和你的货仓有没有太阳系以外的外星人👽,是的话放行,并在你的货仓塞进一个大礼包来证明你收到火星认证。
  • 你可继续飞到木星。到了木星也会开始检测你和你的货仓。此时你的货仓和出发时有所改变(因为多了个火星大礼包),就会开始认真检测你,验证后来发现来自火星。那你怎么去火星的呢?又向上检测了下,发现你来自地球。那你怎么去地球的呢?再一检测发现原来是地球本地人,验证通过。可以放行继续飞了。

详细的原理可以参照这篇文章说明:

關於 email security 的大小事 — 延伸篇
隨著前幾篇 email security 的介紹,我陸陸續續收到了一些問題,在交流的過程中覺得有一些很重要或是很有趣的討論可以更延伸探討。以下採取 Q&A 的格式,記錄一些討論與延伸知識。

结语

作为邮箱用户,上面的信息你可以在原始邮件信息中悉数看到。不同邮件查看元数据方式不同,Gmail 网页版是在三个垂直点弹出的菜单中,点击显示原始邮件

其实在接触自建 newsletter 前,这些规则对我来说都是「兔子洞」。接触后发现这些规则又是熟悉邮件者的家常便饭,老生常谈。几乎每一家提供邮件营销服务的产品都将这些写得详细易懂。

邮件服务年头已久,无论是传输协议还是反垃圾政策都很久没有大幅更新。受众群体反馈基本拿捏了一个发件域名的命脉,比如我经常看到米哈游游戏的新版本营销和召回邮件进入到垃圾箱🚮,发送域是阿里云,八成是被多人标记了垃圾邮件甚至是举办。希望未来的 AGI 能带来更精准地内容识别和逻辑构建,让反垃圾政策从 DNS 记录中解放出来*。

*:和米哈游无利益关系,单纯展望。


如果你觉得文章对你有些帮助,可以请我的猫吃罐头 ↓

带有微信赞赏码和文字 A kind and compassionate act is often its own reward. 的横幅图像

订阅 Design Scenes

发布最新文章时,会以邮件通知你
zelda@link.com
订阅