SMTP
SMTP (Simple Mail Transfer Protocol) 是 Email 最本质的底层协议。
一封邮件,本质上就是一个非常可读的文本文件,如下所示:
From: Alice <alice@example.com>
To: Bob <bob@example.org>
Subject: Hello
Date: Fri, 4 Sep 2026 14:00:00 +0800
Message-ID: <abc123@example.com>
Hello Bob,
How are you?SMTP 规定了邮件的格式,在这个邮件里面,指定了:
- 发送人
- 接收人
- Message-ID:可以理解为一种 SMTP 提供的一种不会撞车的 ID
- 邮件正文
当这封邮件发送的时候,本质上是 example.com 这个域名对应的服务器上,运行着一个 SMTP 服务,它可以解析上面的邮件文本,并把它发送给域名是 example.org 这个域名对应的服务器(最准确的说,是这个服务器上对应的用户),这个服务器上同样运行着一个 SMTP 服务。
邮件发送的过程,本质上是一个纯文本文件进行 P2P 网络传输的过程。
POP3/IMAP
我们平时使用邮箱服务器供应商(比如说 163.com, qq.com, gmail.com)的邮箱操作界面的时候,本质上都是这些云服务商运行了 SMTP 服务,然后我们用浏览器登陆到了这个邮箱服务器上进行查看。
这基本上是我不了解 email 底层原理的时候的做法,但是这样做主要有两个问题:
- 每个邮箱都需要登陆不同的网址去访问,没有办法统一管理。
- 邮件是存放在服务器上的,本地并没有留存数据。
- 邮件的渲染依赖于服务器上的渲染程序,不能自定义。
正是基于这些问题,出现了 Mailbox 这种应用,比如说“网易邮箱大师”,“Thunderbird”。它们可以理解为 SMTP 服务器的本地客户端,它类似于服务器邮箱的“镜像”,同步服务器邮箱中的内容,并且可以同时管理多个邮箱,并提供统一的渲染效果。
Mailbox 和 Server 之间的同步协议,就是 POP3 和 IMAP 。其中 POP3 是比较古老的,人们现在就用 IMAP 。同步协议是 pull 模型,Mailbox 会按照一定的时间间隔来检查 server 上是否有新的邮件,所以 Mailbox 有的时候会更新不及时。即使现在的 IMAP 会支持让 server 去 notice mailbox,也会有延迟更新的现象,很难做到即时同步,这也是使用 mailbox 的一个弊端。
Advanced
当然这种纯文本协议就很容易玩出各种花活。
Mailing List
Mailing List(邮件列表)本质上也可以看成一个收信人,它有自己的邮件地址。它和普通收信人的区别在于,给它发邮件,所有订阅它的人都会在自己的邮箱里收到一份。所谓“订阅”,就是把自己的邮箱地址加入它的分发名单。
比如说,有一个邮件列表叫做 discuss@example.org,Alice、Bob 和 Carol 都订阅了它。Alice 只需要给这个地址发一封邮件,列表背后的程序就会把邮件分发给大家,不需要她把所有人的邮箱地址都写一遍。
如果 Bob 把回复也发给这个列表地址,大家就都能收到;如果只回复 Alice,就只有 Alice 能收到。所以 Mailing List 有点像一个用邮件实现的群聊,而列表地址就是这个“群”的入口。
CC
CC(Carbon Copy,抄送)本质上就是给同一封邮件再指定一些收信人。它和普通收件人(To)在收信上没有什么区别,主要是表达的意思不同:To 是“这件事情需要你处理”,CC 是“这件事情也让你知道一下”。当然,这只是使用习惯,并不是协议的强制要求。
比如说,Alice 想请 Bob 帮忙检查一份文档,同时让 Carol 知道这件事情,就可以把 Bob 放在 To 里,把 Carol 放在 CC 里。两个人都会收到邮件,也都能看到这封邮件发给了谁。