IMAP UID 与编号空间
UID 是邮件在信箱内的持久编号,跨会话稳定,用来长期引用某一封邮件。UIDVALIDITY 是这套编号空间的版本号,在选中信箱时下发给客户端,一旦它的值发生变化,就意味着旧编号全部作废,客户端必须全量重新同步。与之相对的是消息号:那是会话内的序号,删掉一封邮件后面的编号整体前移,只能在当次会话里用。
基本信息
| UID | 信箱内单调递增,跨会话稳定 |
|---|---|
| UIDVALIDITY | 编号空间的版本号,随选中信箱下发 |
| 消息号 | 会话内从一到若干的序号,频繁变动 |
| 本地缓存键 | 应以版本号加编号的组合作为主键 |
| 命令区分 | 命令前加 UID 前缀即按 UID 操作 |
| 作用范围 | 仅在同一个信箱内有效 |
三种标识对照
| 标识 | 稳定性 | 适用场景 |
|---|---|---|
| 消息号 | 仅限当次会话 | 临时批量操作 |
| UID | 跨会话稳定 | 本地数据库引用与增量同步 |
| UIDVALIDITY | 变化即代表全量失效 | 缓存有效性的判断依据 |
观察相关应答
观察相关应答
a3 SELECT INBOX
* OK [UIDVALIDITY 3857529045] UIDs valid # 记录这个版本号
* 23 EXISTS # 当前消息数量
a4 UID FETCH 100:110 (UID FLAGS) # 按 UID 取信息
a5 UID SEARCH UID 200:* # 按 UID 范围检索典型使用场景
- 客户端本地缓存设计:以版本号加编号为键,避免引用错位
- 增量同步实现:只拉取编号大于本地记录的邮件
- 迁移后重新同步:识别版本号变化并触发全量重建
- 排查同步异常:确认是编号空间变化还是缓存逻辑缺陷
- 脚本安全操作:用 UID 定位目标,避免整理过程中误操作他封邮件
服务器迁移或信箱重建会让编号空间版本号发生变化,客户端因此把本地缓存全部作废并重新下载。这是协议要求的行为,不是故障;但它会带来明显的流量与耗时,迁移前应评估同步窗口,尽量避开使用高峰。