细说电子邮件的端口号

2022-01-08 ⏳6.6分钟(2.6千字) 🕸️

电子邮件(E-mail)是互联网上最古老的协议之一,但至今也是使用为广泛的通信协议。因为历史原因,电子邮件使用了多种不同的协议,每一种协议又使用不同的 TCP 端口,这极大地增加了邮件设置的难度,对不懂计算机专业知识的用户非常不友好。今天就系统地介绍一下相关的协议和端口,争取为新手扫清使用障碍。

电子邮件的本质还是邮件。要想弄明白电子邮件的工作原理,我们需要先理一下生活中邮局🏣的运作方式。在西方或者我国的城市中,每一个家庭都有一个邮箱。这是一个真正的箱子,一般都会有钥匙🔑。假设张三要给李四寄信,他需要将信投递到离自己最近的邮局甲。邮局收到信之后,会将信辗转送到李四家附近的邮局乙。邮局乙再派邮差将信送到李四家的邮箱。李四下班回家后检查自己的邮箱,发现有一封张三寄来的信。画成图是这样的:

[张三] ----> [邮局甲] ----> [邮局乙] -+
                                    |
[李四] ----> [李四邮箱] <-------------+

如果张三没有去邮局,而是投到了附近的邮筒,整个过程会变成这样:

[张三] ----> [邮筒] <---- [邮局甲] --+
                                   |
[李四] ----> [邮箱] <---- [邮局乙] <-+

对用户来说,收发都是一个主动的行为。张三需要主动寄信,李四需要主动检查自己的邮箱。邮局一般只和邮局对接。也就是说,邮局甲收到信之后只需要根据地址将信送到邮局乙(中间可能通过多个邮局中转),但不需要直接将信送到李四手上。如果我们把李四的邮箱看作是邮局乙的一部分,那么邮局乙也不需要直接跟李四打交道,只要将信放到李四的邮箱就好了。

电子邮件只是简单将上面的流程搬到了互联网上。邮局甲和邮局乙变成了 Gmail 或者 Outlook 这样的邮件服务商,邮筒或者邮箱变成了邮件客户端,居住地址变成了电子邮件地址。

整个过程变成了这个样子:

[张三] --> [客户端] <----SMTP---- [Gmail] ----+
                                            | SMTP 
[李四] --> [客户端] <--IMAP/POP-- [Outlook] <-+

这里的客户端专业术语叫 Mail User Agent(MUA)。市面上有各种各样的 MUA 软件,比如微软的 Outlook、苹果的 Mail、腾讯的 Foxmail、Mozilla 的 Thnuderbird 等等等等。现在主流的操作系统如 Windows/Macos/iOS/Android 等都内置 MUA 软件。

MUA 只能跟自己邮件服务商通信。寄信使用 SMTP 协议,收信使用 IMAP 或者 POP 协议。服务商之间传送电子邮件使用的也是 SMTP 协议。不同的协议使用不同的 TCP 端口:

协议 端口 说明
SMTP 25 Simple Mail Transfer Protocol
POP 110 Post Office Protocol
IMAP 143 Internet Message Access Protocol

最早只有 SMTP 协议,也就是简单邮件传输协议,使用 TCP 的 25 号端口。张三如果想给李四发邮件,需要使用电脑上的客户端。客户端通过 SMTP 连接 Gmail 并完成身份验证后,收下张三写给李四的信,然后尝试发送给李四的服务商 Outlook。

那 Gmail 怎么找到李四的服务商呢?这就需要 DNS 协议。电子邮件地址分用户名和域名两部分。假设张三和李四的邮箱地址分别是 zhang3@gmail.comli4@outlook.com。其中@前面的zhang3li4是用户名,后面的gmail.comoutlook.com是域名。

Gmail 收下张三的信后发现是寄给li4@outlook.com的,于是就通过 DNS 系统查询outlook.com域名的邮件服务器地址。这要用到所谓的MX记录,也就是Mail Exchange的缩写。

在我写作的时候,outlook.com 的邮件服务器是:

outlook-com.olc.protection.outlook.com

gmail.com 的是:

gmail-smtp-in.l.google.com
alt1.gmail-smtp-in.l.google.com
alt2.gmail-smtp-in.l.google.com
alt3.gmail-smtp-in.l.google.com
alt4.gmail-smtp-in.l.google.com

为了确保邮件可靠收发,一般服务商都会设置多组服务器,每组都有不同的权重。在上面的例子中,我们只查到了一台服务器。所以 Gmail 就会尝试连接这台服务器的 25 号端口。连接成功后就把张三的信传输给 Outlook 的服务器。Outlook 收到信后发现是李四的,就把他存到李四的帐号下。

如果李四在之后的某个时候打开了自己的客户端,这时 MUA 就会使用 POP 协议或者 IMAP 协议连接 Outlook 的服务器,检查是否有新邮件。POP 协议比较简单,会把查到的所有邮件内容都下载到李四的电脑上,然后删除服务器上的邮件。这样做有两个问题。一是下载所有邮件可能耗费时间和流量,因为邮件可能包含图片等附件内容。二是删除服务端邮件可能造成内容丢失(当然了,现在很多服务商都可以通过设置不让 MUA 删除服务器上的邮件副本)。鉴于此,人们又设计了 IMAP 协议,用于解决 POP 的这两个问题。使用 IMAP 协议,可以直接查看邮件的发信人、主题等信息,而不需要把完整的邮件内容下载下来。IMAP 协议也不会自动删除服务端邮件内容。现在主流的服务商一般都同时支持 POP 和 IMAP 两种协议。

POP 协议使用 110 号端口,IMAP 协议使用 143 号端口。

好了,到现在我们已经介绍了三个端口: SMTP 使用 25 号,POP 使用 110 号,IMAP 使用 143 号。这些端口都使用明文传输数据。也就是说,通信内容没有加密,任何别有用心的人都可能监听甚至篡改你收发的邮件内容!这事只能怪互联网早期是由一帮不食人间烟火的学者设计出来的,都觉得世界上没有坏人~读书人嘛。

随着互联网的发展,坏人越来越多。人们不得不着手考虑电子邮件的安全性问题。于是有人设计了 SSL 协议,也就是 Secure Sockets Layer,用来加密 TCP 通信。SSL 一共经历了 1.0/2.0/3.0 三个版本,最终被 IETF 标准化为 TLS,也就是 Transport Layer Security。TLS 到现在经历了 1.0/1.1/1.2/1.3 四个版本。

但问题来了,原先的 25/110/143 端口都使用明文通信,肯定不能直接换成 SSL/TLS 加密通信,不然已有的客户端会出问题。怎么办呢,于是人们又重新分配了三个端口,分别是 465/995/993。客户端可以通过这三个端口跟服务器通信,而且需要使用 SSL/TLS 对内容进行加密。

同期还为 HTTP 协议的 80 端口分配了 443 端口,还有很多其他端口。人们马上就发现这种玩法也有问题,知名端口一共就 1024 个,这个搞法很快就用完了。于是大家说之前分配的端口不算数了,收回。各协议在自己的明文端口上协商使用加密协议,这就是所谓的 STARTTLS 协议。什么叫重新协商呢?以 SMTP 为例,发送方首先假设接收方使用明文通信,所以直接连接对方 25 号端口

S: <监听 TCP 25 端口>
C: <建立 TCP 连接>
S: 220 mail.imc.org SMTP service ready
C: EHLO mail.ietf.org
S: 250-mail.imc.org offers a warm hug of welcome
S: 250 STARTTLS
C: STARTTLS
S: 220 Go ahead
C: <starts TLS negotiation>
C & S: <negotiate a TLS session>
C & S: <check result of negotiation>
C: <continues by sending an SMTP command>
. . .

这里发送方 C 发送 EHLO 指令后,接收方 S 返回 250 STARTTLS,表示支持 TLS 加密。所以 C 发送 STARTTLS 表示接下来要进行 TLS 协商。等双方协商完成,再使用加密信道传输邮件数据。

使用 STARTTLS 的好处是可以在一个端口上同时支持明文和加密两种通信方式。在安全性上,跟前面说的专用 TLS 端口方式没有本质区别。

这里面还有一个特殊情况,就是 SMTP 协议。SMTP 协议最早有于服务商之间交换邮件。用户发邮件的时候,MUA 也使用 SMTP 提交邮件,也是 25 号端口。因为早期很多人利用 ISP 的 IP 地址发送垃圾邮件,所以很多 ISP 都会禁用 25 号端口。这样用户的 MUA 就无法跟服务器正常通信。为此,人们引入了 587 端口用于 MUA 跟服务器之间的通信。当然了,这个端口也支持 STARTTLS 方式加密。

但是,当人们决定推广 STARTTLS 的时候,已经有大量的服务商和客户端软件都已经支持使用之前的 SSL/TLS 端口收发邮件。你没法要求所有软件都更新到新的标准。随着时间的推移,人们意识到端口问题不是主要矛盾,最重要的是推广 TLS 加密。于是在 2018 年通过了RFC8314,允许同时使用 STARTTLS 和 TLS 两种方式通信。只要是加密的协议,都是好协议。

所以,到现在我们有如下表格:

协议 明文端口 SSL/TLS端口 STARTTLS端口
SMTP 25 465 587
POP 110 995 110
IMAP 143 993 143

现在主流的邮件服务商基本上都不再允许使用明文端口通信。设置邮件客户端的时候一定要明确服务端使用的什么协议。一般 IMAP 协议都使用 993 端口,需要勾选 SSL 或者 TLS 加密。部分服务商还支持 POP 协议,使用 995 端口,需要勾选 SSL 或者 TLS 加密。对于 SMTP 协议,有的使用 465 端口(如谷歌),需要设置 SSL 或者 TLS 加密;有的使用 587 端口(如微软),需要设置 STARTTLS 加密。

以上就是本文的全部内容,你学会了吗?欢迎留言讨论。