4. 数据格式
IMAP4rev2 使用文本命令和响应. IMAP4rev2 中的数据可以采用若干形式之一: atom, number, string, parenthesized list, 或 NIL. 注意, 特定数据项可以采用多种形式; 例如, 定义为使用 "astring" 语法的数据项可以是 atom 或 string.
4.1 Atom
atom 由一个或多个非特殊字符组成.
4.1.1 序列集合和 UID 集合
一组消息可以通过 sequence set 引用, 该集合包含消息序列号或唯一标识符. 详情见第 9 节. sequence set 可以包含序列号范围 (例如 "5:50"), 特定序列号的枚举, 或二者的组合. sequence set 可以使用特殊符号 "*" 表示 mailbox 中的最大序列号. sequence set 从不包含唯一标识符.
"UID set" 类似于 sequence set, 但使用唯一标识符而不是消息序列号, 且不允许包含特殊符号 "*".
4.2 数字
number 由一个或多个数字字符组成, 表示一个数值.
4.3 字符串
string 采用三种形式之一: synchronizing literal, non-synchronizing literal, 或 quoted string. synchronizing literal 形式是 string 的通用形式, 对 string 可以包含的字符没有限制. non-synchronizing literal 形式也是通用形式, 但有长度限制. quoted string 形式是一种替代形式, 可避免处理 literal 的开销, 但对可使用的字符有限制.
当 synchronizing literal 和 non-synchronizing literal 之间的区别不重要时, 本文档仅使用术语 "literal".
synchronizing literal 是零个或多个 octet (包括 CR 和 LF) 的序列, 以前缀形式用 octet 计数加以引用: 一个左花括号 ("\\{"), octet 数量, 一个右花括号 ("\\}"), 以及一个 CRLF. 对于从服务器传输到客户端的 synchronizing literal, CRLF 后面紧跟 octet 数据. 对于从客户端传输到服务器的 synchronizing literal, 客户端在发送 octet 数据之前 MUST 等待收到命令继续请求.
non-synchronizing literal 是 synchronizing literal 的一种替代形式, 可在从客户端到服务器的方向上用于任何允许 synchronizing literal 的位置. non-synchronizing literal 形式 MUST NOT 从服务器发送到客户端. non-synchronizing literal 与 synchronizing literal 的区别在于, octet 计数和右花括号 ("\\}") 之间有一个加号 ("+"). 除非某个 IMAP 扩展另有规定, non-synchronizing literal MUST NOT 大于 4096 octet.
quoted string 是零个或多个 Unicode 字符的序列, 不包括 CR 和 LF, 以 UTF-8 编码, 并在两端各有一个双引号 (") 字符.
空 string 表示为 "" (零个字符的 quoted string), 或表示为后接 CRLF 的 \\{0\\}, 或表示为后接 CRLF 的 \\{0+\\}.
4.3.1 8-bit 和二进制字符串
通过使用 MIME-IMB 内容传输编码, 支持 8-bit 文本邮件和二进制邮件. IMAP4rev2 实现 MAY 在 literal 中传输 8-bit 或多 octet 字符, 但 SHOULD 仅在已标识 CHARSET 时这样做.
IMAP4rev2 与 I18N-HDRS 兼容. 因此, 对于包含 8-bit 内容的 header-field 值, 已标识的 charset 是 UTF-8. 只要 string 不包含 NUL, CR 或 LF, IMAP4rev2 实现 MUST 接受 quoted-string 中的 UTF-8 文本, 并且 MAY 传输这种文本.
虽然定义了 BINARY 内容传输编码, 但不允许未编码的二进制 string, 除非它是在响应 BINARY.PEEK 或 BINARY FETCH 数据项时于 <literal8> 中返回. "binary string" 是任何包含 NUL 字符的 string.
4.4 带括号列表
数据结构表示为 "parenthesized list"; 即由空格分隔、两端以圆括号界定的数据项序列. parenthesized list 可以包含其他 parenthesized list, 使用多层圆括号表示嵌套.
空列表表示为 () -- 即没有成员的 parenthesized list.
4.5 NIL
特殊形式 "NIL" 表示某个以 string 或 parenthesized list 表示的数据项不存在, 这不同于空 string "" 或空 parenthesized list ().
注意: NIL 从不用于任何采用 atom 形式的数据项. 例如, mailbox 名称 "NIL" 表示名为 NIL 的 mailbox, 而不是不存在的 mailbox 名称.
示例
以下 LIST 响应:
* LIST () "/" NIL
等价于:
* LIST () "/" "NIL"
但是, 以下响应:
* FETCH 1 (BODY[1] NIL)
不等价于:
* FETCH 1 (BODY[1] "NIL")
前者表示缺少该正文部分, 而后者表示它包含一个由三个字符 "NIL" 组成的 string.