← RFC Reference

RFC 9051: IMAP4rev2

Standards Track Mail Access Protocols Published March 2026
ELI5: 如果 POP3 是检查邮箱并把信件带回家,IMAP 就像在邮局有一个个人文件柜。你可以打开抽屉(文件夹)、阅读信件而不移除它们、贴彩色标签(标志)、搜索所有内容,并从你的手机、笔记本电脑或平板电脑访问同一个柜子——所有设备看到的状态都相同。邮件保留在服务器上;你的设备只是查看它们。

为什么存在这个协议

IMAP4rev1(RFC 3501,发布于 2003 年)在近二十年间是多设备电子邮件的骨干。但它积累了数十个扩展 RFC、模糊的边界情况和每个真实服务器实现方式都不同的功能。RFC 9051 — IMAP4rev2 — 是一次干净的修订,它:

如果你正在构建新的电子邮件客户端或集成,请针对 IMAP4rev2。如果服务器仅支持 IMAP4rev1,命令集几乎相同 — 只需单独协商扩展。

工作原理

连接和身份验证

IMAP 使用端口 143(STARTTLS)或端口 993(隐式 TLS,推荐)。连接后,客户端进行身份验证:

-- 连接到端口 993 (IMAPS) --
* OK [CAPABILITY IMAP4rev2 AUTH=PLAIN] 服务器就绪
a1 LOGIN alice@example.com s3cretP@ss
a1 OK [CAPABILITY IMAP4rev2 MOVE CONDSTORE] 已登录

每个客户端命令前缀带有一个标签(如 a1)。服务器用相同的标签响应,允许管道命令。无标签响应(前缀为 *)携带消息计数和功能列表等数据。

选择邮箱

a2 SELECT INBOX
* 42 EXISTS                            ← 收件箱中有 42 条消息
* OK [UIDVALIDITY 1609459200]         ← UID 纪元;如果更改,重新同步
* OK [UIDNEXT 1053]                   ← 下一个要分配的 UID
* OK [HIGHESTMODSEQ 7834]             ← 用于增量同步(CONDSTORE)
* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
a2 OK [READ-WRITE] SELECT 已完成

获取消息

-- 获取消息 1:5 的信封和标志 --
a3 FETCH 1:5 (FLAGS ENVELOPE)
* 1 FETCH (FLAGS (\Seen) ENVELOPE ("Wed, 12 Mar 2025 ..." ...))
* 2 FETCH (FLAGS () ENVELOPE (...))
...
a3 OK FETCH 已完成

-- 获取消息 UID 1050 的完整正文 --
a4 UID FETCH 1050 (BODY[])
* 41 FETCH (UID 1050 BODY[] {4523}
(完整 RFC 5322 消息...)
)
a4 OK UID FETCH 已完成

服务器端搜索

a5 SEARCH UNSEEN FROM "bob@example.com" SINCE 1-Mar-2025
* SEARCH 38 41 42
a5 OK SEARCH 已完成

关键技术细节

UID 和序列号

每条消息有两个标识符:序列号(其在邮箱中的位置,删除消息时会改变)和 UID(永久分配的号码,仅递增)。健壮的客户端始终通过 UID FETCH、UID SEARCH 等使用 UID。UIDVALIDITY 值告诉客户端其缓存的 UID 是否仍然有效;如果它改变,客户端必须从头重新同步。

标志

IMAP4rev2 定义这些系统标志:

标志 含义
\Seen 消息已被读取
\Answered 消息已被回复
\Flagged 标记为重要/星标
\Deleted 标记为删除(EXPUNGE 时移除)
\Draft 消息是草稿

IMAP4rev1 中的 \Recent 标志在 rev2 中已移除。服务器也可能支持自定义关键字(例如 $Forwarded、$Junk)。

CONDSTORE 和 QRESYNC

CONDSTORE 为每个标志变更分配一个 MODSEQ 值。知道最后看到的 MODSEQ 的客户端可以询问:"自 MODSEQ 7834 以来发生了什么变化?"并仅获取增量。QRESYNC(快速重新同步)扩展此功能以有效处理已清除的消息。它们一起使 IMAP 在全面重新同步太昂贵的移动网络上可行。

MOVE 命令

在 IMAP4rev1 中,移动消息需要 COPY + STORE \Deleted + EXPUNGE — 三个带有竞态条件的命令。IMAP4rev2 将 MOVE 包含为原生原子操作:

a6 UID MOVE 1050 "Archive"
* OK [COPYUID 1609459200 1050 287]
* 41 EXPUNGE
a6 OK MOVE 已完成

常见错误

可递送性影响

Related RFCs