Appearance
电子邮件(SMTP/POP3/IMAP)
2026 大纲 六(四)1 电子邮件系统的组成结构、2 电子邮件格式与 MIME、3 SMTP 与 POP3,三条子项全部由本篇承载。
速查
| 三个组成构件 | 用户代理 UA、邮件服务器、以及"邮件发送协议(SMTP)+ 邮件读取协议(POP3)"——第三个构件是两种协议合起来算一个 |
| UA 的四个功能 | 撰写、显示、处理、通信;"通信"要分别调用发送协议与读取协议 |
| 邮件服务器的职责 | 24 小时不间断工作、有很大容量的邮件信箱;除收发邮件外还要向发件人报告邮件传送的结果(已交付/被拒绝/丢失等) |
| 为什么必须两套协议 | SMTP 是推协议、推的前提是接收方在线;而收件人 UA 随时可能离线,邮件只能先推到收件人服务器"落地",最后一跳只能是拉 |
| 🔴 推/拉的判据是"谁发起" | 不看数据往哪流。POP3 的数据同样从服务器流向 UA,但发起连接的是 UA,所以它是拉 |
| 🔴 发送阶段两跳都是 SMTP | UA→发方服务器、发方服务器→收方服务器都是 SMTP,只有最后读取邮件才用 POP3/IMAP |
| 🔴 SMTP 不使用中间的邮件服务器 | 不管相隔多远、途中经过多少路由器,TCP 连接总在两个邮件服务器之间直接建立。收方服务器故障时发方只能等待重试,不能改找中间服务器代转 |
| 🔴 一台邮件服务器身兼两角 | 发送方服务器 = SMTP 服务器 + SMTP 客户;接收方服务器 = SMTP 服务器 + POP3 服务器。角色由通信关系决定 |
| 端口 | SMTP 25、POP3 110、IMAP 143;对照 HTTP 80、HTTPS 443、DNS 53、FTP 21/20 |
| 🔴 SMTP 只能传可打印的 7 位 ASCII | 不是 8 位,也不是"全部 ASCII" |
| 🔴 MIME 没修改 SMTP,ESMTP 才修改了 | MIME 在内容层面编解码,中间那段 SMTP 传的仍是纯 ASCII;能直接收二进制报文的是 ESMTP,握手命令为 EHLO |
🔴 To: 属于内容首部,不属于信封 | 信封由邮件系统自动从首部提取。所以信封上的收件人可以与 To: 不一致——Bcc 靠这一点实现 |
| POP3 与 IMAP 的一句话 | POP3 把邮箱搬到本地(服务器只是中转站),IMAP 把邮箱留在服务器(本地只是一个视图) |
| 🔴 POP3 可以配置成保留 | "POP3 一定会删掉服务器上的邮件"是错的;但即便保留,本地操作也不会同步到服务器 |
| 🔴 Web 邮箱只换掉两端 | 用户↔自己的服务器走 HTTP/HTTPS,服务器↔服务器仍是 SMTP |
| 🔴 "发出去了" ≠ "对方看到了" | 邮件是存储—转发式的:在收件人服务器上落盘即算送达,收件人何时来拉与发送方无关 |
一、邮件传送的完整路径

图源:谢希仁《计算机网络》(第 8 版)「电子邮件的最主要的组成构件」,印刷 p294。
邮件先进发送方服务器的邮件缓存(待发送队列),推到收件人服务器后存进用户邮箱,收件人方便时再拉。电子邮件解决的正是电话通信"主叫和被叫双方必须同时在场"的缺点——"存储—转发 + 拉取"就是"不必同时在场"在协议上的实现。
端到端的连接数与一次 SMTP 会话的报文数怎么数(想把"几条连接、几个报文"数到不出错时展开)
用户 A 用客户端给 B 发一封邮件,两人邮箱在不同服务器上,B 用 POP3 收信,中途不经过中继。
第 1 步:数连接。 链路上三段,每段是一次独立的 TCP 连接:
| 段 | 协议 | 客户端 | 服务器端 | 端口 |
|---|---|---|---|---|
| A 的 UA → 发送方服务器 | SMTP | UA | 邮件服务器 | 25 |
| 发送方服务器 → 接收方服务器 | SMTP | 发送方服务器 | 接收方服务器 | 25 |
| 接收方服务器 → B 的 UA | POP3 | B 的 UA | 接收方服务器 | 110 |
注意第三行的"客户端"是 B 的 UA 而不是服务器:SMTP 两段的客户端都在左边,POP3 这段的客户端在右边——这就是推与拉在连接建立方向上的体现。所以 TCP 连接数 = 3,SMTP 会话 2 次、POP3 会话 1 次。
第 2 步:数一次 SMTP 会话的应用层报文(
| 阶段 | 交互 | 报文数 |
|---|---|---|
| 连接建立 | 服务器 220 服务就绪 → 客户 HELO → 服务器 250 OK | 3 |
| 邮件传送 | MAIL FROM: → 250 | 2 |
RCPT TO: → 250,每个收件人重复一次 | ||
DATA → 354 开始输入 | 2 | |
邮件内容(以单独一行的 . 结束)→ 250 | 2 | |
| 连接释放 | QUIT → 221 | 2 |
| 合计 |
只有 RCPT TO 随收件人数增长——MAIL FROM 声明的发件人只有一个,DATA 传的正文只传一份。同一封多收件人邮件在同一台目的服务器上只传一次正文,这正是 SMTP 把"信封"与"内容"分开的收益所在。
第 3 步:一般化(假设情形)。 若题面另行假设中途经过
最值得带走的一条:端到端时延不是这几段之和。邮件在每台服务器上都要落盘存储,收件人不上线取信,它就一直躺在接收方服务器上。
二、SMTP 的三个阶段
| 阶段 | 命令与应答 |
|---|---|
| 连接建立 | 建 TCP 连接(端口 25)→ 服务器 220 服务就绪 → 客户 HELO → 服务器 250 OK |
| 邮件传送 | MAIL FROM: 声明发件人 → RCPT TO: 声明收件人(每人一条)→ DATA 开始传内容,服务器回 354 → 内容以单独一行的句点 . 结束 |
| 连接释放 | QUIT → 服务器 221,TCP 连接关闭 |
为什么用"单独一行的句点"当结束标志而不给个长度字段?因为 SMTP 是面向文本的协议,邮件长度事先不确定,只能用一个正常正文里不会出现的模式划界。代价是正文里若真有一行只写一个句点,发送方要在行首多加一个句点做转义——与组帧的"透明传输"是同一类问题,只是一个在字符层面、一个在比特层面。
突破 7 位 ASCII 的两条路线
| 路线 | 改了什么 | 结果 |
|---|---|---|
| MIME | 不改 SMTP,改内容的组织方式 | 把非 ASCII 内容编码成 ASCII 再交给 SMTP |
| ESMTP | 改 SMTP 协议本身(RFC 5321 扩充) | 客户端鉴别、直接收二进制报文、分块传大报文、发送前检查报文大小、TLS、国际化地址 |
ESMTP 客户端发的是 EHLO 而非 HELO:被拒绝说明对方仍是标准 SMTP 服务器,退回原参数传送;被接受才能用扩展参数。这是典型的向下兼容协商——用一个新命令探路,被拒就降级。
三、信封与内容
RFC 5322 只规定邮件内容中的首部格式,主体让用户自由撰写;用户写好首部后,邮件系统自动把信封所需的信息提取出来写在信封上。
| 关键字 | 含义 | 谁填 |
|---|---|---|
To: | 一个或多个收件人地址 | 用户 |
Subject: | 主题,类似文件系统的文件名,便于查找 | 用户 |
Cc: | 抄送,发一个副本,所有人可见 | 用户 |
Bcc: | 暗送,发副本但不让其他收件人知道 | 用户 |
From: / Date: | 发件人地址 / 发信日期 | 系统自动填入 |
Reply-To: | 回信所用地址,可与发信地址不同 | 可事先设置 |
系统据此生成信封上的 MAIL FROM: / RCPT TO:。信封与 To: 可以不一致:Bcc 的人出现在信封上(所以能收到),却不出现在内容首部里,于是别的收件人看不到他。
四、MIME
MIME 不是一个独立的协议,而是对邮件内容的扩充:在首部增加字段说明数据类型(文本、声音、图像、视像)与编码方式,再把非 ASCII 内容用 Base64 等方式编码成 ASCII 交给 SMTP。三个首部字段是 MIME-Version、Content-Type(如 text/plain、image/jpeg)、Content-Transfer-Encoding。Base64 用 4 个 ASCII 字符表示 3 个字节,体积膨胀约 33%——这是"不改协议只改内容"要付的价钱。
五、POP3 与 IMAP
POP3 只有在用户输入用户名和口令后才允许读取邮箱,且只要用户读取了邮件,服务器就把该邮件删除——在办公室收了一封还没回信就出差,打开笔记本时那封已被删掉。补救靠功能扩充:可事先设置读取后仍在服务器存放的时间,于是有"下载并删除"与"下载并保留"两种模式。
IMAP 是联机协议:用户在自己机器上操纵服务器上的邮箱,就像在本地操纵一样。打开邮箱时先只看到邮件的首部,需要打开某封时它才传到本地;可创建层次式文件夹、按条件查找,在用户未发出删除命令之前服务器邮箱中的邮件一直保存着。它还允许只读取邮件中的某个部分——网速慢时先下正文、以后再取大附件。
| 对比项 | POP3 | IMAP |
|---|---|---|
| 邮件存储位置 | 下载到本地 | 保留在服务器 |
| 多设备同步 | 不同步(本地操作不上传) | 所有操作实时同步 |
| 服务器端文件夹 | 不支持 | 支持创建与管理 |
| 离线访问 | 下载后可离线查看 | 需要缓存,否则必须联网 |
| 部分下载 | 全部下载 | 可只下首部,需要时再取正文/附件 |
| 服务器存储压力 | 小 | 大 |
六、基于 Web 的电子邮件
中间那一跳换不掉的原因:不同厂商的邮件服务器之间必须有一个共同语言,而各家的 Web 界面各自为政——服务器之间的互通性正是 SMTP 不可替代的原因。
本节小结
- 发和收本来就不是一套协议:SMTP 是推协议、推的前提是接收方在线,而收件人 UA 随时可能离线,邮件只能先推到收件人服务器落地,最后一跳只能是拉。判据是"谁主动发起"。发送阶段两跳都是 SMTP 且不经过中间邮件服务器。
- SMTP 三阶段:连接建立(
220/HELO/250)→ 邮件传送(MAIL FROM/RCPT TO/DATA/单独一行的.)→ 释放(QUIT/221)。突破 7 位 ASCII 的两条路线改的不是同一层:MIME 改内容,ESMTP 改协议本身。 - 信封由系统从内容首部自动提取,两者可以不一致,
Bcc靠这一点实现。POP3 把邮箱搬到本地、IMAP 把邮箱留在服务器,同步、文件夹、离线、部分下载、存储压力五项差别都由这一句推出。
教材出处
- 谢希仁《计算机网络》(第 8 版)印刷 p293,6.5.1 节:电子邮件的定位——「电子邮件把邮件发送到收件人使用的邮件服务器,并放在其中的收件人邮箱(mailbox)中,收件人可在自己方便时上网到自己使用的邮件服务器进行读取」,以及它相对电话的两点优势(「电话通信的主叫和被叫双方必须同时在场」)。同页给出三个组成构件:「一个电子邮件系统应具有图 6-16 所示的三个主要组成构件,这就是用户代理、邮件服务器,以及邮件发送协议(如 SMTP)和邮件读取协议(如 POP3)」,并说明 MIME 的由来:「由于互联网的 SMTP 只能传送可打印的 7 位 ASCII 码邮件,因此在 1996 年又发布了通用互联网邮件扩充 MIME……MIME 在其邮件首部中说明了邮件的数据类型」。
- 印刷 p294,6.5.1 节:本篇引用的那张图即此页的「电子邮件的最主要的组成构件」。用户代理的四个功能(撰写、显示、处理、通信)逐条列在本页;邮件服务器「24 小时不间断地工作……同时还要向发件人报告邮件传送的结果(已交付、被拒绝、丢失等)」;以及本篇反复用到的那句:「这里应当注意,邮件服务器必须能够同时充当客户和服务器。」
- 印刷 p296–p297,6.5.2 节:SMTP 三阶段的命令与应答序列,本篇
那张计数表逐条对应这里——连接建立「在连接建立后,接收方 SMTP 服务器要发出"220 Service ready"(服务就绪)。然后 SMTP 客户向 SMTP 服务器发送 HELO 命令……SMTP 服务器若有能力接收邮件,则回答:"250 OK"」;邮件传送「下面跟着一个或多个 RCPT 命令,取决于把同一个邮件发送给一个或多个收件人」「每发送一个 RCPT 命令,都应当有相应的信息从 SMTP 服务器返回」「再下面就是 DATA 命令,表示要开始传送邮件的内容了。SMTP 服务器返回的信息是:"354 Start mail input; end with <CRLF>.<CRLF>"」;连接释放「邮件发送完毕后,SMTP 客户应发送 QUIT 命令。SMTP 服务器返回的信息是"221(服务关闭)"」。p296 还给出本篇那条边界:「SMTP 不使用中间的邮件服务器。不管发送方和接收方的邮件服务器相隔有多远,不管在邮件传送过程中要经过多少个路由器,TCP 连接总是在发送方和接收方这两个邮件服务器之间直接建立。当接收方邮件服务器出故障而不能工作时,发送方邮件服务器只能等待一段时间后再尝试和该邮件服务器建立 TCP 连接,而不能先找一个中间的邮件服务器建立 TCP 连接。」p297 另有「"发送成功"并不等于"收件人读取了这个邮件"」及其四种可能。 - 印刷 p298,6.5.2 节末:ESMTP 的说明——「2008 年 10 月颁布的草案标准 RFC 5321 对 SMTP 进行了扩充,成为扩充的 SMTP(Extended SMTP),记为 ESMTP……新增加的功能有:客户端的鉴别,服务器接受二进制报文,服务器接受分块传送的大报文,发送前先检查报文的大小,使用安全传输 TLS,以及使用国际化地址等」「使用 ESMTP 的客户端在准备传送报文时,不是发送 HELO 而是发送 EHLO 报文。如果 EHLO 报文被对方服务器端拒绝,就表明对方仍然是一个标准的 SMTP 邮件服务器」。同页 6.5.3 节:「一个电子邮件分为信封和内容两大部分。在草案标准 RFC 5322 文档中只规定了邮件内容中的首部(header)格式,而对邮件的主体(body)部分则让用户自由撰写。用户写好首部后,邮件系统自动地将信封所需的信息提取出来并写在信封上。所以用户不需要填写电子邮件信封上的信息」,以及
To:/Subject:/Cc:/Bcc:/From:/Date:/Reply-To:各关键字的含义。 - 印刷 p299,6.5.4 节:POP3 的鉴别与删除特性——「POP3 服务器只有在用户输入鉴别信息(用户名和口令)后,才允许对邮箱进行读取」「POP3 协议的一个特点就是只要用户从 POP3 服务器读取了邮件,POP3 服务器就把该邮件删除」,以及出差换机器看不到旧邮件那个具体例子与功能扩充。IMAP 一段:「用户在自己的计算机上就可以操纵邮件服务器的邮箱,就像在本地操纵一样,因此 IMAP 是一个联机协议……若用户需要打开某个邮件,则该邮件才传到用户的计算机上」「IMAP 还允许收件人只读取邮件中的某个部分」;缺点「如果用户没有将邮件复制到自己的计算机上,则邮件一直存放在 IMAP 服务器上。要想查阅自己的邮件,必须先上网」。同页结尾正是本篇那条方向判据的依据:「最后再强调一下,不要把邮件读取协议 POP3 或 IMAP 与邮件传送协议 SMTP 弄混。发件人的用户代理向发送方邮件服务器发送邮件,以及发送方邮件服务器向接收方邮件服务器发送邮件,都是使用 SMTP 协议。而 POP3 或 IMAP 则是用户代理从接收方邮件服务器上读取邮件。」
说明:折叠块里的场景(3 个收件人、
台中继)是自造的;其中"中继"与教材「SMTP 不使用中间的邮件服务器」这条明文相抵,块内已就地标注它只是为把连接计数一般化而设的假设情形,标准链路取 。SMTP 会话的三阶段命令序列取自教材 6.5.2 节(印刷 p296–p297),报文数 是按该序列逐条数出来的计数结果,教材本身不给这个式子。Base64 约 33% 膨胀是编码方式(3 字节 → 4 字符)的直接推论,教材未给具体比例。
相关知识
网络应用模型|DNS 域名系统|TCP 连接管理|FTP 与 DHCP|HTTP 协议