跳到主要内容

2. 协议概览

2.1 链路层级

IMAP4rev2 协议假定存在可靠的数据流, 例如 TCP 所提供的数据流. 使用 TCP 时, IMAP4rev2 服务器监听端口 143 (明文端口) 或端口 993 (隐式 TLS 端口).

2.2 命令和响应

一个 IMAP4rev2 连接由客户端/服务器网络连接的建立, 服务器的初始问候, 以及客户端/服务器交互组成. 这些客户端/服务器交互由客户端命令, 服务器数据, 以及服务器完成结果响应组成.

客户端和服务器传输的所有交互都采用行的形式, 即以 CRLF 结束的字符串. IMAP4rev2 客户端或服务器的协议接收方读取的是一行, 或者是已知计数的一串八位字节, 随后再跟一行.

2.2.1 客户端协议发送方和服务器协议接收方

客户端命令启动一次操作. 每个客户端命令都带有一个标识符前缀, 该标识符通常是较短的字母数字字符串, 例如 A0001, A0002 等, 称为 "tag" (标签). 客户端为每个命令生成不同的标签. 更正式地说: 客户端应当为每个命令生成唯一标签, 但服务器必须接受标签重用.

客户端必须严格遵循本规范给出的语法. 发送缺少空格或参数, 或包含多余空格或参数的命令, 均属于语法错误.

在两种情况下, 来自客户端的一行并不表示完整命令. 一种情况是命令参数使用八位字节计数进行引用 (见第 4.3 节对 literal 的说明); 另一种情况是命令参数需要服务器反馈 (见第 6.2.2 节中的 AUTHENTICATE 命令). 在任一情况下, 如果服务器已准备好接收这些八位字节 (如适用) 以及命令的剩余部分, 则发送命令继续请求响应. 该响应以令牌 "+" 作为前缀.

注意: 如果服务器改为检测到命令中存在错误, 它会发送带有与该命令匹配标签的 BAD 完成响应 (如下所述), 以拒绝该命令并阻止客户端继续发送该命令的更多内容.

2.2.2 服务器协议发送方和客户端协议接收方

服务器发送给客户端的数据, 以及不表示命令完成的状态响应, 都以令牌 "*" 作为前缀, 称为未标记响应 (untagged responses).

服务器数据可以作为客户端命令的结果发送, 也可以由服务器单方面发送. 由特定命令产生的服务器数据与单方面发送的服务器数据之间没有语法差异.

服务器完成结果响应表示操作成功或失败. 它带有与启动该操作的客户端命令相同的标签.

2.3 消息属性

除消息文本外, 每条消息还关联若干属性. 这些属性可以通过消息序列号或唯一标识符 (UID) 获取.

2.3.1 消息编号

消息有两种标识形式: 消息序列号和唯一标识符 (UID).

2.3.1.1 唯一标识符 (UID) 消息属性

唯一标识符 (UID) 是分配给每条消息的 32 位非零无符号整数值. UID 提供了一种可跨 IMAP 会话保持的标识方式.

2.3.1.2 消息序列号消息属性

消息序列号是从 1 到邮箱中消息数量之间的相对位置. 该位置必须按唯一标识符升序排列.

2.3.2 标志消息属性

每条消息都关联一个由零个或多个命名令牌组成的列表, 称为 "flags" (标志). IMAP4rev2 中有两类标志: 系统标志和关键字.

定义的系统标志:

  • \Seen - 消息已被读取
  • \Answered - 消息已被回复
  • \Flagged - 消息被 "flagged" (标记), 需要紧急/特别关注
  • \Deleted - 消息被 "deleted" (删除), 将由后续 EXPUNGE 移除
  • \Draft - 消息尚未完成撰写 (标记为草稿)
  • \Recent - 此标志曾在 IMAP4rev1 中使用, 现已弃用

定义的关键字:

  • $Forwarded - 消息已被转发
  • $MDNSent - 已发送消息处置通知 (Message Disposition Notification)
  • $Junk - 消息包含垃圾邮件/垃圾内容
  • $NotJunk - 消息不包含垃圾内容
  • $Phishing - 消息可能是钓鱼邮件

2.3.3 内部日期消息属性

内部日期 (Internal Date) 消息属性是服务器上该消息的内部日期和时间. 它不是 RFC5322 头部中的日期和时间, 而是反映消息接收时间的日期和时间.

2.3.4 RFC822.SIZE 消息属性

RFC822.SIZE 是消息以 RFC5322 格式表示时的八位字节数. 该大小应当与 "FETCH BODY[]" 命令的结果匹配.

2.3.5 信封结构消息属性

信封结构是消息 RFC5322 头部的解析表示. 请注意, IMAP 信封结构不同于 SMTP 信封.

2.3.6 正文结构消息属性

正文结构是消息的 MIME-IMB 正文结构信息的解析表示.

2.4 消息文本

除了能够获取消息的完整 RFC5322 文本之外, IMAP4rev2 还允许获取完整消息文本的一部分. 具体而言, 可以获取 RFC5322 消息头部, RFC5322 消息正文, MIME-IMB 正文部分, 或 MIME-IMB 头部.