IMAP — 互联网邮件访问协议
邮件的『在线管理』协议:应用层,基于 TCP 143(IMAPS 993),由 RFC 3501 定义,邮件留在服务器多端同步
Table of Contents
1. 协议定位
| 项目 | 信息 |
|---|---|
| 所属层 | 应用层(Application Layer) |
| 英文全称 | Internet Message Access Protocol(互联网邮件访问协议),当前主流版本 IMAP4rev1 |
| 主要 RFC | RFC 3501(IMAP4rev1);RFC 9051(IMAP4rev2,2021 年新版);RFC 2177(IDLE 推送);RFC 4315(UIDPLUS);RFC 4551(CONDSTORE);RFC 6851(MOVE);RFC 6154(特殊用途文件夹);RFC 8314(隐式 TLS 推荐) |
| 端口 | TCP 143(明文 / STARTTLS 升级)、TCP 993(IMAPS,隐式 TLS) |
| 封装于 | TCP,文本行式命令,行结束符 CRLF,支持字面量(Literal)传二进制 |
| 典型应用 | 手机 + 电脑 + 网页多端收信;企业/团队共享邮箱;需要服务端搜索与文件夹分类的场景 |
2. 一句话理解
IMAP 把服务器当成"邮件的唯一真相源":客户端只是一个视图窗口,所有已读标记、文件夹归档、删除操作都写回服务器,于是所有设备看到的都是同一份状态。
生活化类比
IMAP 像是云端网盘里的文件夹,而 POP3 像是把文件全部拷进 U 盘带走。用网盘时,你在手机上把某个文件挪进"已归档",电脑上打开看到的也是挪好的样子——因为大家看的是同一份原件。
再打个比方:POP3 是把书从图书馆借回家,IMAP 是在图书馆里看书——你贴的书签、做的分类,下次换个座位(换台设备)来看,全都还在原处。
3. 它解决什么问题
为什么没有它,网络就"缺了一块":
POP3 的"下载即搬走"模型在多设备时代彻底失效:手机收了信电脑就看不到,电脑上分好的文件夹手机上不存在,已读状态各自为政。IMAP 针对性地解决四件事:
- 多端状态一致:已读(
\Seen)、星标(\Flagged)、回复过(\Answered)等标志存在服务器,任一端修改,全端同步。 - 服务器端文件夹:支持创建、重命名、订阅任意层级的邮箱(Mailbox/Folder),归档结构对所有客户端可见。
- 按需获取(Partial Fetch):可以只取头部渲染列表、只取某个 MIME 段下载单个附件,不必整封拉下来——这对手机流量至关重要。
- 服务器端搜索与推送:
SEARCH在服务端完成检索(无需本地全量数据),IDLE让服务器主动推送新邮件通知,实现"准实时"到达。
4. 核心特征
- 【带标签的命令流水线】:每条命令以客户端生成的标签(Tag)开头(如
a001 SELECT INBOX),响应用同一标签结束,因此可以并发发多条命令、乱序收响应。 - 【四状态模型】:未认证(Not Authenticated)→ 已认证(Authenticated)→ 已选择(Selected)→ 注销(Logout)。
- 【响应分三类】:带标签的最终响应(
OK/NO/BAD)、以*开头的未标记响应(服务器主动数据/事件)、以+开头的续行请求。 - 【两套编号并存】:序号(Sequence Number,随删除而重排)与 UID(在同一
UIDVALIDITY下永久不变),编程一律用 UID。 - 【删除是两步】:
STORE +FLAGS \Deleted打标记 →EXPUNGE真删除;许多客户端实际用"移动到已删除邮件"文件夹代替。 - 【协议复杂度高】:命令数十条、语法含括号嵌套与字面量,实现难度远高于 POP3,但换来了功能完备性。
5. 与其他协议的关系
| 相关协议 | 关系 |
|---|---|
| SMTP | 互补:IMAP 只收不发,发信仍必须配置 SMTP;客户端发完信后通常用 APPEND 把副本写入"已发送"文件夹 |
| POP3 | 同类竞品:POP3 下载搬走,IMAP 在线同步;IMAP 是多设备场景的事实标准 |
| TLS | STARTTLS(143 升级)或隐式 TLS(993);RFC 8314 推荐直接用 993 |
| TCP | 承载层;IDLE 依赖长连接保持,需注意 NAT/防火墙的空闲超时 |
| JMAP(RFC 8620/8621) | 新一代基于 JSON over HTTP 的邮件访问协议,目标是替代 IMAP,目前生态仍小 |
6. 本目录学习路线
- 01-原理与报文 — 四状态机、标签与三类响应、完整命令集、标志与 UID 体系、FETCH 数据项、IDLE 推送、会话时序图。
- 02-实战与排错 — Wireshark 过滤、openssl 手工完整会话、同步不一致/IDLE 掉线/UIDVALIDITY 变更排查、与 POP3 全面对比、面试题。
学习建议:先用
openssl s_client -connect imap.qq.com:993敲一遍LOGIN → LIST → SELECT INBOX → UID FETCH → LOGOUT,直观感受"标签 + 未标记响应"这套交互模型,再去理解FETCH复杂的数据项语法。初学者最常踩的坑:手工敲命令时忘了加标签,服务器只会回一句
BAD,让人摸不着头脑——IMAP 每条命令都必须以唯一标签开头。另外两个高频坑:一是拿会随删除而重排的序号当稳定 ID 用(编程一律用 UID);二是以为STORE +FLAGS \Deleted就删掉了,其实还得EXPUNGE才真删。