1 前言
电子邮件系统中,SMTP、POP 和 IMAP 这三种协议起着至关重要的作用。SMTP 负责邮件的发送,将邮件从发件人传输到邮件服务器,并在服务器之间转发。POP 负责邮件的接收,允许用户从邮件服务器下载邮件到本地设备进行离线阅读,下载后通常会从服务器删除此邮件。IMAP 也负责邮件的接收,它提供了更灵活的邮件管理功能,用户可以在多个设备上同步邮件状态,并且邮件始终保存在服务器上,方便随时访问和管理。这三大协议相互配合,共同构建了一个高效、稳定的电子邮件系统。
2 SMTP 协议
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,主要负责将邮件从发件人的邮件客户端传送到收件人的邮件服务器。它使用 TCP/IP 协议簇,建立在 FTP 文件传输服务之上,通过 “推送” 的方式传递信息,确保邮件能够可靠且有效地在不同系统之间传输。例如,当我们使用邮件客户端发送邮件时,SMTP 客户端会请求与 SMTP 服务器建立一个 TCP 连接,然后将邮件发送给服务器,服务器再将邮件传递给接收方邮件服务器。
2.1 发展历史
SMTP 协议的发展可以追溯到 20 世纪 70 年代,当时 ARPANET 需要一种用于发送和接收电子邮件的协议。1980 年,网络中心发布了第一个 SMTP 协议标准 RFC 821,定义了发送邮件的格式,以及向服务器发送和接收电子邮件的功能,还包括服务器与客户端的命令等。1986 年 RFC 822 发布,为电子邮件提供了一个标准格式。随后又发布了一系列新的 SMTP 协议标准,如 RFC 974(传输管理)、RFC 1651(SMTP 的拓展)、RFC 1869(SMTP 服务器拓展)等。随着互联网的快速发展和电子邮件的广泛应用,SMTP 协议不断进行更新和改进,以适应日益增长的邮件传输需求和不断变化的网络环境,为电子邮件的可靠传输提供了重要的支持。
2.2 工作流程
- 建立连接
- 客户端请求连接:SMTP 客户端尝试与 SMTP 服务器建立 TCP 连接,默认使用 25 端口,若加密连接则可能使用 465 端口。
- 握手与域名确认:一旦连接建立,客户端向服务器发送
EHLO
命令,以表明客户端支持的扩展命令和 SMTP 版本等信息。服务器收到EHLO
命令后,会返回一个 220 响应代码,表示服务器准备好接收命令。
- 邮件传输
- 身份验证(如有需要):客户端发送
AUTH
命令,并按照服务器返回的支持方法将所需内容编码后发送回服务器。服务器对客户端提供的凭据进行验证,根据验证是否通过来判断是否允许继续发送邮件。 - 指定发件人:客户端使用
MAIL FROM
命令指定邮件发送者的地址。服务器接收到该命令后,会检查发件人地址的合法性,成功则返回响应代码 250。 - 指定收件人:客户端使用
RCPT TO
命令指定一个或多个邮件接收者的地址。服务器接收到该命令后,会检查每个收件人地址是否有效,是否愿意为该收件人接收邮件等,成功则返回响应代码 250。 - 发送邮件内容:客户端使用
DATA
命令发送邮件正文和附件等内容,内容需按照相关的邮件格式规范编写。客户端在输入完邮件内容后,以一个单独的行,只包含一个英文句号.
作为邮件内容的结束标识。
- 身份验证(如有需要):客户端发送
- 连接释放
客户端使用
QUIT
命令向服务器发送结束通知,表示本次邮件发送会话结束。服务器接收到命令后,会返回一个响应代码,如 221 表示服务关闭传输通道。
2.3 通信举例
在 163.COM 服务器上的 Robert 发送邮件到 OUTLOOK.COM 服务器上的 John、Chris 和 Mary,这里假设 outlook 上没有 Chris 用户。
代码语言:javascript复制// T表示客户端,S表示服务器
S: 220 OUTLOOK.COM Simple Mail Transfer Service Ready // 服务器已准备好接收客户端的连接请求
T: EHLO 163.COM // 客户端向服务器表明身份
S: 250 OUTLOOK.COM // 服务器响应并告知客户端名称
T: MAIL FROM:<Robert@163.com> // 客户端指定邮件发件人地址
S: 250 OK // 服务器返回成功响应
T: RCPT TO:<John@outlook.com> // 客户端指定邮件第一个收件人地址
S: 250 OK // 服务器返回成功响应
T: RCPT TO:<Chris@outlook.com> // 客户端指定邮件第二个收件人地址
S: 550 No such user here // 服务器返回失败响应,失败原因为没有此用户
T: RCPT TO:<Mary@outlook.com> // 客户端指定邮件第三个收件人地址
S: 250 OK // 服务器返回成功响应
T: DATA // 客户端表示准备发送邮件内容
S: 354 Start mail input; end with <CRLF>.<CRLF> // 服务器提示客户端开始输入邮件内容
T: Beginning of content... // 客户端发送邮件的具体内容
T: ...End of content. // 客户端发送邮件的具体内容
T: . // 邮件内容结束
S: 250 OK // 服务器回应邮件接收成功
T: QUIT // 客户端请求结束会话
S: 221 OUTLOOK.COM Service closing transmission channel // 服务器回应关闭传输通道,本次交互结束
2.4 优势特点
- 应用广泛,几乎所有电子邮件系统都支持该协议,使得不同邮件服务器之间能够顺利传递邮件。
- 协议设计简单高效,一系列明确的命令和响应机制,使得邮件发送过程清晰明了。
- 可靠的传输机制,采用存储转发的方式传输邮件,即使传输过程出现问题,邮件也会被暂存在服务器。
3 POP 协议详解
POP(Post Office Protocol)即邮局协议,主要用于接收邮件。常用的是 POP3 版本,它使用 TCP 的 110 端口。POP3 采用 C/S 工作模式,默认使用 TCP/IP 协议进行传输,属于应用层协议。用户可以通过电子邮件客户端设置 POP3 服务器的地址等参数,连接服务器后下载邮件。但在客户端的操作(如删除邮件等)通常不会反馈到服务器上,且下载后服务器上的邮件可能会被删除。
3.1 发展历史
在 1984 年之前,电子邮件的使用还处于探索阶段,用户需要直接登录到邮件服务器才能读取邮件,1984 年,早期版本 POP1 和 POP2 被制定出来,奠定了发展基础,但功能有所不足。直到 1998 年,POP3 成为互联网标准,广泛应用于电子邮件系统中,规定了如何将个人计算机连接到互联网的邮件服务器并下载电子邮件。随着互联网的发展,其它优秀的电子邮件接收协议如 IMAP 开始出现,POP3 面临竞争却仍在电子邮件领域占据重要地位。
3.2 工作流程
- 建立连接
- 客户端请求连接:POP 客户端尝试与 POP 服务器建立 TCP 连接,默认使用 110 端口。
- 身份验证:客户端向服务器发送
APOP
命令,提供用户名及响应 MD5 哈希值,服务器正确接收则返回OK
响应码,等待下一步操作。
- 邮件获取
- 获取邮件列表:客户端发送
LIST
命令,请求获取邮箱中的邮件列表,服务器返回每封邮件的编号和大小等信息。 - 获取特定邮件:客户端使用
RETR
命令加上邮件编号,请求获取特定的邮件内容,服务器将指定邮件的内容发送给客户端。 - 删除邮件(可选):客户端使用
DELE
命令加上邮件编号,服务器会标记该邮件为待删除状态,但不会立即删除。
- 获取邮件列表:客户端发送
- 连接释放
客户端使用
QUIT
命令向服务器发送结束通知,表示本次邮件发送会话结束。服务器接收到命令后,会返回一个响应代码,如OK
,表示成功关闭连接,此时真正删除标记为待删除的邮件。
3.3 通信举例
代码语言:javascript复制// M表示客户端,S表示服务器
S: OK POP3 server ready <Mary@outlook.com> // 服务器响应
M: APOP mary 5bfef7618cbf9ab828aedc9b3d0d58d4 // 客户端向服务器验证身份
S: OK mary's maildrop has 2 messages (320 octets) // 身份验证成功并报告邮件数量
M: STAT // 客户端请求邮件状态
S: OK 2 320 // 服务器响应邮件状态,数量为2,总大小为320字节
M: LIST // 客户端请求邮件列表
S: OK 2 messages (320 octets) // 服务器响应邮件列表
S: 1 120 // 服务器列出所有邮件及其大小
S: 2 200 // 服务器列出所有邮件及其大小
S: . // 服务器结束响应
M: RETR 1 // 客户端请求获取第一封邮件
S: OK 120 octets // 服务器成功响应
S: The entirety of the content. // 服务器发送邮件内容
S: . // 服务器结束响应
M: DELE 1 // 客户端请求删除第一封邮件
S: OK message 1 deleted // 服务器成功响应
M: RETR 2 // 客户端请求获取第二封邮件
S: OK 200 octets // 服务器成功响应
S: The entirety of the content. // 服务器发送邮件内容
S: . // 服务器结束响应
M: DELE 2 // 客户端请求删除第二封邮件
S: OK message 2 deleted // 服务器成功响应
M: QUIT // 客户端请求结束会话
S: OK dewey POP3 server signing off (maildrop empty) // 服务器成功响应
3.4 优势特点
- 支持离线访问,邮件已下载到本地设备,在无网环境下仍可查看邮件。
- 广泛支持,几乎所有的主流邮件客户端和邮件服务器都支持该协议。
4 IMAP 协议详解
IMAP(Internet Message Access Protocol)即互联网消息访问协议,同样用于接收和管理邮件。它可以在多台设备上同步和管理电子邮件,支持在线和离线两种访问模式。在服务端保留邮件的原始副本,用户可以在客户端直接对服务器上的邮件进行操作,如在线浏览、标记邮件等,且多个用户可同时访问并能感知其他用户的操作。
4.1 工作流程
- 建立连接
- 客户端请求连接:IMAP 客户端尝试与 IMAP 服务器建立 TCP 连接,默认使用 143 端口,若加密连接则可能使用 993 端口。
- 身份验证:客户端使用
login
命令向服务器发送认证信息,通常是用户名和密码等,服务器返回OK
响应码即为完成验证。
- 邮件操作
- 选择邮箱:客户端使用
SELECT
命令选择要操作的邮箱,服务器返回关于该邮箱的信息,如邮件数量、未读邮件数量等。 - 获取邮件内容:客户端使用
FETCH <编号> full
命令获取指定邮件的详细内容,如邮件的主题、发件人、日期、正文、附件等。 - 获取头部信息:客户端使用
FETCH <编号> body[header]
命令获取指定邮件的头部信息。 - 标记状态:客户端使用
FLAGS
命令标记邮件为已读、未读、重要等状态,服务器根据命令实时更新邮件的状态标志。
- 选择邮箱:客户端使用
- 断开连接
- 客户端使用
LOGOUT
命令选择断开与服务器的连接,服务器确认后,关闭连接通道。
- 客户端使用
4.2 通信举例
代码语言:javascript复制// C表示客户端,S表示服务器
S: * OK IMAP4rev1 Service Ready // 服务器响应
C: a001 login mary password // 登录用户名与密码
S: a001 OK LOGIN completed // 服务器登录成功响应
C: a002 select inbox // 选择操作的邮箱
S: * 18 EXISTS // 收件箱中有18封邮件
S: * FLAGS (Answered Flagged Deleted Seen Draft) // 收件箱支持的邮件标志
S: * 2 RECENT // 最近有2封新邮件
S: * OK [UNSEEN 17] Message 17 is the first unseen message // 第17封邮件是第一封未读邮件
S: * OK [UIDVALIDITY 3857529045] UIDs valid // 邮件ID有效
S: a002 OK [READ-WRITE] SELECT completed // 操作完成且有读写权限
C: a003 fetch 12 full // 获取编号为12的邮件的详细内容
S: * 12 FETCH (FLAGS (Seen) INTERNALDATE "17-Jul-1996 02:44:25 -0700" // ↓邮箱的详细内容↓
RFC822.SIZE 4286 ENVELOPE ("Wed, 6 Sep 2024 02:23:25 0800 (CST)"
...
BODY ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 302892))
S: a003 OK FETCH completed // 服务器返回成功响应
C: a004 fetch 12 body[header] // 获取编号为12的邮件的头部信息
S: * 12 FETCH (BODY[HEADER] {342} // 头部信息的长度为342字节
S: Date: Wed, 6 Sep 2024 02:23:25 0800 (CST) // 邮件的发送日期和时间
S: From: Robert <Robert@163.com> // 邮件的发件人
S: Subject: Three major email protocols // 邮件的主题
S: To: Mary@outlook.com // 邮件的收件人
S: Message-Id: <xxxxxxxxxxxxxxxxxx> // 邮件的唯一标识符
S: MIME-Version: 1.0 // 邮件的MIME版本
S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII // 邮件的内容类型和字符集
S: )
S: a004 OK FETCH completed // 服务器返回成功响应
C: a005 store 12 flags deleted // 修改编号为12的邮件的标志为“已删除”
S: * 12 FETCH (FLAGS (Seen Deleted)) // 编号为12的邮件的标志被成功修改
S: a005 OK FLAGS completed // 服务器返回成功响应
C: a006 logout // 结束与服务器的连接
S: * BYE IMAP4rev1 server terminating connection // 服务器正在终止连接
S: a006 OK LOGOUT completed // 成功终止连接
4.3 优势特点
- 多设备同步,对邮件的操作均可实时同步到其他设备,避免了混乱和重复操作。
- 邮件检索高效,即使面对大量邮件,也能够迅速定位到目标邮件。
- 服务器端管理出色,邮件存于服务器,节省设备空间,还可灵活管理文件夹,便捷高效。
5 协议对比与选择
5.1 协议比对
5.1.1 SMTP 与 POP/IMAP 的区别
SMTP 主要负责将邮件从发件人的邮件客户端传送到收件人的邮件服务器,它侧重于邮件的发送和中继,是一种“推送”的协议,即主动将邮件从发件人一方推送给收件人一方的服务器,但不能“拉取”消息。而 POP 和 IMAP 则主要用于接收邮件,它们可以接收来自 SMTP 发出的邮件。例如,当用户使用邮件客户端撰写一封邮件并点击发送时,邮件会通过 SMTP 协议被推送到发件人的邮件服务器,然后再由发件人的邮件服务器根据收件人的地址将邮件转发给收件人的邮件服务器。而当收件人想要查看自己的邮件时,就可以通过 POP 或 IMAP 协议从自己的邮件服务器上拉取邮件到本地客户端进行查看。
5.1.2 POP 与 IMAP 的区别
POP 协议在客户端操作邮件时,如移动邮件或标记已读,这些更改不会同步到服务器。因此,当用户在其他设备上通过 POP 协议重新连接服务器时,邮件状态保持不变,如未读状态和原始位置。相比之下,IMAP 协议实现了客户端与服务器之间的双向通信,确保客户端的任何操作都会实时反映到服务器上,如标记邮件为已读或移动到特定文件夹。
5.2 选择场景
**日常办公:**对于经常需要在不同设备上查看邮件的人来说,IMAP 协议是更好的选择。它可以确保在公司电脑、家庭电脑和手机等多个设备上的邮件状态同步,方便随时处理邮件,避免遗漏重要信息。例如,在电脑查看了一封邮件并标记为已读,在手机上也会同步显示为已读状态,避免在重复内容上浪费时间,提高工作效率。
**移动办公:**在移动办公或出差时,POP 协议的离线访问功能具有一定优势。用户可以在有网络的时候将邮件下载到本地设备,在没有网络的情况下仍然可以查看邮件,不影响工作进度。例如,在乘坐飞机或前往网络信号不好的地区时,预先下载的邮件可以随时查阅。
**大规模邮件收发:**对于企业或组织需要大规模发送邮件的情况,SMTP 协议的稳定性和广泛适用性至关重要。它能够确保邮件准确无误地传输到收件人的邮件服务器,即使在高并发的情况下也能保持良好的性能。例如,企业进行营销活动或发送通知邮件时,SMTP 协议可以保证邮件的快速发送和传递。同时,对于接收大量邮件的用户来说,IMAP 协议的服务器端管理功能可以更好地应对。它可以将邮件分类整理在服务器上,用户可以通过不同的设备随时访问和管理邮件,而不会因为邮件数量过多而导致本地设备存储压力过大。
6 写在最后
电子邮件成功发展至今,离不开 SMTP、POP 和 IMAP 三大协议的共同支撑。SMTP 负责邮件的发送,POP/IMAP 负责邮件的下载,相互协作,不断优化升级,满足在各种通信场景下的不同需要。
部分资料参考于 RFC 文档