腾讯企业邮箱收到不 Gmail 邮件, DNS 记录 CNAME 记录与 MX 记录冲突

原文链接: https://tangx.in/posts/2023/01/06/dns-record-cname-confilic-with-mx/

为了统一, 我申请了腾讯企业邮箱, 绑定了本站的域名。

但是在测试邮件的时候, 却发现

  1. 企业邮箱 发送邮件 一切正常
  2. 可以收到来自国内邮箱的邮件, 例如 QQ, 163, 却 收不到 来自 Gmail 的邮件。

查询资料后, 确定是在 DNS 解析记录中, CNAME 与 MX 记录冲突。

由于本站直接使用 根据域名 tangx.in 作为站点地址, 因此造成冲突。 具体设置可以参考 Hugo 网站优化(3): 我用 dnspod 给网站实现了全球加速

大概翻译一下, 解析记录如下

@ cname -> github.io
@ mx -> exmail01.qq.com
@ mx -> exmail02.qq.com

解决办法

由于 Dnspod 的 ALIAS 是高级版功能, 要收费。 而我又不想还 dns 解析商。

于是按照参考文章所说的, 将 海外 解析线路改成了 A 记录, 默认线路保持不变。

记录地址是 Github Pages 的 A 记录地址

github-pages-a-record

修改之后, 目前看来一切正常。

1, CNAME和MX记录冲突的成因

很多朋友在部署域名邮箱的时候都会发现,DNS服务商会提示根域名MX记录和CNAME记录有冲突,不能共存。今天,我就来介绍一下这种情况为什么会发生,且如何完美解决。

CNAME记录和MX记录冲突的根本原因在于CNAME (Canonical NAME)记录的特殊性。根据RFC 1034的规定,根域名不能设置CNAME记录,这是由DNS服务本身的固有限制决定的。或许你可以在一些DNS服务商那里为根域名添加CNAME记录,但这些都是不符合DNS规范的。如果要将根域名设置为另一个域名的别名,需要设置ALIAS记录。在下一节我将具体介绍ALIAS记录。

如果根域名设置了CNAME记录,会和其他所有的记录相冲突,而最常见的冲突情形就是MX记录。对于同一个根域名,CNAME记录和A记录、NS记录、SOA记录、TXT记录等都会冲突,不过这些情形并不常见,所以一般不会造成太大的问题。

我们以同时在根域名设置CNAME记录和MX记录为例。向该域名的域名邮箱发信且使用DNS寻址时,如果先寻到了CNAME记录,就无法再获取到该域名对应的MX记录。这就会导致使用该域名搭建的域名邮箱在收件时会经常丢信漏信。同时,CNAME记录不仅与MX记录冲突,也会与TXT记录冲突,这就会导致为根域名设置的SPF-TXT记录无法生效,因此发信时更容易进垃圾箱。

那么问题来了,如果我们要为网站开启CDN, 那么最常见的方式就是使用CNAME接入。如果还需要一并使用域名邮箱,那么就不得不造成CNAME记录和MX记录的冲突。有什么好办法呢?这里我们有三个办法,可以解决这个问题。

2, 如何解决CNAME和MX记录冲突

解决CNAME和MX记录的冲突有三种可行的办法,分别是 (1) 使用www.域名接入CDN; (2) 使用A记录轮询接入CDN; (3) 使用ALIAS (CNAME Flattening) 记录代替CNAME记录。接下来我将具体介绍这三种方法。

(1) 使用www.域名接入CDN

大家都知道,一般来说为根域名设置CNAME记录的情况都是由于网站需要接入CDN. 如果您可以接受网站采用www.example.com这样的网址而不是example.com,那么您完全可以使用www.example.com域名接入CDN. 由于www.example.com不是根域名了,因此它的CNAME记录不会和根域名的MX记录冲突,这样就解决了网站的CDN接入与域名邮箱共存的问题。

这种方法的有点在于最为简单,但缺点是必须使用www.形式的域名。

(2) 使用A记录接入CDN

如果您无法接受网站采用www.域名,那么您也可以将根域名采用A记录的方式接入CDN. 使用A记录时,您还可以自行设定线路,或者设置轮询。根域名的A记录不会和MX记录冲突,这样就解决了网站的CDN接入与域名邮箱共存的问题。

一般来说,这种情况比较适用于网站使用自行搭建的CDN系统,因为商用CDN系统的IP地址有时会发生变动,造成A记录解析失效。

(3) 使用ALIAS (CNAME Flattening) 记录代替CNAME记录

使用ALIAS记录代替CNAME记录是目前国际上最主流的设置办法了,它能起到与CNAME记录完全一样的效果,又不会和其他记录产生冲突。

这里我们先介绍一下ALIAS记录。ALIAS记录,又称CNAME Flattening记录,中文为“别名”记录,是一种CNAME记录的替代型记录。它能够起到和CNAME记录完全一样的效果,即将一个域名设置为另一个域名的别名,而唯一的差别就是ALIAS记录不会与其他记录发生冲突。

因此,我们只需要在DNS服务商那里为根域名设置ALIAS或者CNAME Flattening记录就可以了,它的设置方法与CNAME记录完全相同。通过设置ALIAS记录,我们就能够完美解决网站根域名的CDN接入与域名邮箱共存问题。如果您的DNS服务商目前不支持ALIAS记录,您可以使用市面上很多免费的DNS服务,比如 Cloudflare, he.net, dnsimple.com, Route53 (这个不免费), cloudns.net, 等等。这些DNS服务商都支持设置ALIAS记录。大部分国际域名注册商,比如 Godaddy, Porkbun, Namesilo, Namecheap, Gandi, Google Domains 等等,也都支持设置 ALIAS 记录。

综上所述,CNAME记录具有特殊性,会和同域名下的所有其他记录发生冲突,导致无法同时配置根域名的CDN和MX域名邮箱。有三种方法可以解决CNAME记录与MX记录的冲突,分别是

  1. 使用www.域名接入CDN;
  2. 使用A记录轮询接入CDN;
  3. 使用ALIAS (CNAME Flattening) 记录代替CNAME记录。

我们推荐您使用一个支持ALIAS记录的DNS服务商,然后为您的根域名设置ALIAS记录,就可以完美解决这个问题。