给别人家的邮件服务器加一个域名

· 5 分钟 · notes emaildnsmailcowsmtpdeliverability

这件事看起来像个 DNS 活

有个域名要收信。邮件服务器是我自己那台跑 mailcow 的 VPS,所以这就是「加域名、加记录、建信箱」——二十分钟的活,而且我做过好几次。

这次花了更久,原因是我关于邮件服务器的两个假设并不成立,另外还因为互联网有一条任何服务器配置都改不了的性质。

收信:四条记录,加一次真测试

收信恰好只需要四样东西,而且都住在域名自己的 DNS 里(这里是 Cloudflare):

MX      ninelore.com        → mail.hoelee.com   (优先级 10)
TXT     @                   → v=spf1 mx -all
TXT     dkim._domainkey     → (MTA 发布的那个选择器)
TXT     _dmarc              → (策略 + 报告地址)

配好之后,只用一种算数的方式测:从这套环境外面(走第三方中继)寄进新地址,然后去读服务器自己的日志行——rspamd 在收下这封信时记下 RCPT_MAILCOW_DOMAIN(ninelore.com)。收信一次就通。收信确实是容易的那一半,而它之所以容易,正因为它只依赖你自己能控制的记录。

出信才是地面移动的地方

两堵独立的墙,各有各的错误,而且都不是改一改区域文件就能修的配置失误。

第一堵墙:那条反垃圾策略,本质上是缺一条 PTR。 一次直投尝试被对方退回:

554 5.7.1 Mail rejected due to antispam policy

在怪远端之前,我先排掉常见原因:四个主流黑名单全干净,域名自己的 SPF/DKIM/DMARC 也都正确。剩下的解释就是那条不在我控制里的记录——发信 IP 没有反向 DNS。一台收信服务器如果无法把连进来的 IP 映射回一个名字,就会把它当成一个它无法背书的来源;再正确的 SPF 也压不过这一点。

第二堵墙:用中继绕过去也不行。 下一个显然的动作是让所有信走那条已经能用的出信中继。结果是:

550-From header sender domain not verified (gmail.com)

这行错误要仔细读,因为它一次打死了一整类设计。中继的「已验证寄件人」策略,检查的是 From 头里的域名——而转发出去的信保留的是原寄件人的 From。所以从你转发第一封来自外部寄件人的信开始,你就是在要求中继以 gmail.com 的身份发信,而它永远不会允许。mailcow 在这里还有个值得先知道的坑:它按寄件人域名选中继,所以一封 From 是外部域的信,根本不会走到你配的那条中继上。

那个并不存在的「信箱转发」功能

原计划是建好信箱,再转发一份到我的主邮箱。结果连着两个意外:

所以我什么都没启用。一条出信路径送不出去的转发,不会安静地失败:它会把退信发回给无辜的原始寄件人(backscatter),而每一封这样的退信都在花一个本来就没有余量的 IP 的信誉。对「这个新信箱要送到我的收件箱」这件事,稳定的答案是收件侧的 POP 拉取:我的邮件客户端从 mail.hoelee.com:995 拉信,VPS 什么都不用发。

PTR 是一个 IP 一条,不是一个域一条

这是我一直需要解释、包括对我自己解释的部分:

我没有假设,而是去查了当前状态:正向解析正常(mail.hoelee.com → 41.216.187.102),那个 IP 的反向解析依旧什么都不返回。所以直投仍然会被拒,唯一能用的出信路径是中继——而它那条「已验证寄件人」的要求,新域名一样得满足。

三件要提前知道的事,免得以后被吓到

  1. PTR 不是信誉。 它拆掉的是一次硬拒;它不会让你被信任。新 IP 通常需要几周的日常通信,大厂才会停止把它塞进垃圾箱——而从全新 IP 起步,就是把这口钟从零开始拨。
  2. PTR 修的是你自己的出信,对转发毫无帮助。 转发信带的是别人的 From;如果那个域发布了 p=reject(银行和大厂都会),那么不管你这边多干净,它在远端都会被挡。
  3. 中继有一个按域的前置条件。 一个域要走中继,就必须先在中继那边注册并验证它为寄件人。这是每个域永远多出来的一步,且与你自己的 DNS 里的一切无关。

如果重来一次

  1. 在建域之前先定:要信箱还是要转发。 转发是「必须成立的条件」最长的那条路;收件侧 POP 拉取几乎没有条件。
  2. 在向任何人承诺邮件之前,先查发信 IP 的反向记录。 一次反向查询就能告诉我接下来会撞上哪堵墙。
  3. 把「收件侧拉取」当一等设计,而不是权宜之计。 「这封信根本不用离开我的服务器」一次消掉三大类故障。
  4. 把那四条收信记录当成一张清单。 那一半很无聊、可验证,而且是唯一一次就通的部分。
Lee Teong Hoe

Lee Teong Hoe · Mr Hoelee

Full-stack developer & DevOps engineer based in Malaysia. I run my own production infrastructure and build web systems for small businesses — this blog is the living record.

Hiring? Profile & stack · Malaysian SME? Website design & development ↗ · All posts