Skip to content

电子邮件(SMTP/POP3/IMAP)

2026 大纲 六(四)1 电子邮件系统的组成结构2 电子邮件格式与 MIME3 SMTP 与 POP3,三条子项全部由本篇承载。

速查

三个组成构件用户代理 UA、邮件服务器、以及"邮件发送协议(SMTP)+ 邮件读取协议(POP3)"——第三个构件是两种协议合起来算一个
UA 的四个功能撰写、显示、处理、通信;"通信"要分别调用发送协议与读取协议
邮件服务器的职责24 小时不间断工作、有很大容量的邮件信箱;除收发邮件外还要向发件人报告邮件传送的结果(已交付/被拒绝/丢失等)
为什么必须两套协议SMTP 是推协议、推的前提是接收方在线;而收件人 UA 随时可能离线,邮件只能先推到收件人服务器"落地",最后一跳只能是拉
🔴 推/拉的判据是"谁发起"不看数据往哪流。POP3 的数据同样从服务器流向 UA,但发起连接的是 UA,所以它是拉
🔴 发送阶段两跳都是 SMTPUA→发方服务器、发方服务器→收方服务器都是 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
🔴 "发出去了" ≠ "对方看到了"邮件是存储—转发式的:在收件人服务器上落盘即算送达,收件人何时来拉与发送方无关

一、邮件传送的完整路径

发送方邮件服务器方框里同时画着 SMTP 服务器与 SMTP 客户,接收方邮件服务器里同时画着 SMTP 服务器与 POP3 服务器

图源:谢希仁《计算机网络》(第 8 版)「电子邮件的最主要的组成构件」,印刷 p294。

邮件先进发送方服务器的邮件缓存(待发送队列),推到收件人服务器后存进用户邮箱,收件人方便时再拉。电子邮件解决的正是电话通信"主叫和被叫双方必须同时在场"的缺点——"存储—转发 + 拉取"就是"不必同时在场"在协议上的实现

端到端的连接数与一次 SMTP 会话的报文数怎么数(想把"几条连接、几个报文"数到不出错时展开)

用户 A 用客户端给 B 发一封邮件,两人邮箱在不同服务器上,B 用 POP3 收信,中途不经过中继。

第 1 步:数连接。 链路上三段,每段是一次独立的 TCP 连接:

协议客户端服务器端端口
A 的 UA → 发送方服务器SMTPUA邮件服务器25
发送方服务器 → 接收方服务器SMTP发送方服务器接收方服务器25
接收方服务器 → B 的 UAPOP3B 的 UA接收方服务器110

注意第三行的"客户端"是 B 的 UA 而不是服务器:SMTP 两段的客户端都在左边,POP3 这段的客户端在右边——这就是推与拉在连接建立方向上的体现。所以 TCP 连接数 = 3,SMTP 会话 2 次、POP3 会话 1 次。

第 2 步:数一次 SMTP 会话的应用层报文k = 收件人数):

阶段交互报文数
连接建立服务器 220 服务就绪 → 客户 HELO → 服务器 250 OK3
邮件传送MAIL FROM:2502
RCPT TO:250每个收件人重复一次2k
DATA354 开始输入2
邮件内容(以单独一行的 . 结束)→ 2502
连接释放QUIT2212
合计11+2k

只有 RCPT TO 随收件人数增长——MAIL FROM 声明的发件人只有一个,DATA 传的正文只传一份。同一封多收件人邮件在同一台目的服务器上只传一次正文,这正是 SMTP 把"信封"与"内容"分开的收益所在。k=1 时 13 个报文,k=3 时 17 个。

第 3 步:一般化(假设情形)。 若题面另行假设中途经过 n 台中继邮件服务器(注意这不是 SMTP 的常态,见速查里那条),则中继同样以 SMTP 收、以 SMTP 发,于是 TCP 连接数 =n+3、SMTP 会话数 =n+2,而 POP3 会话恒为 1——不管邮件在服务器之间转了几手,收件人 UA 始终只与自己的那一台邮件服务器打交道。标准链路把 n=0 代回去即可。

最值得带走的一条:端到端时延不是这几段之和。邮件在每台服务器上都要落盘存储,收件人不上线取信,它就一直躺在接收方服务器上。

二、SMTP 的三个阶段

阶段命令与应答
连接建立建 TCP 连接(端口 25)→ 服务器 220 服务就绪 → 客户 HELO → 服务器 250 OK
邮件传送MAIL FROM: 声明发件人 → RCPT TO: 声明收件人(每人一条)→ DATA 开始传内容,服务器回 354 → 内容以单独一行的句点 . 结束
连接释放QUIT → 服务器 221,TCP 连接关闭

为什么用"单独一行的句点"当结束标志而不给个长度字段?因为 SMTP 是面向文本的协议,邮件长度事先不确定,只能用一个正常正文里不会出现的模式划界。代价是正文里若真有一行只写一个句点,发送方要在行首多加一个句点做转义——与组帧的"透明传输"是同一类问题,只是一个在字符层面、一个在比特层面。

突破 7 位 ASCII 的两条路线

路线改了什么结果
MIME不改 SMTP,改内容的组织方式把非 ASCII 内容编码成 ASCII 再交给 SMTP
ESMTPSMTP 协议本身(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-VersionContent-Type(如 text/plainimage/jpeg)、Content-Transfer-Encoding。Base64 用 4 个 ASCII 字符表示 3 个字节,体积膨胀约 33%——这是"不改协议只改内容"要付的价钱。

五、POP3 与 IMAP

POP3 只有在用户输入用户名和口令后才允许读取邮箱,且只要用户读取了邮件,服务器就把该邮件删除——在办公室收了一封还没回信就出差,打开笔记本时那封已被删掉。补救靠功能扩充:可事先设置读取后仍在服务器存放的时间,于是有"下载并删除"与"下载并保留"两种模式。

IMAP 是联机协议:用户在自己机器上操纵服务器上的邮箱,就像在本地操纵一样。打开邮箱时先只看到邮件的首部,需要打开某封时它才传到本地;可创建层次式文件夹、按条件查找,在用户未发出删除命令之前服务器邮箱中的邮件一直保存着。它还允许只读取邮件中的某个部分——网速慢时先下正文、以后再取大附件。

对比项POP3IMAP
邮件存储位置下载到本地保留在服务器
多设备同步不同步(本地操作不上传)所有操作实时同步
服务器端文件夹不支持支持创建与管理
离线访问下载后可离线查看需要缓存,否则必须联网
部分下载全部下载可只下首部,需要时再取正文/附件
服务器存储压力

六、基于 Web 的电子邮件

中间那一跳换不掉的原因:不同厂商的邮件服务器之间必须有一个共同语言,而各家的 Web 界面各自为政——服务器之间的互通性正是 SMTP 不可替代的原因

本节小结

  1. 发和收本来就不是一套协议:SMTP 是推协议、推的前提是接收方在线,而收件人 UA 随时可能离线,邮件只能先推到收件人服务器落地,最后一跳只能是拉。判据是"谁主动发起"。发送阶段两跳都是 SMTP 且不经过中间邮件服务器
  2. SMTP 三阶段:连接建立(220/HELO/250)→ 邮件传送(MAIL FROM/RCPT TO/DATA/单独一行的 .)→ 释放(QUIT/221)。突破 7 位 ASCII 的两条路线改的不是同一层:MIME 改内容,ESMTP 改协议本身。
  3. 信封由系统从内容首部自动提取,两者可以不一致,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 三阶段的命令与应答序列,本篇 11+2k 那张计数表逐条对应这里——连接建立「在连接建立后,接收方 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 个收件人、n 台中继)是自造的;其中"中继"与教材「SMTP 不使用中间的邮件服务器」这条明文相抵,块内已就地标注它只是为把连接计数一般化而设的假设情形,标准链路取 n=0。SMTP 会话的三阶段命令序列取自教材 6.5.2 节(印刷 p296–p297),报文数 11+2k 是按该序列逐条数出来的计数结果,教材本身不给这个式子。Base64 约 33% 膨胀是编码方式(3 字节 → 4 字符)的直接推论,教材未给具体比例。

相关知识

网络应用模型DNS 域名系统TCP 连接管理FTP 与 DHCPHTTP 协议

真题练习