7. 服务器响应 (Server Responses)
与列表中的某个名称匹配的那些头部字段; 类似地, HEADER.FIELDS.NOT 返回的子集只包含 field-name 不匹配的头部字段. 字段匹配不区分大小写, 但除此之外必须精确匹配. 取子集不会排除头部和正文之间的 [RFC-2822] 分隔空行; 除非消息没有正文也没有空行, 否则该空行会包含在所有头部获取结果中.
MIME 部分说明符指此部分的 [MIME-IMB] 头部.
TEXT 部分说明符指消息的文本正文, 省略 [RFC-2822] 头部.
下面是一个复杂消息及其若干部分说明符的示例:
HEADER (消息的 [RFC-2822] 头部)
TEXT (消息的 [RFC-2822] 文本正文) MULTIPART/MIXED
1 TEXT/PLAIN
2 APPLICATION/OCTET-STREAM
3 MESSAGE/RFC822
3.HEADER (消息的 [RFC-2822] 头部)
3.TEXT (消息的 [RFC-2822] 文本正文) MULTIPART/MIXED
3.1 TEXT/PLAIN
3.2 APPLICATION/OCTET-STREAM
4 MULTIPART/MIXED
4.1 IMAGE/GIF
4.1.MIME (IMAGE/GIF 的 [MIME-IMB] 头部)
4.2 MESSAGE/RFC822
4.2.HEADER (消息的 [RFC-2822] 头部)
4.2.TEXT (消息的 [RFC-2822] 文本正文) MULTIPART/MIXED
4.2.1 TEXT/PLAIN
4.2.2 MULTIPART/ALTERNATIVE
4.2.2.1 TEXT/PLAIN
4.2.2.2 TEXT/RICHTEXT
可以获取指定文本的子字符串. 这通过在部分说明符后附加一个左尖括号 ("<"), 所需第一个八位字节的八位字节位置, 一个句点, 所需的最大八位字节数, 以及一个右尖括号 (">") 来完成. 如果起始八位字节超过文本末尾, 则返回空字符串.
任何试图读取超过文本末尾的部分获取都会按适当方式截断. 即使发生了这种截断, 从八位字节 0 开始的部分获取也会作为部分获取返回.
注意: 这意味着对于一个 1500 八位字节的消息, BODY[]<0.2048> 将返回带有大小为 1500 的 literal 的 BODY[]<0>, 而不是 BODY[].
注意: HEADER.FIELDS 或 HEADER.FIELDS.NOT 部分说明符的子字符串获取是在对头部取子集之后计算的.
\Seen 标志会被隐式设置; 如果这导致标志发生改变, 则应该将这些标志作为 FETCH 响应的一部分包含在内.
BODY.PEEK[<section>]<<partial>> : BODY[<section>] 的另一种形式, 不会隐式设置 \Seen 标志.
BODYSTRUCTURE : 消息的 [MIME-IMB] 正文结构. 这是服务器通过解析 [RFC-2822] 头部和 [MIME-IMB] 头部中的 [MIME-IMB] 头部字段计算出来的.
ENVELOPE : 消息的信封结构. 这是服务器通过将 [RFC-2822] 头部解析为各组成部分, 并按需为各种字段提供默认值而计算出来的.
FLAGS : 为此消息设置的标志.
INTERNALDATE : 消息的内部日期.
RFC822 : 在功能上等同于 BODY[], 区别在于生成的未加标签 FETCH 数据的语法不同, 返回的是 RFC822.
RFC822.HEADER : 在功能上等同于 BODY.PEEK[HEADER], 区别在于生成的未加标签 FETCH 数据的语法不同, 返回的是 RFC822.HEADER.
RFC822.SIZE : 消息的 [RFC-2822] 大小.
RFC822.TEXT : 在功能上等同于 BODY[TEXT], 区别在于生成的未加标签 FETCH 数据的语法不同, 返回的是 RFC822.TEXT.
UID : 消息的唯一标识符.
Example: C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)]) S: * 2 FETCH .... S: * 3 FETCH .... S: * 4 FETCH .... S: A654 OK FETCH completed
6.4.6. STORE 命令 (STORE Command)
Arguments: sequence set message data item name value for message data item
Responses: 未加标签响应: FETCH
Result: OK - store completed NO - store 错误: 无法存储该数据 BAD - 命令未知或参数无效
STORE 命令会改变邮箱中与消息关联的数据. 通常, STORE 将通过未加标签 FETCH 响应返回该数据的更新值. 数据项名称中的 ".SILENT" 后缀会阻止未加标签 FETCH, 并且服务器应该假定客户端已经自行确定更新后的值, 或者并不关心更新后的值.
注意: 无论是否使用了 ".SILENT" 后缀, 如果观察到来自外部来源的消息标志变更, 服务器应该发送未加标签 FETCH 响应. 其意图是使标志状态在不存在竞争条件的情况下是确定的.
当前定义的可存储数据项如下:
FLAGS <flag list> : 用参数替换消息的标志 (\Recent 除外). 这些标志的新值会像执行了对这些标志的 FETCH 一样被返回.
FLAGS.SILENT <flag list> : 等同于 FLAGS, 但不返回新值.
+FLAGS <flag list> : 将参数添加到消息的标志中. 这些标志的新值会像执行了对这些标志的 FETCH 一样被返回.
+FLAGS.SILENT <flag list> : 等同于 +FLAGS, 但不返回新值.
-FLAGS <flag list> : 从消息的标志中移除参数. 这些标志的新值会像执行了对这些标志的 FETCH 一样被返回.
-FLAGS.SILENT <flag list> : 等同于 -FLAGS, 但不返回新值.
Example: C: A003 STORE 2:4 +FLAGS (\Deleted) S: * 2 FETCH (FLAGS (\Deleted \Seen)) S: * 3 FETCH (FLAGS (\Deleted)) S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen)) S: A003 OK STORE completed
6.4.7. COPY 命令 (COPY Command)
Arguments: sequence set mailbox name
Responses: 此命令无特定响应
Result: OK - copy completed NO - copy 错误: 无法将这些消息复制到该 name BAD - 命令未知或参数无效
COPY 命令将指定消息复制到指定目标邮箱的末尾. 在副本中, 消息的标志和内部日期应该保留, 并且应该设置 Recent 标志.
如果目标邮箱不存在, 服务器应该返回错误. 它不应该自动创建该邮箱. 除非确定无法创建目标邮箱, 否则服务器必须发送 response code "[TRYCREATE]" 作为带标签 NO 响应文本的前缀. 这会向客户端提示: 它可以尝试 CREATE 命令, 并在 CREATE 成功后重试 COPY.
如果 COPY 命令因任何原因未成功, 服务器实现必须将目标邮箱恢复到 COPY 尝试之前的状态.
Example: C: A003 COPY 2:4 MEETING S: A003 OK COPY completed
6.4.8. UID 命令 (UID Command)
Arguments: command name command arguments
Responses: 未加标签响应: FETCH, SEARCH
Result: OK - UID command completed NO - UID 命令错误 BAD - 命令未知或参数无效
UID 命令有两种形式. 第一种形式以 COPY, FETCH, 或 STORE 命令及其对应参数作为参数. 但是, sequence set 参数中的数字是唯一标识符, 而不是消息序列号 (message sequence number). 允许使用 sequence set 范围, 但不能保证唯一标识符是连续的.
不存在的唯一标识符会被忽略, 且不会生成任何错误消息. 因此, UID FETCH 命令可能在没有任何数据的情况下返回 OK, 或者 UID COPY 或 UID STORE 可能在未执行任何操作的情况下返回 OK.
在第二种形式中, UID 命令采用 SEARCH 命令及 SEARCH 命令参数. 参数的解释方式与 SEARCH 相同; 但是, 对于 UID SEARCH 命令, SEARCH 响应中返回的数字是唯一标识符, 而不是消息序列号. 例如, 命令 UID SEARCH 1:100 UID 443:557 返回与两个 sequence set 的交集对应的唯一标识符, 即消息序列号范围 1:100 与 UID 范围 443:557 的交集.
注意: 在上面的示例中, 出现了 UID 范围 443:557. 关于不存在的唯一标识符会被忽略且不会产生任何错误消息的相同说明在这里同样适用. 因此, 即使 UID 443 和 557 都不存在, 此范围也是有效的, 并且会包含现有的 UID 495.
还要注意, UID 范围 559:* 始终包含邮箱中最后一条消息的 UID, 即使 559 高于任何已分配的 UID 值也是如此. 这是因为范围的内容独立于范围端点的顺序. 因此, 除非邮箱为空, 否则任何以 * 作为其中一个端点的 UID 范围都表示至少一条消息 (具有最高编号 UID 的消息).
在未加标签 FETCH 响应中, "*" 后面的数字始终是消息序列号, 而不是唯一标识符, 即使该响应是 UID 命令响应也是如此. 但是, 无论是否在 FETCH 中将 UID 指定为消息数据项, 服务器实现都必须将 UID 消息数据项隐式包含为由 UID 命令导致的任何 FETCH 响应的一部分.
注意: 将 UID 消息数据项包含为 FETCH 响应一部分的规则主要适用于 UID FETCH 和 UID STORE 命令, 包括未将 UID 作为消息数据项包含的 UID FETCH 命令. 虽然其他 UID 命令不太可能导致未加标签 FETCH, 但此规则同样适用于这些命令.
Example: C: A999 UID FETCH 4827313:4828442 FLAGS S: * 23 FETCH (FLAGS (\Seen) UID 4827313) S: * 24 FETCH (FLAGS (\Seen) UID 4827943) S: * 25 FETCH (FLAGS (\Seen) UID 4828442) S: A999 OK UID FETCH completed
6.5. 客户端命令 - 实验/扩展 (Client Commands - Experimental/Expansion)
6.5.1. X<atom> 命令 (X<atom> Command)
Arguments: 由实现定义
Responses: 由实现定义
Result: OK - command completed NO - 失败 BAD - 命令未知或参数无效
任何以 X 为前缀的命令都是实验命令. 不属于本规范, 本规范的标准或标准跟踪修订版, 或 IESG 批准的实验协议的命令, 必须使用 X 前缀.
实验命令发出的任何新增未加标签响应也必须以 X 为前缀. 除非客户端通过发出关联的实验命令请求了此类响应, 否则服务器实现不得发送任何此类未加标签响应.
Example: C: a441 CAPABILITY S: * CAPABILITY IMAP4rev1 XPIG-LATIN S: a441 OK CAPABILITY completed C: A442 XPIG-LATIN S: * XPIG-LATIN ow-nay eaking-spay ig-pay atin-lay S: A442 OK XPIG-LATIN ompleted-cay
-
服务器响应 (Server Responses)
服务器响应有三种形式: 状态响应 (status responses), 服务器数据 (server data), 以及命令继续请求 (command continuation request). 在下面响应描述中以 "Contents:" 标识的服务器响应所包含的信息, 是按功能而非按语法描述的. 服务器响应的精确语法在正式语法 (Formal Syntax) 章节中描述.
客户端必须随时准备接受任何响应.
状态响应可以是带标签 (tagged) 或未加标签 (untagged) 的. 带标签状态响应表示客户端命令的完成结果 (OK, NO, 或 BAD 状态), 并带有与该命令匹配的 tag.
某些状态响应以及所有服务器数据都是未加标签的. 未加标签响应由 token "*" 而不是 tag 指示. 未加标签状态响应表示服务器问候语, 或者不表示命令完成的服务器状态 (例如, 即将发生的系统关闭警报). 出于历史原因, 未加标签服务器数据响应也称为 "unsolicited data", 但严格来说, 只有单方面服务器数据才真正是 "unsolicited".
某些服务器数据在收到时必须由客户端记录; 这会在该数据的描述中注明. 这些数据传递关键信息, 会影响后续所有命令和响应的解释 (例如, 反映消息创建或销毁的更新).
其他服务器数据应该被记录以供以后参考; 如果客户端不需要记录该数据, 或记录该数据没有明显目的 (例如, 没有 SEARCH 命令正在进行时收到 SEARCH 响应), 则该数据应该被忽略.
当 IMAP 连接处于 selected 状态时, 会出现单方面未加标签服务器数据的一个示例. 在 selected 状态下, 服务器会在命令执行过程中检查邮箱中是否有新消息. 通常, 这是每个命令执行过程的一部分; 因此, NOOP 命令足以检查新消息. 如果有新
7.1. 服务器响应 - 状态响应 (Server Responses - Status Responses)
状态响应包括 OK, NO, BAD, PREAUTH 和 BYE. OK, NO 和 BAD 可以是带标签或未加标签的. PREAUTH 和 BYE 始终是未加标签的.
状态响应可以包含一个可选的 "response code". response code 由方括号内的数据组成, 形式为 atom, 后面可以跟一个空格和参数. 除 OK/NO/BAD 条件之外, response code 还为客户端软件包含附加信息或状态码; 当客户端可以基于附加信息采取特定操作时, 会定义 response code.
RFC 3501 IMAPv4 March 2003
当前定义的 response codes 如下:
ALERT : 人类可读文本包含一个特殊警报, 必须以能够引起用户注意的方式呈现给用户.
BADCHARSET : 可选地后跟一个用括号括起的 charsets 列表. SEARCH 失败, 因为给定 charset 不受此实现支持. 如果给出了可选 charsets 列表, 则该列表列出此实现支持的 charsets.
CAPABILITY : 后跟一个 capabilities 列表. 这可以出现在初始 OK 或 PREAUTH 响应中, 用于传输初始 capabilities 列表. 如果客户端识别此响应, 就无需发送单独的 CAPABILITY 命令.
PARSE : 人类可读文本表示解析 mailbox 中某条消息的 [RFC-2822] 头部或 [MIME-IMB] 头部时发生错误.
PERMANENTFLAGS : 后跟一个用括号括起的 flags 列表, 指示客户端可以永久更改哪些已知 flags. 出现在 FLAGS 未加标签响应中但不在 PERMANENTFLAGS 列表中的任何 flags, 都不能被永久设置. 如果客户端尝试 STORE 一个不在 PERMANENTFLAGS 列表中的 flag, 服务器将忽略该更改, 或者仅在当前会话的剩余期间存储该状态更改. PERMANENTFLAGS 列表还可以包含特殊 flag *, 它表示可以通过尝试将这些 flags 存入 mailbox 来创建新的 keywords.
RFC 3501 IMAPv4 March 2003
READ-ONLY : mailbox 以只读方式被选中, 或者其在 selected 状态下的访问权限已从读写变为只读.
READ-WRITE : mailbox 以读写方式被选中, 或者其在 selected 状态下的访问权限已从只读变为读写.
TRYCREATE : APPEND 或 COPY 尝试失败, 因为目标 mailbox 不存在 (而不是其他原因). 这是给客户端的提示: 如果先由 CREATE 命令创建 mailbox, 该操作就可以成功.
UIDNEXT : 后跟一个十进制数字, 指示下一个唯一标识符值. 更多信息请参见第 2.3.1.1 节.
UIDVALIDITY : 后跟一个十进制数字, 指示唯一标识符有效性值. 更多信息请参见第 2.3.1.1 节.
UNSEEN : 后跟一个十进制数字, 指示第一条未设置 \Seen flag 的消息编号.
由特定客户端或服务器实现定义的其他 response codes, 在加入本协议的修订版之前应该以 "X" 为前缀. 客户端实现应该忽略无法识别的 response codes.
7.1.1. OK 响应 (OK Response)
Contents: 可选的 response code human-readable text
OK 响应表示来自服务器的信息性消息. 带标签时, 它表示相关命令成功完成. 人类可读文本可以作为信息性消息呈现给用户. 未加标签形式表示仅含信息的消息; 信息的性质可以由 response code 指示.
未加标签形式还用作连接启动时三种可能问候语之一. 它表示连接尚未认证, 需要 LOGIN 命令.
Example: S: * OK IMAP4rev1 server ready C: A001 LOGIN fred blurdybloop S: * OK [ALERT] System shutdown in 10 minutes S: A001 OK LOGIN Completed
7.1.2. NO 响应 (NO Response)
Contents: 可选的 response code human-readable text
NO 响应表示来自服务器的操作错误消息. 带标签时, 它表示相关命令未成功完成. 未加标签形式表示警告; 命令仍然可以成功完成. 人类可读文本描述该条件.
Example: C: A222 COPY 1:2 owatagusiam S: * NO Disk is 98% full, please delete unnecessary data S: A222 OK COPY completed C: A223 COPY 3:200 blurdybloop S: * NO Disk is 98% full, please delete unnecessary data S: * NO Disk is 99% full, please delete unnecessary data S: A223 NO COPY failed: disk is full
7.1.3. BAD 响应 (BAD Response)
Contents: 可选的 response code human-readable text
BAD 响应表示来自服务器的错误消息. 带标签时, 它报告客户端命令中的协议级错误; tag 指示导致错误的命令. 未加标签形式表示无法确定相关命令的协议级错误; 它也可以表示服务器内部故障. 人类可读文本描述该条件.
RFC 3501 IMAPv4 March 2003
Example: C: ...very long command line... S: * BAD Command line too long C: ...empty line... S: * BAD Empty command line C: A443 EXPUNGE S: * BAD Disk crash, attempting salvage to a new disk! S: * OK Salvage successful, no data lost S: A443 OK Expunge completed
7.1.4. PREAUTH 响应 (PREAUTH Response)
Contents: 可选的 response code human-readable text
PREAUTH 响应始终是未加标签的, 并且是连接启动时三种可能问候语之一. 它表示连接已经通过外部方式认证; 因此不需要 LOGIN 命令.
Example: S: * PREAUTH IMAP4rev1 server logged in as Smith
7.1.5. BYE 响应 (BYE Response)
Contents: 可选的 response code human-readable text
BYE 响应始终是未加标签的, 表示服务器即将关闭连接. 客户端可以在状态报告中向用户显示人类可读文本. BYE 响应在以下四种条件之一发送:
-
作为正常 logout 序列的一部分. 服务器会在向 LOGOUT 命令发送带标签 OK 响应之后关闭连接.
-
作为紧急关闭公告. 服务器会立即关闭连接.
-
作为 inactivity autologout 公告. 服务器会立即关闭连接.
-
作为连接启动时三种可能问候语之一, 表示服务器不愿接受来自此客户端的连接. 服务器会立即关闭连接.
RFC 3501 IMAPv4 March 2003
正常 LOGOUT 序列中出现的 BYE (第一种情况) 与因故障出现的 BYE (其他三种情况) 的区别在于, 故障情况下连接会立即关闭. 在所有情况下, 客户端应该继续从服务器读取响应数据, 直到连接关闭; 这将确保任何挂起的未加标签响应或完成响应都被读取并处理.
Example: S: * BYE Autologout; idle for too long
7.2. 服务器响应 - 服务器和 Mailbox 状态 (Server Responses - Server and Mailbox Status)
这些响应始终是未加标签的. 服务器和 mailbox 状态数据就是通过这种方式从服务器传输到客户端的. 其中许多响应通常由同名命令产生.
7.2.1. CAPABILITY 响应 (CAPABILITY Response)
Contents: capability listing
CAPABILITY 响应作为 CAPABILITY 命令的结果出现. capability listing 包含服务器支持的 capability 名称, 以空格分隔. capability listing 必须包含 atom "IMAP4rev1".
此外, 客户端和服务器实现必须实现 STARTTLS, LOGINDISABLED 和 AUTH=PLAIN capabilities (在 [IMAP-TLS] 中描述). 重要信息请参见安全考虑 (Security Considerations) 章节.
以 "AUTH=" 开头的 capability 名称表示服务器支持该特定认证机制.
LOGINDISABLED capability 表示 LOGIN 命令已禁用, 即使用户名和密码有效, 服务器也会对任何使用 LOGIN 命令的尝试返回带标签 NO 响应. 如果服务器通告 LOGINDISABLED capability, IMAP 客户端不得发出 LOGIN 命令.
其他 capability 名称表示服务器支持 IMAP4rev1 协议的某个扩展, 修订或修正. 在客户端发出使用相关 capability 的命令之前, 服务器响应必须符合本文档.
Capability 名称必须要么以 "X" 开头, 要么是已在 IANA 注册的标准或标准跟踪 IMAP4rev1 扩展, 修订或修正. 除非此类名称以 "X" 为前缀, 否则服务器不得提供未注册或非标准 capability 名称.
RFC 3501 IMAPv4 March 2003
客户端实现不应该要求除 "IMAP4rev1" 之外的任何 capability 名称, 并且必须忽略任何未知 capability 名称.
服务器可以自动发送 capabilities, 方法是在初始 PREAUTH 或 OK 响应中使用 CAPABILITY response code, 并在认证成功时作为带标签 OK 响应的一部分发送更新后的 CAPABILITY response code. 如果客户端识别这些自动 capabilities, 就无需发送单独的 CAPABILITY 命令.
Example: S: * CAPABILITY IMAP4rev1 STARTTLS AUTH=GSSAPI XPIG-LATIN
7.2.2. LIST 响应 (LIST Response)
Contents: name attributes hierarchy delimiter name
LIST 响应作为 LIST 命令的结果出现. 它返回与 LIST 规范匹配的单个名称. 单个 LIST 命令可以产生多个 LIST 响应.
定义了四个名称属性:
\Noinferiors : 此名称下不可能存在任何子层级; 现在不存在子层级, 以后也不能创建.
\Noselect : 不能将此名称用作可选择的 mailbox.
\Marked : 服务器已将该 mailbox 标记为 "interesting"; 该 mailbox 可能包含自上次选择该 mailbox 后新增的消息.
\Unmarked : 该 mailbox 自上次被选择以来不包含任何新增消息.
RFC 3501 IMAPv4 March 2003
如果服务器无法确定 mailbox 是否 "interesting", 或者该名称是 \Noselect 名称, 服务器不应该发送 \Marked 或 \Unmarked.
层级分隔符是用于分隔 mailbox 名称中层级级别的字符. 客户端可以使用它创建子 mailboxes, 并搜索命名层级的更高或更低级别. 顶层层级节点的所有子节点必须使用相同的分隔字符. NIL 层级分隔符表示不存在层级; 该名称是 "flat" 名称.
名称表示明确的从左到右层级, 且必须可作为 LIST 和 LSUB 命令中的引用使用. 除非指示了 \Noselect, 否则该名称必须也可作为接受 mailbox 名称的命令 (如 SELECT) 的参数使用.
Example: S: * LIST (\Noselect) "/" ~/Mail/foo
7.2.3. LSUB 响应 (LSUB Response)
Contents: name attributes hierarchy delimiter name
LSUB 响应作为 LSUB 命令的结果出现. 它返回与 LSUB 规范匹配的单个名称. 单个 LSUB 命令可以产生多个 LSUB 响应. 数据格式与 LIST 响应相同.
Example: S: * LSUB () "." #news.comp.mail.misc
7.2.4 STATUS 响应 (STATUS Response)
Contents: name status parenthesized list
STATUS 响应作为 STATUS 命令的结果出现. 它返回与 STATUS 规范匹配的 mailbox 名称以及请求的 mailbox 状态信息.
Example: S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292)
RFC 3501 IMAPv4 March 2003
7.2.5. SEARCH 响应 (SEARCH Response)
Contents: zero or more numbers
SEARCH 响应作为 SEARCH 或 UID SEARCH 命令的结果出现. 这些数字指代匹配搜索条件的消息. 对于 SEARCH, 它们是消息序列号; 对于 UID SEARCH, 它们是唯一标识符. 每个数字以空格分隔.
Example: S: * SEARCH 2 3 6
7.2.6. FLAGS 响应 (FLAGS Response)
Contents: flag parenthesized list
FLAGS 响应作为 SELECT 或 EXAMINE 命令的结果出现. flag parenthesized list 标识适用于此 mailbox 的 flags (至少包括系统定义的 flags). 除系统 flags 之外的 flags 也可以存在, 具体取决于服务器实现.
来自 FLAGS 响应的更新必须由客户端记录.
Example: S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
7.3. 服务器响应 - Mailbox 大小 (Server Responses - Mailbox Size)
这些响应始终是未加标签的. mailbox 大小变化就是通过这种方式从服务器传输到客户端的. 紧跟在 "*" token 之后的是一个表示消息计数的数字.
7.3.1. EXISTS 响应 (EXISTS Response)
Contents: none
EXISTS 响应报告 mailbox 中的消息数量. 该响应作为 SELECT 或 EXAMINE 命令的结果出现, 也会在 mailbox 大小发生变化时出现 (例如, 新消息).
来自 EXISTS 响应的更新必须由客户端记录.
Example: S: * 23 EXISTS
RFC 3501 IMAPv4 March 2003
7.3.2. RECENT 响应 (RECENT Response)
Contents: none
RECENT 响应报告设置了 \Recent flag 的消息数量. 该响应作为 SELECT 或 EXAMINE 命令的结果出现, 也会在 mailbox 大小发生变化时出现 (例如, 新消息).
注意: 不能保证 recent 消息的消息序列号是 mailbox 中最高 n 条消息的连续范围 (其中 n 是 RECENT 响应报告的值). 不满足这一点的情况示例包括: 多个客户端打开同一个 mailbox (第一个收到通知的会话会看到它为 recent, 其他会话可能看到它为 non-recent), 以及 mailbox 被非 IMAP agent 重新排序.
识别 recent 消息的唯一可靠方式是查看消息 flags, 看哪些消息设置了 \Recent flag, 或执行 SEARCH RECENT.
来自 RECENT 响应的更新必须由客户端记录.
Example: S: * 5 RECENT
7.4. 服务器响应 - 消息状态 (Server Responses - Message Status)
这些响应始终是未加标签的. 消息数据通常就是通过这种方式从服务器传输到客户端的, 常常作为同名命令的结果出现. 紧跟在 "*" token 之后的是一个表示消息序列号的数字.
7.4.1. EXPUNGE 响应 (EXPUNGE Response)
Contents: none
EXPUNGE 响应报告指定的消息序列号已从 mailbox 中永久移除. mailbox 中每条后续消息的消息序列号会立即减 1, 并且此递减会反映在后续响应的消息序列号中 (包括其他未加标签 EXPUNGE 响应).
RFC 3501 IMAPv4 March 2003
EXPUNGE 响应还会递减 mailbox 中的消息数量; 无需发送带有新值的 EXISTS 响应.
由于立即递减规则, 连续 EXPUNGE 响应集合中出现的消息序列号取决于消息是从较低编号到较高编号移除, 还是从较高编号到较低编号移除. 例如, 如果一个包含 9 条消息的 mailbox 中最后 5 条消息被 expunge, "lower to higher" 服务器将为消息序列号 5 发送五个未加标签 EXPUNGE 响应, 而 "higher to lower server" 将依次为消息序列号 9, 8, 7, 6 和 5 发送未加标签 EXPUNGE 响应.
在没有命令正在进行时, 或者在响应 FETCH, STORE 或 SEARCH 命令期间, 不得发送 EXPUNGE 响应. 该规则对于防止客户端和服务器之间的消息序列号失去同步是必要的. 在收到完整命令之前, 命令并非 "in progress"; 特别是, 在命令延续协商期间, 命令并非 "in progress".
注意: UID FETCH, UID STORE 和 UID SEARCH 是不同于 FETCH, STORE 和 SEARCH 的命令. 在 UID 命令期间可以发送 EXPUNGE 响应.
来自 EXPUNGE 响应的更新必须由客户端记录.
Example: S: * 44 EXPUNGE
7.4.2. FETCH 响应 (FETCH Response)
Contents: message data
FETCH 响应向客户端返回关于消息的数据. 这些数据是括号中的数据项名称及其值的成对组合. 该响应作为 FETCH 或 STORE 命令的结果出现, 也可以由服务器单方面决定发送 (例如, flag 更新).
当前数据项如下:
BODY : 不带扩展数据的 BODYSTRUCTURE 形式.
BODY[<section>]<<origin octet>> : 一个字符串, 表示指定 section 的正文内容. 客户端应该根据 content transfer encoding, body type 和 subtype 来解释该字符串.
如果指定了 origin octet, 该字符串是整个正文内容的子串, 从该 origin octet 开始. 这意味着 BODY[]<0> 可以被截断, 但 BODY[] 永远不会被截断.
注意: 除非客户端通过 FETCH 一个 BODY[<section>]<<partial>> 数据项明确请求, 否则服务器在 FETCH 响应中不得使用 origin octet 功能.
如果 [CHARSET] 标识符是此 section 的 body parameter parenthesized list 的一部分, 则允许 8-bit 文本数据. 注意, headers (部分说明符 HEADER 或 MIME, 或 MESSAGE/RFC822 部分的头部部分) 必须是 7-bit; headers 中不允许 8-bit 字符. 还要注意, [RFC-2822] 中头部与正文之间的分隔空行不受头部行子集化影响; 除非消息没有正文且没有空行, 否则空行始终作为头部数据的一部分包含.
非文本数据 (如二进制数据) 在发送给客户端之前必须以传输编码方式编码为文本形式, 例如 BASE64. 为得到原始二进制数据, 客户端必须解码传输编码字符串.
BODYSTRUCTURE : 一个括号列表, 描述消息的 [MIME-IMB] 正文结构. 这是服务器通过解析 [MIME-IMB] 头部字段, 并按需为各种字段提供默认值而计算出来的.
例如, 一个包含 48 行和 2279 octets 的简单文本消息可以具有如下正文结构: ("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 2279 48)
多个部分通过括号嵌套表示. 括号列表的第一个元素不是 body type, 而是一个或多个嵌套正文结构的序列. 括号列表的第二个元素是 multipart subtype (mixed, digest, parallel, alternative 等).
RFC 3501 IMAPv4 March 2003
例如, 一个由文本和 BASE64 编码文本附件组成的两部分消息可以具有如下正文结构: (("TEXT" "PLAIN" ("CHARSET" "US-ASCII") NIL NIL "7BIT" 1152 23)("TEXT" "PLAIN" ("CHARSET" "US-ASCII" "NAME" "cc.diff") "[email protected]" "Compiler diff" "BASE64" 4554 73) "MIXED")
扩展数据跟在 multipart subtype 之后. 扩展数据永远不会随 BODY fetch 返回, 但可以随 BODYSTRUCTURE fetch 返回. 如果存在扩展数据, 它必须按定义的顺序出现. multipart body part 的扩展数据按以下顺序排列:
body parameter parenthesized list : 属性/值对的括号列表 [例如, ("foo" "bar" "baz" "rag"), 其中 "bar" 是 "foo" 的值, "rag" 是 "baz" 的值], 如 [MIME-IMB] 中所定义.
body disposition : 一个括号列表, 由 disposition type 字符串以及后跟的 disposition 属性/值对括号列表组成, 如 [DISPOSITION] 中所定义.
body language : 一个字符串或括号列表, 给出 [LANGUAGE-TAGS] 中定义的正文语言值.
body location : 一个字符串列表, 给出 [LOCATION] 中定义的正文内容 URI.
任何后续扩展数据在本协议版本中尚未定义. 此类扩展数据可以由零个或多个 NIL, 字符串, 数字, 或可能嵌套的这些数据的括号列表组成. 执行 BODYSTRUCTURE fetch 的客户端实现必须准备接受此类扩展数据. 在本协议的修订版定义这些扩展数据之前, 服务器实现不得发送此类扩展数据.
非 multipart body part 的基本字段按以下顺序排列:
body type : 一个字符串, 给出 [MIME-IMB] 中定义的内容媒体类型名称.
RFC 3501 IMAPv4 March 2003
body subtype : 一个字符串, 给出 [MIME-IMB] 中定义的内容 subtype 名称.
body parameter parenthesized list : 属性/值对的括号列表 [例如, ("foo" "bar" "baz" "rag"), 其中 "bar" 是 "foo" 的值, "rag" 是 "baz" 的值], 如 [MIME-IMB] 中所定义.
body id : 一个字符串, 给出 [MIME-IMB] 中定义的 content id.
body description : 一个字符串, 给出 [MIME-IMB] 中定义的 content description.
body encoding : 一个字符串, 给出 [MIME-IMB] 中定义的 content transfer encoding.
body size : 一个数字, 给出正文大小, 单位为 octets. 注意, 该大小是其传输编码后的大小, 而不是经过任何解码后得到的大小.
MESSAGE 类型且 subtype 为 RFC822 的 body type, 在基本字段之后立即包含被封装消息的 envelope 结构, body structure, 以及以文本行数表示的大小.