跳到主要内容

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.