FETCH 做什么
FETCH 是 IMAP 最常用的取数命令,按消息号或区间取回标记、唯一标识、信封与任意正文段。它比 POP3 强的地方是能只取需要的那部分:指定头部字段、某些正文行,或用区间表达式只取前若干字节。
BODY 与 BODY.PEEK
BODY[] 取回整封邮件时会把该信标记为已读;BODY.PEEK[] 取回同样内容但不改动已读状态。任何预览、索引与反垃圾处理都必须使用 PEEK,否则用户还没点开,邮件在服务端就已经变成已读了。
基本信息
| 消息引用 | 会话内序号会随删除与新到重排,不能跨会话依赖 |
|---|---|
| 持久标识 | UID 稳定,引用同一封信必须使用它 |
| BODY[] | 取全文并置已读标记 |
| BODY.PEEK[] | 取全文但不置已读,预览首选 |
| 区间语法 | 如 <0.2048> 表示从 0 开始取 2048 字节 |
典型使用场景
- 拉取邮件列表摘要:只取标记、UID 与信封,传输量最小
- 做预览或索引:必须用 PEEK,避免改写已读状态
- 增量同步:用 UID FETCH 按区间拉取新邮件
- 抓取附件:按 MIME 段取特定部分,而非下载整封
常用 FETCH 形态
常用 FETCH 形态
a1 FETCH 1:* (FLAGS UID) # 列表同步:标记与持久标识
a2 FETCH 100 (BODY.PEEK[HEADER.FIELDS (SUBJECT FROM DATE)]) # 只取指定头部,不改已读
a3 FETCH 100:102 BODY[TEXT]<0.2048> # 取正文前 2KB 片段
a4 UID FETCH 1234 (RFC822.SIZE INTERNALDATE) # 用 UID 取元数据
a5 FETCH 5 (ENVELOPE) # 只取信封常用数据项
| 数据项 | 含义 | 常见用途 |
|---|---|---|
| FLAGS | 已读、星标等标记 | 同步状态 |
| UID | 持久唯一标识 | 跨会话定位同一封邮件 |
| ENVELOPE | 结构化的信封字段 | 列表展示,不必下载正文 |
| RFC822.SIZE | 邮件字节数 | 限制单次下载体积 |
| BODY.PEEK[HEADER...] | 指定头部字段 | 预览与索引 |
| BODY[TEXT]<0.2048> | 正文片段 | 摘要与反垃圾判断 |
消息号会随删除与新到重排:跨会话引用同一封信必须用 UID,否则可能对到另一封邮件上。
预览类功能误用 BODY[] 是很常见的缺陷:用户只是滑过列表,邮件就被标成已读,投诉往往来得很直接。