跳到主要内容

3. 状态和流程图 (State and Flow Diagram)

客户端和服务器之间的连接建立后, IMAP4rev1 连接处于四种状态之一. 初始状态在服务器问候中标识. 大多数命令只在特定状态中有效. 客户端在连接处于不适当状态时尝试命令属于协议错误, 服务器将以 BAD 或 NO (取决于服务器实现) 命令完成结果作为响应.

3.1. 未认证状态 (Not Authenticated State)

在未认证状态下, 客户端 MUST 提供认证凭据, 然后才会允许大多数命令. 除非连接已经预认证, 否则连接开始时会进入此状态.

3.2. 已认证状态 (Authenticated State)

在已认证状态下, 客户端已经通过认证, 并且 MUST 选择一个要访问的 mailbox, 然后才会允许影响消息的命令. 在预认证连接开始时, 在提供了可接受的认证凭据后, 在选择 mailbox 出错后, 或在成功执行 CLOSE 命令后, 会进入此状态.

3.3. 已选择状态 (Selected State)

在已选择状态下, 已经选择了一个要访问的 mailbox.当 mailbox 被成功选择后会进入此状态.

RFC 3501 IMAPv4 March 2003

3.4. 注销状态 (Logout State)

在注销状态下, 连接正在终止. 进入此状态可以是客户端请求 (通过 LOGOUT 命令) 的结果, 也可以是客户端或服务器任一方单方面动作的结果.

如果客户端请求注销状态, 则服务器 MUST 在关闭连接前发送 untagged BYE response 和对 LOGOUT 命令的 tagged OK response; 并且客户端 MUST 在关闭连接前读取对 LOGOUT 命令的 tagged OK response.

服务器 MUST NOT 在未发送包含关闭原因的 untagged BYE response 的情况下单方面关闭连接. 客户端 SHOULD NOT 单方面关闭连接, 而 SHOULD 发出 LOGOUT 命令. 如果服务器检测到客户端已单方面关闭连接, 服务器 MAY 省略 untagged BYE response, 并直接关闭其连接.

RFC 3501 IMAPv4 March 2003

               +----------------------+
|connection established|
+----------------------+
||
\/
+--------------------------------------+
| server greeting |
+--------------------------------------+
|| (1) || (2) || (3)
\/ || ||
+-----------------+ || ||
|Not Authenticated| || ||
+-----------------+ || ||
|| (7) || (4) || ||
|| \/ \/ ||
|| +----------------+ ||
|| | Authenticated |\<=++ ||
|| +----------------+ || ||
|| || (7) || (5) || (6) ||
|| || \/ || ||
|| || +--------+ || ||
|| || |Selected|==++ ||
|| || +--------+ ||
|| || || (7) ||
\/ \/ \/ \/
+--------------------------------------+
| Logout |
+--------------------------------------+
||
\/
+-------------------------------+
|both sides close the connection|
+-------------------------------+

(1) 未预认证的连接 (OK greeting)
(2) 预认证连接 (PREAUTH greeting)
(3) 被拒绝的连接 (BYE greeting)
(4) 成功的 LOGIN 或 AUTHENTICATE 命令
(5) 成功的 SELECT 或 EXAMINE 命令
(6) CLOSE 命令, 或失败的 SELECT 或 EXAMINE 命令
(7) LOGOUT 命令, 服务器关闭, 或连接关闭

RFC 3501 IMAPv4 March 2003

  1.  数据格式 (Data Formats)

IMAP4rev1 使用文本命令和响应. IMAP4rev1 中的数据可以采用以下几种形式之一: atom, number, string, parenthesized list, 或 NIL.注意, 某个特定数据项可能采用多种形式; 例如, 定义为使用 "astring" 语法的数据项既可以是 atom, 也可以是 string.