RFC 1939: POP3 — 邮局协议第3版
ELI5: POP3 就像检查实体邮箱。你走到邮局,打开你的箱子,把所有信件带回家,箱子现在是空的。你在自己的书桌上离线阅读所有内容。这很简单而且有效——但如果你从第二个位置检查邮件,那些信件已经消失了。POP3 下载消息,并且(默认情况下)从服务器删除它们。
存在原因
在互联网早期,大多数用户没有持久连接。拨号连接速度慢且昂贵。电子邮件架构分为两个角色:
- MTA(邮件传输代理):一个始终在线的服务器,通过 SMTP 接收和排队邮件。
- MUA(邮件用户代理):一个定期连接以检索累积邮件的客户端应用程序。
POP3 弥补了这个差距。它为客户端提供了一种简单、无状态的方式来身份验证、列出消息、下载消息,以及可选地从服务器删除消息。它的设计目标是在低资源机器上用最少的代码实现 — 并且成功了。POP3 仍然是地球上支持最广泛的邮件访问协议之一。
工作原理
连接和状态
POP3 会话经过三个顺序状态:
- 授权:客户端连接(端口 110 或用于隐式 TLS 的端口 995)并使用用户名和密码进行身份验证。
- 交互:客户端发出命令以列出、检索和标记消息以供删除。
-
更新:客户端发送
QUIT。服务器执行所有待删除项并关闭连接。
典型的 POP3 会话
-- 客户端连接到端口 995 (POP3S) -- +OK POP3 服务器已就绪 USER alice@example.com +OK PASS s3cretP@ss +OK 已登录。 -- 现在处于交互状态 -- STAT +OK 3 12400 ← 3 条消息,共 12400 个八位字节 LIST +OK 3 条消息 1 4200 2 3800 3 4400 . RETR 1 ← 下载消息 1 +OK 4200 个八位字节 (完整的 RFC 5322 消息内容...) . DELE 1 ← 标记消息 1 以供删除 +OK 已删除。 QUIT +OK 再见。 ← 服务器现在删除消息 1
核心 POP3 命令
| 命令 | 状态 | 用途 |
|---|---|---|
USER / PASS
|
授权 | 使用用户名和密码进行身份验证 |
APOP |
授权 | 质询-响应身份验证(避免以明文形式发送密码) |
STAT |
交互 | 获取消息计数和总大小 |
LIST |
交互 | 列出消息号和大小 |
RETR |
交互 | 按号码检索完整消息 |
DELE |
交互 | 标记消息以供删除 |
NOOP |
交互 | 保持会话活动 |
RSET |
交互 | 取消标记所有标记为删除的消息 |
TOP |
交互 | 检索标题加 n 行正文 |
UIDL |
交互 | 获取唯一 ID 列表(用于跟踪已下载的消息) |
QUIT |
任意 | 结束会话;触发更新状态 |
关键技术细节
下载并删除与保留在服务器上
POP3 的默认模型是下载并删除:客户端使用 RETR 检索每条消息,然后用 DELE 标记它,服务器在 QUIT 时删除它。许多客户端提供"将消息保留在服务器上"选项,这只是跳过 DELE 步骤。UIDL 命令提供唯一 ID,以便客户端可以跟踪已下载的消息,而无需重新下载。
锁定
POP3 需要对邮箱的独占锁。一次只有一个客户端可以访问 POP3 邮箱。如果第二个客户端试图在第一个客户端处于交互状态时连接,它将被拒绝。这使 POP3 不适合多设备访问。
无文件夹、无标志、无搜索
POP3 将邮箱视为编号消息的平面列表。没有文件夹、标签、已读/未读标志或服务器端搜索的概念。服务器纯粹是消息存储;所有组织都在客户端上进行。这是 POP3 和 IMAP 之间的根本区别。
安全性:APOP 和 TLS
原始的 USER/PASS 身份验证以明文形式发送密码。APOP 使用共享密钥 MD5 质询来避免这种情况,但 MD5 现在被认为在加密上已破裂。现代 POP3 应始终在隐式 TLS 端口 995 上运行(根据 RFC 8314)或作为备选方案使用 STLS(POP3 等效于 STARTTLS)。
常见错误
- 在多个设备上使用 POP3。由于 POP3 下载并删除,手机和笔记本电脑会争夺消息。每条消息只有一个设备看到。改为使用 IMAP 或 JMAP。
- 在没有 TLS 的端口 110 上运行 POP3。凭据和消息内容以明文形式遍历网络。始终使用带隐式 TLS 的端口 995。
- 依赖 APOP 获得安全性。APOP 使用 MD5,容易受到碰撞和原像攻击。TLS 是唯一可靠的保护。
- 在"保留在服务器上"模式下不使用 UIDL。没有 UIDL,处于"保留在服务器上"模式的客户端没有可靠的方式来知道已下载了哪些消息,导致重新连接后出现重复。
-
不发送 QUIT 即断开连接。如果客户端在不发送
QUIT的情况下断开连接,服务器不会进入更新状态。待处理的DELE命令被丢弃 — 本应删除的消息将重新出现。 - 期望服务器端功能。POP3 没有搜索、没有标志、没有文件夹。如果应用程序需要任何这些,POP3 是错误的协议。
可递送性影响
- POP3 是检索协议,不是发送协议。它对发送的出站邮件是否到达收件箱没有直接影响。但是,它影响收件人如何与发送给他们的邮件进行交互。
- 已读回执和追踪。POP3 客户端下载消息以供离线阅读。打开跟踪像素可能要到用户在本地客户端打开消息时才会触发,如果他们根本加载远程图像的话。
-
退回处理。如果使用 POP3 轮询退回邮箱,请使用
UIDL以避免重新处理退回。确保轮询间隔足够频繁以及时处理退回,以保持列表卫生。 - 收件箱放置。使用 POP3 客户端的收件人将所有消息接收到平面收件箱中,没有服务器端垃圾邮件过滤(除非服务器在 POP3 访问前过滤)。这可能意味着消息的可见性更高 — 或更多投诉,如果收件人感到不堪重负。