标签 腾讯云 下的文章

结论就是:如果你想要搭建邮件服务器,不管是多大规模,千万别选腾讯云。血的教训。

为啥呢?
1.腾讯云封了 25 端口,当然仅仅是封 25 端口,问题并不大,目前主流的邮箱服务商都支持邮件的加密传输,25 端口本来也是用不到的,用 465 端口或者 587 端口就好了。想法的确很好,但是我们都能想到的,腾讯又怎么会想不到?接下来才是腾讯的杀招:
2.QQ 邮箱只能通过 25 端口来连接。试想一下,你从零基础学起,看了无数教程,排除了无数故障,不知道白了多少根头发才搭建成的邮件服务器,到头来无法给 QQ 邮箱发邮件,一言难尽。

这里还发现一个新的问题,QQ 邮箱不支持 465 端口和 587 端口,安全吗?
这里来说一下这段时间以来,对三个端口的理解:
25 端口,就是最早的 SMTP 协议端口,是不支持加密传输的;
587 端口是 SMTP 协议增加了加密传输之后启用的端口,端口的连接过程和 25 端口是相同的,但是可以通过 STARTTLS 命令启用加密传输;
465 端口是从连接开始就要求是全程加密传输的。

我们来检验一下,首先我们找到 QQ 邮箱的 SMTP 服务器:

$ nslookup -query=mx qq.com
Non-authoritative answer:
qq.com    mail exchanger = 20 mx2.qq.com.
qq.com    mail exchanger = 30 mx1.qq.com.
qq.com    mail exchanger = 10 mx3.qq.com.
...

我们看到有三个服务器,其中 mx3.qq.com 的优先级最高,我们来连接 mx3.qq.com 的 465 端口,实际上,三个服务器的响应都是一致的,因为 465 端口是全程加密连接,所以我们用 openssl 来连接,如下:

$ openssl s_client -connect mx3.qq.com:465 -crlf -4
40CC6696657F0000:error:8000006E:system library:BIO_connect:Connection timed out:../crypto/bio/bio_sock2.c:125:calling connect()
40CC6696657F0000:error:10000067:BIO routines:BIO_connect:connect error:../crypto/bio/bio_sock2.c:127:
connect:errno=110
$ openssl s_client -connect mx3.qq.com:465 -crlf -6
407C4295987F0000:error:80000065:system library:BIO_connect:Network is unreachable:../crypto/bio/bio_sock2.c:125:calling connect()
407C4295987F0000:error:10000067:BIO routines:BIO_connect:connect error:../crypto/bio/bio_sock2.c:127:
connect:errno=101

结果和我们在 postfix 日志中看到的一致,ipv4 地址超时,ipv6 地址无法连接,QQ 邮箱根本就不开放 465 端口,这也是很多人将 postfix 改成通过 465 端口发送邮件之后,仍然无法给 QQ 邮箱发邮件的原因。我们再尝试 587 端口,如下:

telnet mx3.qq.com 587
Trying 120.241.17.157...
Trying 2402:4e00:8010::b0...
telnet: Unable to connect to remote host: Network is unreachable

587 端口同样无法连接,再尝试 25 端口,如下:

$ telnet mx3.qq.com 25
Trying 120.241.17.157...
Connected to mx3.qq.com.
Escape character is '^]'.
220 newxmmxsza11-4.qq.com MX QQ Mail Server.
ehlo mx3.qq.com
250-newxmmxsza11-4.qq.com
250-STARTTLS
250-8BITMIME
250-SIZE 73400320
250 OK
quit
221 Bye.
Connection closed by foreign host.

我们看到 25 端口支持 STARTTLS 命令,也就是说 QQ 邮箱在 25 端口上做了 587 端口的事情,即保障了传输安全,又让 587 端口下了岗。这就是腾讯的个性,走出了自己的路,让别人无路可走。

看来只有申请解封 25 端口这一条路了,我们看看腾讯云是这样说的:

为了提升腾讯云 IP 地址发邮件的质量,默认限制云服务器 TCP 25 端口连接外部地址,如果您没有在云上部署邮件服务,该限制不会影响您的服务;如果您需要使用邮件服务,我们诚挚地向您推荐腾讯企业邮箱。如果您一定要使用云主机向外连接 TCP 25 端口,请确保 TCP 25 端口仅用来连接第三方 SMTP 服务器,从第三方 SMTP 服务器外发邮件。如发现您使用云主机直接 SMTP 发送邮件,腾讯云有权永久封禁 TCP 25 端口,并不再提供相关服务。

企业邮箱这个提议,看的我都有点动心了,省时省力,不用担心服务器被黑,不担心垃圾邮件,虽然花点钱,但是值。而且不想花钱的也可以选择免费版。但我没有企业,更没有营业执照,想买企业邮箱,钱都花不出去。

我们把 SMTP 协议看作是一个邮局,它有两个窗口,一个窗口面向发邮件的个人,一个窗口面向其他邮局。
假设场景:用户甲、乙,邮局子、丑,甲给乙写一封信,然后拿着信来到子的个人窗口,子要求甲进行身份验证,验证成功,子收下信,然后将信送达乙所在的邮局丑的邮局窗口,丑核实子的邮局资质,以及乙是否是丑的客户,核实成功,丑收下信,然后投递到乙的邮箱。
我们看到个人窗口和邮局窗口功能不同,职责不同,对客户的要求也不同,在 SMTP 协议上都使用同一个端口。在实现上,邮箱服务商通常通过不同的域名将两个窗口拆开。
上面我们看到 mx3.qq.com 就是 QQ 邮箱的对邮局窗口,不收个人信件,而我们所熟知的 smtp.qq.com 是个人窗口,不收其它邮局发来的信件,我们来看下 QQ 邮箱个人窗口提供的服务,我们尝试连接 465 端口,如下:

$ openssl s_client -connect smtp.qq.com:465 -crlf
...
220 newxmesmtplogicsvrszc9.qq.com XMail Esmtp QQ Mail Server.
ehlo smtp.qq.com
250-newxmesmtplogicsvrszc9.qq.com
250-PIPELINING
250-SIZE 73400320
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
mail from: <xxxx@yyyy.com>
503 Error: need EHLO and AUTH first !
405CE295207F0000:error:0A000126:SSL routines:ssl3_read_n:unexpected eof while reading:../ssl/record/rec_layer_s3.c:308:

连接成功后,会看服务器返回 220 之前有好大一段的证书相关的内容,像我这样的业余人士,直接忽略就好了。
我们看到 smtp.qq.com 返回了 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2,表明它提供 4 种身份验证服务,在这里身份验证是必须的,不登陆不能发送邮件,会被拒绝,而且要求发件人和登陆的用户必须为同一人
同样我们可以验证 25 和 587 端口都能够连接,提供的服务也是相同的。

而 mx3.qq.com 则不提供身份验证服务,个人用户如果跑到这里来发邮件,人家可不会给你好脸色。在这里,它会对发邮件的邮局进行资质认证,以确保不是冒名邮件或垃圾邮件,同时要求收件人必须时本邮局的客户。

腾讯云解封 25 端口的条件,简单来说,腾讯云允许你作为一个普通用户去寄信,而不能提供邮箱服务。也就是说,你可以连接 smtp.qq.com,而 smtp.qq.com 支持 465 和 587 端口,没有开 25 端口的必要。你不可以连接 mx3.qq.com,即便是开了 25 端口也不可以。

所以,解封 25 端口这条路也被堵死了。