IMAP 的四种连接状态
IMAP 与 SMTP 不同,它有明确的状态机:未认证、已认证、已选信箱、退出。每条命令都必须带一个客户端自取的标签(如 a1),服务器在应答里回同一标签加 OK、NO 或 BAD,这样同一条连接上可以并发多条命令。理解状态划分是排查「命令被拒」的关键,多数 NO 或 BAD 都源于在不该用的状态里发了命令。
基本信息
| 服务端口 | 143 明文(可 STARTTLS)、993 隐式 TLS |
|---|---|
| 标签机制 | 每条命令带唯一标签,应答以该标签开头并带 OK、NO、BAD |
| 数据回显 | 以星号开头的行是服务器主动送出的数据,如 EXISTS、FLAGS |
| 常用扩展 | IDLE(推送)、MOVE、UIDPLUS、CONDSTORE |
核心命令
| 命令 | 状态阶段 | 说明 |
|---|---|---|
| CAPABILITY | 任意 | 查询服务器能力列表 |
| LOGIN 与 AUTHENTICATE | 未认证 | 登录,口令或 SASL 机制 |
| STARTTLS | 未认证 | 升级加密通道 |
| SELECT 与 EXAMINE | 已认证 | 选信箱,可写或只读 |
| CREATE 与 DELETE 与 RENAME | 已认证 | 信箱管理,DELETE 删的是信箱 |
| LIST 与 LSUB | 已认证 | 列出信箱与订阅 |
| FETCH | 已选 | 取邮件数据,如 BODY、FLAGS、UID |
| STORE | 已选 | 修改标志,如加已删除 |
| SEARCH | 已选 | 检索,如 UNSEEN、FROM |
| COPY 与 MOVE | 已选 | 复制与移动,MOVE 属扩展 |
| APPEND | 已认证 | 把新邮件放入信箱 |
| EXPUNGE | 已选 | 清除已标记删除的邮件 |
| IDLE | 已选 | 等待服务器推送新事件 |
| CLOSE 与 LOGOUT | 已选与任意 | 关闭信箱与退出 |
典型命令与应答
典型命令与应答
a1 SELECT INBOX
* 172 EXISTS # 星号行是服务器主动送出的数据
* OK [UIDVALIDITY 3857529045] UIDs valid
a1 OK [READ-WRITE] SELECT completed # 带标签的最终应答
# 只读浏览用 EXAMINE,避免误标已读
b1 FETCH 1:* (FLAGS UID)
b1 OK FETCH completed典型使用场景
- 用 EXAMINE 浏览归档信箱,避免把邮件标记成已读
- 客户端同步发件箱时用 APPEND 把已发送邮件写回服务器
- 排查「删除后邮件还在」:确认是否只做了 STORE 而漏了 EXPUNGE
- 用 IDLE 实现新邮件即时提醒,替代高频轮询
EXAMINE 是 SELECT 的只读版:浏览不想误标已读的信箱(如归档、共享邮箱)时应该用 EXAMINE,两者返回的数据结构相同,权限不同。
UIDVALIDITY 变化意味着服务器上的 UID 被重置(重建信箱、迁移后的常见现象),客户端本地缓存必须整体失效并重新同步,否则会错位地把旧 UID 对应到新邮件。