首页/网络/协议速查/IMAP FETCH 语法

IMAP FETCH 语法

FETCH 是 IMAP 的万能取数命令:按消息号或范围取 FLAGS/UID/信封/任意正文段;BODY[] 会把信标为已读,预览要用 BODY.PEEK。

协议速查网络更新于 2026-10-13

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[] 是很常见的缺陷:用户只是滑过列表,邮件就被标成已读,投诉往往来得很直接。

易错点

  • 预览时误用 BODY[]:用户没点开邮件就已被标记为已读
  • 用会话内消息号做持久引用:删除或新到后序号重排,读到错误的邮件
  • 一次 FETCH 拉取全量正文:大信箱与弱网客户端下同步速度会被拖垮
  • 区间取值的单位理解错:区间按字节计算而不是按行,按行预期会得到错误结果
  • 不处理服务器返回的截断或部分取回结果:客户端会静默丢失后半段内容

数据来源与参考

  • RFC 3501 §6.4.5(FETCH)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌