跳到主要内容

6.3 客户端命令 - 已认证状态

在已认证状态下, 允许使用将邮箱作为原子实体进行操作的命令. 在这些命令中, SELECT 和 EXAMINE 会选择一个邮箱进行访问, 并进入已选择状态.

除通用命令 (CAPABILITY, NOOP 和 LOGOUT) 外, 以下命令在已认证状态下有效: ENABLE, SELECT, EXAMINE, NAMESPACE, CREATE, DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, STATUS, APPEND 和 IDLE.

6.3.1 ENABLE 命令

参数: capability 名称

响应: 此命令没有特定响应

结果:

  • OK - 相关 capability 已启用
  • BAD - 没有参数, 或某个参数存在语法错误

若干 IMAP 扩展允许服务器在特定情况下返回这些扩展专用的未请求响应. 但是, 在服务器知道客户端支持这些扩展, 因而能够正确解析和处理扩展响应数据之前, 服务器不能发送这些未请求响应 (例外是包含在带标签或不带标签 OK/NO/BAD 响应中的 response code (见第 7.1 节), 它们始终可以发送).

ENABLE 命令让客户端显式指示其支持特定扩展. 它的设计方式是客户端可以发送一个简单的常量字符串, 列出其支持的扩展, 服务器则启用双方共同支持的子集.

ENABLE 命令接受一个 capability 名称列表, 并请求服务器启用这些命名扩展. 一旦使用 ENABLE 启用, 每个扩展会一直保持活动状态, 直到 IMAP 连接关闭. 对于每个参数, 服务器执行以下操作:

  • 如果该参数不是服务器已知的扩展, 服务器 MUST 忽略该参数.

  • 如果该参数是服务器已知的扩展, 但该扩展未被明确允许使用 ENABLE 启用, 服务器 MUST 忽略该参数. (注意, 知道某个扩展并不一定表示支持该扩展.)

  • 如果该参数是服务器支持且需要启用的扩展, 服务器 MUST 在连接持续期间启用该扩展. 注意, 一旦扩展被启用, 就无法禁用.

如果 ENABLE 命令成功, 服务器 MUST 发送一个不带标签的 ENABLED 响应 (第 7.2.1 节), 其中包含按上述规则启用的所有扩展. 即使没有启用任何扩展, 也会发送 ENABLED 响应.

客户端 SHOULD 只包含需要由服务器启用的扩展. 例如, 当 CAPABILITY 响应同时通告 IMAP4rev1 和 IMAP4rev2 时, 客户端可以启用 IMAP4rev2 专用行为. 未来 RFC 可以向此列表添加内容.

ENABLE 命令仅在已认证状态且尚未选择任何邮箱之前有效. 客户端一旦 SELECT/EXAMINE 某个邮箱, 就 MUST NOT 发出 ENABLE; 但是, 服务器实现不必检查在连接持续期间是否没有邮箱处于已选择状态或曾经被选择.

ENABLE 命令可以在一个 session 中多次发出. 它是累加式的; 也就是说, "ENABLE a b" 后接 "ENABLE c" 等同于单个命令 "ENABLE a b c". 当发出多个 ENABLE 命令时, 每个对应的 ENABLED 响应 SHOULD 只包含由对应 ENABLE 命令启用的扩展, 即对于上述示例, 对 "ENABLE c" 的 ENABLED 响应不应包含 "a" 或 "b".

对 ENABLE 进行流水线处理没有限制. 例如, 可以发送 ENABLE 后立即发送 SELECT, 或在 LOGIN 后立即发送 ENABLE.

服务器 MUST NOT 因执行 ENABLE 而改变 CAPABILITY 列表; 也就是说, ENABLE 命令之后立即发出的 CAPABILITY 命令 MUST 列出与 ENABLE 命令之前发出的 CAPABILITY 命令相同的 capability. 以下示例展示了这一点. 注意, 下面的 "X-GOOD-IDEA" 是一个虚构的可 ENABLE 的扩展 capability.

C: t1 CAPABILITY
S: * CAPABILITY IMAP4rev2 ID LITERAL+ X-GOOD-IDEA
S: t1 OK foo
C: t2 ENABLE CONDSTORE X-GOOD-IDEA
S: * ENABLED X-GOOD-IDEA
S: t2 OK foo
C: t3 CAPABILITY
S: * CAPABILITY IMAP4rev2 ID LITERAL+ X-GOOD-IDEA
S: t3 OK foo again

在以下示例中, 客户端启用 Conditional Store (CONDSTORE) 扩展 [RFC7162]:

C: a1 ENABLE CONDSTORE
S: * ENABLED CONDSTORE
S: a1 OK Conditional Store enabled

6.3.1.1 给可能使用 ENABLE 命令的扩展设计者的说明

除非没有良好的替代设计, 否则不鼓励 IMAP 扩展设计者创建要求使用 ENABLE 的扩展. 具体而言, 会导致已部署服务器响应出现潜在不兼容行为变化 (因而受益于 ENABLE) 的扩展, 比不这样做的扩展具有更高的复杂度成本.