Skip to main content

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

一旦客户端和服务器之间建立连接, IMAP4rev1 连接处于四种状态之一. 初始状态在服务器问候 (Server Greeting) 中标识. 大多数命令仅在某些状态下有效. 客户端在连接处于不适当状态时尝试命令是协议错误, 服务器将响应 BAD 或 NO (取决于服务器实现) 命令完成结果.

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

在未认证状态下, 客户端必须 (MUST) 在允许大多数命令之前提供认证凭据 (Authentication Credentials). 当连接启动时进入此状态, 除非连接已被预认证 (Pre-authenticated).

3.2. Authenticated State (已认证状态)

在已认证状态下, 客户端已认证, 并且必须 (MUST) 在允许影响消息的命令之前选择邮箱进行访问. 当预认证连接启动时, 当提供了可接受的认证凭据时, 在选择邮箱出错后, 或在成功的 CLOSE 命令后, 进入此状态.

3.3. Selected State (已选择状态)

在已选择状态下, 已选择邮箱进行访问. 当成功选择邮箱时进入此状态.

3.4. Logout State (登出状态)

在登出状态下, 连接正在终止. 此状态可以作为客户端请求 (通过 LOGOUT 命令) 或客户端或服务器任何一方的单方面操作的结果而进入.

如果客户端请求登出状态, 服务器必须 (MUST) 在服务器关闭连接之前向 LOGOUT 命令发送未标记的 BYE 响应和标记的 OK 响应, 并且客户端必须 (MUST) 在客户端关闭连接之前读取 LOGOUT 命令的标记 OK 响应.

服务器禁止 (MUST NOT) 在不发送包含这样做原因的未标记 BYE 响应的情况下单方面关闭连接. 客户端不应该 (SHOULD NOT) 单方面关闭连接, 而应该 (SHOULD) 发出 LOGOUT 命令. 如果服务器检测到客户端单方面关闭了连接, 服务器可以 (MAY) 省略未标记的 BYE 响应并简单地关闭其连接.


IMAP4rev1 状态转换图

                   +----------------------+
|connection established|
| 建立连接 |
+----------------------+
||
\/
+--------------------------------------+
| server greeting |
| 服务器问候 |
+--------------------------------------+
|| (1) || (2) || (3)
\/ || ||
+-----------------+ || ||
|Not Authenticated| || ||
| 未认证状态 | || ||
+-----------------+ || ||
|| (7) || (4) || ||
|| \/ \/ ||
|| +----------------+ ||
|| | Authenticated |<=++ ||
|| | 已认证状态 | || ||
|| +----------------+ || ||
|| || (7) || (5) || (6) ||
|| || \/ || ||
|| || +--------+ || ||
|| || |Selected|==++ ||
|| || |已选择 | ||
|| || +--------+ ||
|| || || (7) ||
\/ \/ \/ \/
+--------------------------------------+
| Logout |
| 登出状态 |
+--------------------------------------+
||
\/
+-------------------------------+
|both sides close the connection|
| 双方关闭连接 |
+-------------------------------+

状态转换说明:

  1. 连接without pre-authentication (OK greeting): 没有预认证的连接 (OK 问候)
  2. pre-authenticated connection (PREAUTH greeting): 预认证连接 (PREAUTH 问候)
  3. rejected connection (BYE greeting): 被拒绝的连接 (BYE 问候)
  4. successful LOGIN or AUTHENTICATE command: 成功的 LOGIN 或 AUTHENTICATE 命令
  5. successful SELECT or EXAMINE command: 成功的 SELECT 或 EXAMINE 命令
  6. CLOSE command, or failed SELECT or EXAMINE command: CLOSE 命令, 或失败的 SELECT 或 EXAMINE 命令
  7. LOGOUT command, server shutdown, or connection closed: LOGOUT 命令, 服务器关闭, 或连接关闭

状态详细说明

未认证状态 (Not Authenticated State)

进入条件:

  • 新连接建立后的初始状态 (如果没有预认证)
  • 服务器发送 OK 问候

可用命令:

  • CAPABILITY - 查询服务器能力
  • NOOP - 无操作
  • LOGOUT - 登出
  • STARTTLS - 启动 TLS 加密
  • AUTHENTICATE - SASL 认证
  • LOGIN - 简单认证

离开条件:

  • 成功的 LOGIN 或 AUTHENTICATE → 已认证状态
  • LOGOUT 命令 → 登出状态

已认证状态 (Authenticated State)

进入条件:

  • 预认证连接 (PREAUTH 问候)
  • 成功的 LOGIN 或 AUTHENTICATE 命令
  • 选择邮箱失败
  • 成功的 CLOSE 命令

可用命令:

  • 所有未认证状态的命令 (除了 LOGIN, AUTHENTICATE, STARTTLS)
  • SELECT - 选择邮箱 (可读写)
  • EXAMINE - 选择邮箱 (只读)
  • CREATE - 创建邮箱
  • DELETE - 删除邮箱
  • RENAME - 重命名邮箱
  • SUBSCRIBE - 订阅邮箱
  • UNSUBSCRIBE - 取消订阅
  • LIST - 列出邮箱
  • LSUB - 列出订阅的邮箱
  • STATUS - 获取邮箱状态
  • APPEND - 追加消息

离开条件:

  • 成功的 SELECT 或 EXAMINE → 已选择状态
  • LOGOUT 命令 → 登出状态

已选择状态 (Selected State)

进入条件:

  • 成功的 SELECT 或 EXAMINE 命令

可用命令:

  • 所有已认证状态的命令
  • CHECK - 检查点
  • CLOSE - 关闭邮箱
  • EXPUNGE - 删除标记为删除的消息
  • SEARCH - 搜索消息
  • FETCH - 获取消息
  • STORE - 修改消息标志
  • COPY - 复制消息
  • UID - 使用 UID 的命令变体

离开条件:

  • CLOSE 命令 → 已认证状态
  • 成功的 SELECT 或 EXAMINE (另一个邮箱) → 已选择状态 (新邮箱)
  • 失败的 SELECT 或 EXAMINE → 已认证状态
  • LOGOUT 命令 → 登出状态

登出状态 (Logout State)

进入条件:

  • LOGOUT 命令
  • 服务器关闭
  • 连接关闭

协议要求:

  • 服务器发送未标记的 BYE 响应
  • 服务器发送标记的 OK 响应 (如果是 LOGOUT 命令)
  • 双方关闭连接

术语表 (本章重点术语):

  • Not Authenticated State (未认证状态): 连接建立但未认证的状态
  • Authenticated State (已认证状态): 已认证但未选择邮箱的状态
  • Selected State (已选择状态): 已选择邮箱进行操作的状态
  • Logout State (登出状态): 连接终止前的状态
  • Server Greeting (服务器问候): 服务器在连接建立后发送的初始响应
  • Pre-authenticated Connection (预认证连接): 无需认证即可使用的连接