跳到主要内容

6. 客户端命令 (Client Commands)

RFC 3501 IMAPv4 March 2003

例如, 下列非等待命令序列是无效的:

  FETCH + NOOP + STORE
STORE + COPY + FETCH
COPY + COPY
CHECK + FETCH

下列是有效非等待命令序列的示例:

  FETCH + STORE + SEARCH + CHECK
STORE + COPY + EXPUNGE

UID SEARCH + UID SEARCH 作为非等待命令序列可能有效, 也可能无效,
这取决于第二个 UID SEARCH 是否包含消息序列号.

6. 客户端命令 (Client Commands)

本节描述 IMAP4rev1 命令. 命令按照允许使用该命令的状态组织. 可在多个 状态中使用的命令列在最低允许状态中, 例如同时在 authenticated 状态和 selected 状态有效的命令, 列在 authenticated 状态命令中.

下面命令描述中以 "Arguments:" 标识的命令参数按功能描述, 而不是按语法 描述. 命令参数的精确语法在 正式语法 (Formal Syntax) 章节中描述.

某些命令会导致返回特定 server responses (服务器响应); 这些响应在下面 命令描述中以 "Responses:" 标识. 关于这些响应的信息见 Responses 章节 中的响应描述, 这些响应的精确语法见 正式语法 (Formal Syntax) 章节. 任何命令都可能 导致传输服务器数据. 因此, 对于不明确要求服务器数据的命令, 本文写作 "no specific responses for this command", 而不是 "none".

命令描述中的 "Result:" 指命令可能产生的带标签 status responses (带标签状态响应), 以及这些状态响应的任何特殊解释.

连接状态只会由文档明确说明会改变状态的成功命令改变. 被拒绝的命令 (BAD response) 永远不会改变连接状态或 selected mailbox 的状态. 失败的 命令 (NO response) 通常不会改变连接状态或 selected mailbox 的状态; 例外是 SELECT 和 EXAMINE 命令.

RFC 3501 IMAPv4 March 2003

6.1. 客户端命令 - 任意状态 (Client Commands - Any State)

下列命令在任意状态都有效: CAPABILITY, NOOP, and LOGOUT.

6.1.1. CAPABILITY 命令 (CAPABILITY Command)

Arguments: none

Responses: 必需的未加标签响应: CAPABILITY

Result: OK - capability completed BAD - command unknown or arguments invalid

  CAPABILITY 命令请求列出服务器支持的 capabilities (能力). 在 带标签
OK response 之前, 服务器必须发送单个未加标签 CAPABILITY response,
并且所列 capabilities 中必须包含 "IMAP4rev1".

以 "AUTH=" 开头的 capability name 表示服务器支持该特定认证机制.
根据定义, 所有这类名称都是本规范的一部分. 例如, 实验性
"blurdybloop" authenticator 的 authorization capability 应为
"AUTH=XBLURDYBLOOP", 而不是 "XAUTH=BLURDYBLOOP" 或
"XAUTH=XBLURDYBLOOP".

其他 capability names 指本规范的扩展, 修订或修正. 更多信息见
CAPABILITY response 的文档. 除本规范定义的基本 IMAP4rev1 集合之外,
任何 capability 都不会在没有客户端显式动作调用该 capability 的情况
下启用.

客户端和服务器实现必须实现 STARTTLS, LOGINDISABLED, and
AUTH=PLAIN capabilities, 这些 capability 在 [IMAP-TLS] 中描述. 重要
信息见 Security Considerations 章节.

关于站点特定或实现特定 capabilities 的形式, 见题为 "Client Commands -
Experimental/Expansion" 的章节.

RFC 3501 IMAPv4 March 2003

Example: C: abcd CAPABILITY S: * CAPABILITY IMAP4rev1 STARTTLS AUTH=GSSAPI LOGINDISABLED S: abcd OK CAPABILITY completed C: efgh STARTTLS S: efgh OK STARTLS completed <TLS negotiation, further commands are under [TLS] layer> C: ijkl CAPABILITY S: * CAPABILITY IMAP4rev1 AUTH=GSSAPI AUTH=PLAIN S: ijkl OK CAPABILITY completed

6.1.2. NOOP 命令 (NOOP Command)

Arguments: none

Responses: no specific responses for this command (but see below)

Result: OK - noop completed BAD - command unknown or arguments invalid

  NOOP 命令总是成功. 它不做任何事情.

由于任何命令都可以以未加标签 data 形式返回状态更新, NOOP 命令可用作
空闲期间对新消息或消息状态更新的周期性轮询, 这是首选方法. NOOP 命令
也可用于重置服务器上的任何空闲自动注销计时器.

Example: C: a002 NOOP S: a002 OK NOOP completed . . . C: a047 NOOP S: * 22 EXPUNGE S: * 23 EXISTS S: * 3 RECENT S: * 14 FETCH (FLAGS (\Seen \Deleted)) S: a047 OK NOOP completed

RFC 3501 IMAPv4 March 2003

6.1.3. LOGOUT 命令 (LOGOUT Command)

Arguments: none

Responses: 必需的未加标签响应: BYE

Result: OK - logout completed BAD - command unknown or arguments invalid

  LOGOUT 命令通知服务器客户端已完成此连接的使用. 服务器必须在 带标签
OK response 之前发送 BYE 未加标签响应, 然后关闭网络连接.

Example: C: A023 LOGOUT S: * BYE IMAP4rev1 Server logging out S: A023 OK LOGOUT completed (Server and client then close the connection)

6.2. 客户端命令 - 未认证状态 (Client Commands - Not Authenticated State)

在 not authenticated state 中, AUTHENTICATE 或 LOGIN 命令建立认证并进入 authenticated state. AUTHENTICATE 命令为多种认证技术, 隐私保护和完整性 检查提供通用机制; 而 LOGIN 命令使用传统的用户名和明文密码对, 并且没有 建立隐私保护或完整性检查的方法.

STARTTLS 命令是建立会话隐私保护和完整性检查的另一种形式, 但它不建立 认证, 也不进入 authenticated state.

服务器实现可以允许在不建立认证的情况下访问某些 mailboxes. 这可以通过 [ANONYMOUS] 中描述的 ANONYMOUS [SASL] authenticator 完成. 较早的约定是 使用 userid 为 "anonymous" 的 LOGIN 命令; 在这种情况下需要密码, 不过 服务器可以选择接受任何密码. 对 anonymous users 施加的限制取决于实现.

一旦完成认证, 包括以 anonymous 身份认证, 就不可能重新进入 not authenticated state.

RFC 3501 IMAPv4 March 2003

除通用命令 CAPABILITY, NOOP, and LOGOUT 外, 下列命令在 not authenticated state 中有效: STARTTLS, AUTHENTICATE and LOGIN. 关于这些命令的重要信息 见 Security Considerations 章节.

6.2.1. STARTTLS 命令 (STARTTLS Command)

Arguments: none

Responses: no specific response for this command

Result: OK - starttls completed, begin TLS negotiation BAD - command unknown or arguments invalid

  [TLS] negotiation 在服务器带标签 OK 响应结尾的 CRLF 之后立即开始.
一旦客户端发出 STARTTLS 命令, 在看到服务器响应且 [TLS] negotiation 完成
之前, 它不得发出更多命令.

即使在 [TLS] negotiation 期间提供了客户端凭据, 服务器仍保持在
non-authenticated state. 这并不排除 EXTERNAL 等认证机制使用由 [TLS]
negotiation 确定的客户端身份, EXTERNAL 在 [SASL] 中定义.

[TLS] 启动后, 客户端必须丢弃关于服务器 capabilities 的缓存信息, 并
应该重新发出 CAPABILITY 命令. 这是为了防止中间人攻击在 STARTTLS
之前篡改 capabilities list. 服务器可以在 STARTTLS 之后通告不同的
capabilities.

Example: C: a001 CAPABILITY S: * CAPABILITY IMAP4rev1 STARTTLS LOGINDISABLED S: a001 OK CAPABILITY completed C: a002 STARTTLS S: a002 OK Begin TLS negotiation now <TLS negotiation, further commands are under [TLS] layer> C: a003 CAPABILITY S: * CAPABILITY IMAP4rev1 AUTH=PLAIN S: a003 OK CAPABILITY completed C: a004 LOGIN joe password S: a004 OK LOGIN completed

RFC 3501 IMAPv4 March 2003

6.2.2. AUTHENTICATE 命令 (AUTHENTICATE Command)

Arguments: authentication mechanism name

Responses: continuation data can be requested

Result: OK - authenticate completed, now in authenticated state NO - authenticate failure: unsupported authentication mechanism, credentials rejected BAD - command unknown or arguments invalid, authentication exchange cancelled

  AUTHENTICATE 命令向服务器指示一个 [SASL] authentication mechanism.
如果服务器支持所请求的认证机制, 它会执行认证协议交换以认证并识别
客户端. 它可以同时为后续协议交互协商一个可选的security layer.
如果所请求的认证机制不受支持, 服务器应该通过发送带标签 NO
response 来拒绝 AUTHENTICATE 命令.

AUTHENTICATE 命令不支持 [SASL] 的可选 "initial response" 特性.
[SASL] 第 5.1 节规定了如何处理使用 initial response 的认证机制.

本协议的 [SASL] profile 指定的 service name 是 "imap".

认证协议交换由一系列特定于认证机制的服务器挑战和客户端响应组成.
服务器挑战由 command continuation request response 组成, 其中 "+"
token 后跟 BASE64 编码字符串. 客户端响应由包含一个 BASE64 编码字符串
的单行组成. 如果客户端希望取消认证交换, 它发出只包含单个 "*" 的一行.
如果服务器收到这样的响应, 它必须通过发送带标签 BAD response 来拒绝
AUTHENTICATE 命令.

如果通过 [SASL] authentication exchange 协商了 security layer, 它会
对客户端在结束认证交换的 CRLF 之后立即生效, 对服务器在带标签 OK
response 的 CRLF 之后立即生效.

客户端和服务器实现必须实现 AUTHENTICATE 命令本身, 但除 [IMAP-TLS]
中描述的 PLAIN 机制外, 不要求实现任何认证机制. 此外, 认证机制不要求
支持任何 security layers.

RFC 3501 IMAPv4 March 2003

       Note: 服务器实现必须实现一种配置, 在该配置中, 除非已经协商
STARTTLS 命令, 或者已经提供某种其他机制来保护会话免受密码窥探,
否则它不允许任何明文密码机制. 服务器站点不应该使用允许
明文密码机制却没有这种防密码窥探保护机制的任何配置. 客户端和
服务器实现应该实现其他不使用明文密码的 [SASL] 机制, 例如
[SASL] 中描述的 GSSAPI 机制和/或 [DIGEST-MD5] 机制.

服务器和客户端可以支持多个认证机制. 服务器应该在 CAPABILITY 命令的
响应中列出其支持的认证机制, 以便客户端知道使用哪些认证机制.

服务器可以在成功 AUTHENTICATE 命令的带标签 OK 响应中包含
CAPABILITY response code, 以便自动发送 capabilities. 如果客户端识别
这些自动 capabilities, 则不需要发送单独的 CAPABILITY 命令. 只有在
AUTHENTICATE 命令没有协商 security layer 时才应这样做, 因为作为
AUTHENTICATE 命令一部分的带标签 OK 响应不受加密/完整性检查保护.
[SASL] 在这种情况下要求客户端重新发出 CAPABILITY 命令.

如果 AUTHENTICATE 命令以 NO response 失败, 客户端可以通过发出另一个
AUTHENTICATE 命令来尝试另一种认证机制. 它可以也尝试使用 LOGIN 命令
进行认证, 更多细节见 6.2.3 节. 换句话说, 客户端可以按偏好递减顺序
请求认证类型, 并将 LOGIN 命令作为最后手段.

在认证交换期间从客户端传递给服务器的 authorization identity 会由服务
器解释为客户端请求其权限的用户名.

RFC 3501 IMAPv4 March 2003

Example: S: * OK IMAP4rev1 Server C: A001 AUTHENTICATE GSSAPI S: + C: YIIB+wYJKoZIhvcSAQICAQBuggHqMIIB5qADAgEFoQMCAQ6iBw MFACAAAACjggEmYYIBIjCCAR6gAwIBBaESGxB1Lndhc2hpbmd0 b24uZWR1oi0wK6ADAgEDoSQwIhsEaW1hcBsac2hpdmFtcy5jYW Mud2FzaGluZ3Rvbi5lZHWjgdMwgdCgAwIBAaEDAgEDooHDBIHA cS1GSa5b+fXnPZNmXB9SjL8Ollj2SKyb+3S0iXMljen/jNkpJX AleKTz6BQPzj8duz8EtoOuNfKgweViyn/9B9bccy1uuAE2HI0y C/PHXNNU9ZrBziJ8Lm0tTNc98kUpjXnHZhsMcz5Mx2GR6dGknb I0iaGcRerMUsWOuBmKKKRmVMMdR9T3EZdpqsBd7jZCNMWotjhi vd5zovQlFqQ2Wjc2+y46vKP/iXxWIuQJuDiisyXF0Y8+5GTpAL pHDc1/pIGmMIGjoAMCAQGigZsEgZg2on5mSuxoDHEA1w9bcW9n FdFxDKpdrQhVGVRDIzcCMCTzvUboqb5KjY1NJKJsfjRQiBYBdE NKfzK+g5DlV8nrw81uOcP8NOQCLR5XkoMHC0Dr/80ziQzbNqhx O6652Npft0LQwJvenwDI13YxpwOdMXzkWZN/XrEqOWp6GCgXTB vCyLWLlWnbaUkZdEYbKHBPjd8t/1x5Yg== S: + YGgGCSqGSIb3EgECAgIAb1kwV6ADAgEFoQMCAQ+iSzBJoAMC AQGiQgRAtHTEuOP2BXb9sBYFR4SJlDZxmg39IxmRBOhXRKdDA0 uHTCOT9Bq3OsUTXUlk0CsFLoa8j+gvGDlgHuqzWHPSQg== C: S: + YDMGCSqGSIb3EgECAgIBAAD/////6jcyG4GE3KkTzBeBiVHe ceP2CWY0SR0fAQAgAAQEBAQ= C: YDMGCSqGSIb3EgECAgIBAAD/////3LQBHXTpFfZgrejpLlLImP wkhbfa2QteAQAgAG1yYwE= S: A001 OK GSSAPI authentication successful

    Note: 服务器挑战和客户端响应中的换行仅为编辑清晰性而设, 在真实
authenticator 中并不存在.

6.2.3. LOGIN 命令 (LOGIN Command)

Arguments: user name password

Responses: no specific responses for this command

Result: OK - login completed, now in authenticated state NO - login failure: user name or password rejected BAD - command unknown or arguments invalid

  LOGIN 命令向服务器标识客户端, 并携带用于认证该用户的明文密码.

RFC 3501 IMAPv4 March 2003

  服务器可以在成功 LOGIN 命令的带标签 OK 响应中包含 CAPABILITY
response code, 以便自动发送 capabilities. 如果客户端识别这些自动
capabilities, 则不需要发送单独的 CAPABILITY 命令.

Example: C: a001 LOGIN SMITH SESAME S: a001 OK LOGIN completed

    Note: 在不安全网络, 例如 Internet, 上使用 LOGIN 命令存在安全风险,
因为任何监控网络流量的人都可以获得明文密码. 除非作为最后手段,
不应该使用 LOGIN 命令, 并且建议客户端实现提供一种方式来禁用
LOGIN 命令的任何自动使用.

除非已经协商 STARTTLS 命令, 或者已经提供某种其他机制来保护会话
免受密码窥探, 否则服务器实现必须实现一种配置, 在该配置中它通告
LOGINDISABLED capability 并且不允许 LOGIN 命令. 服务器站点不应该
使用允许 LOGIN 命令却没有这种防密码窥探保护机制的任何配置.
如果通告了 LOGINDISABLED capability, 客户端实现不得发送
LOGIN 命令.

6.3. 客户端命令 - 已认证状态 (Client Commands - Authenticated State)

在 authenticated state 中, 允许使用将 mailboxes 作为原子实体进行操作的 命令. 在这些命令中, SELECT 和 EXAMINE 命令会选择一个 mailbox 以供访问, 并进入 selected state.

除通用命令 CAPABILITY, NOOP, and LOGOUT 外, 下列命令在 authenticated state 中有效: SELECT, EXAMINE, CREATE, DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, LSUB, STATUS, and APPEND.

RFC 3501 IMAPv4 March 2003

6.3.1. SELECT 命令 (SELECT Command)

Arguments: mailbox name

Responses: 必需的未加标签响应: FLAGS, EXISTS, RECENT 必需的 OK 未加标签响应: UNSEEN, PERMANENTFLAGS, UIDNEXT, UIDVALIDITY

Result: OK - select completed, now in selected state NO - select failure, now in authenticated state: no such mailbox, can't access mailbox BAD - command unknown or arguments invalid

  SELECT 命令选择一个 mailbox, 以便访问该 mailbox 中的消息. 在向客户端
返回 OK 之前, 服务器必须向客户端发送下列未加标签 data. 注意, 本
协议的早期版本只要求 FLAGS, EXISTS, and RECENT 未加标签 data; 因此,
对于缺失数据, 客户端实现应该按各项目讨论的方式实现默认行为.

FLAGS mailbox 中定义的 flags. 更多细节见 FLAGS response 的描述.

<n> EXISTS mailbox 中的消息数. 更多细节见 EXISTS response 的描述.

<n> RECENT 设置了 \Recent flag 的消息数. 更多细节见 RECENT
response 的描述.

OK [UNSEEN <n>]
mailbox 中第一条 unseen 消息的消息序列号. 如果缺失,
客户端不能对 mailbox 中第一条 unseen 消息作任何假设,
如果想找到它, 需要发出 SEARCH 命令.

OK [PERMANENTFLAGS (<list of flags>)]
客户端可以永久更改的 message flags 列表. 如果缺失,
客户端应假设所有 flags 都可以永久更改.

OK [UIDNEXT <n>]
下一个 unique identifier value. 更多信息见 2.3.1.1 节.
如果缺失, 客户端不能对下一个 unique identifier value 作
任何假设.

RFC 3501 IMAPv4 March 2003

     OK [UIDVALIDITY <n>]
unique identifier validity value. 更多信息见 2.3.1.1 节.
如果缺失, 服务器不支持 unique identifiers.

一个连接中一次只能选择一个 mailbox; 同时访问多个 mailboxes 需要多个
连接. SELECT 命令在尝试新选择之前会自动取消选择任何当前 selected
mailbox. 因此, 如果已经选择了一个 mailbox, 然后尝试的 SELECT 命令失败,
则不会有 mailbox 被选中.

如果允许客户端修改 mailbox, 服务器应该以 "[READ-WRITE]" response
code 作为带标签 OK 响应文本的前缀.

如果不允许客户端修改 mailbox 但允许读访问, 该 mailbox 以只读方式被
选中, 并且服务器必须以 "[READ-ONLY]" response code 作为 SELECT 的
带标签 OK 响应文本的前缀. 通过 SELECT 进行的只读访问不同于
EXAMINE 命令, 因为某些只读 mailboxes 可以允许按用户而非全局地更改永久
状态. 在服务器端 .newsrc 文件中标记的 Netnews 消息就是这种可在只读
mailboxes 中修改的按用户永久状态的示例.

Example: C: A142 SELECT INBOX S: * 172 EXISTS S: * 1 RECENT S: * OK [UNSEEN 12] Message 12 is first unseen S: * OK [UIDVALIDITY 3857529045] UIDs valid S: * OK [UIDNEXT 4392] Predicted next UID S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) S: * OK [PERMANENTFLAGS (\Deleted \Seen *)] Limited S: A142 OK [READ-WRITE] SELECT completed

RFC 3501 IMAPv4 March 2003

6.3.2. EXAMINE 命令 (EXAMINE Command)

Arguments: mailbox name

Responses: 必需的未加标签响应: FLAGS, EXISTS, RECENT 必需的 OK 未加标签响应: UNSEEN, PERMANENTFLAGS, UIDNEXT, UIDVALIDITY

Result: OK - examine completed, now in selected state NO - examine failure, now in authenticated state: no such mailbox, can't access mailbox BAD - command unknown or arguments invalid

  EXAMINE 命令与 SELECT 相同并返回相同输出; 但 selected mailbox 被标识为
只读. 不允许对该 mailbox 的永久状态作任何更改, 包括按用户状态; 特别是,
EXAMINE 不得导致消息失去 \Recent flag.

EXAMINE 命令的带标签 OK 响应文本必须以 "[READ-ONLY]" response
code 开头.

Example: C: A932 EXAMINE blurdybloop S: * 17 EXISTS S: * 2 RECENT S: * OK [UNSEEN 8] Message 8 is first unseen S: * OK [UIDVALIDITY 3857529045] UIDs valid S: * OK [UIDNEXT 4392] Predicted next UID S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft) S: * OK [PERMANENTFLAGS ()] No permanent flags permitted S: A932 OK [READ-ONLY] EXAMINE completed

6.3.3. CREATE 命令 (CREATE Command)

Arguments: mailbox name

Responses: no specific responses for this command

Result: OK - create completed NO - create failure: can't create mailbox with that name BAD - command unknown or arguments invalid

  CREATE 命令创建具有给定名称的 mailbox. 只有在已经创建具有该名称的新
mailbox 时才返回 OK response. 尝试创建 INBOX 或名称指向现有 mailbox
的 mailbox 是错误. 创建中的任何错误都会返回带标签 NO 响应.

RFC 3501 IMAPv4 March 2003

  如果 mailbox name 以服务器的 hierarchy separator character 结尾, 该字符
由服务器通过 LIST 命令返回, 这表示客户端声明打算在层级中在此名称下
创建 mailbox names. 不要求此声明的服务器实现必须忽略该声明. 无论
如何, 创建的名称不包含尾随的 hierarchy delimiter.

如果服务器的 hierarchy separator character 出现在名称中的其他位置,
服务器应该创建任何必要的上级层级名称, 以便 CREATE 命令能成功完成.
换句话说, 在 hierarchy separator character 为 "/" 的服务器上尝试创建
"foo/bar/zap" 时, 如果 foo/ 和 foo/bar/ 尚不存在, 应该创建它们.

如果创建的新 mailbox 与已删除 mailbox 同名, 则其 unique identifiers
必须大于该 mailbox 前一个实例中使用过的任何 unique identifiers, 除非
新实例具有不同的 unique identifier validity value. 更多细节见 UID 命令
的描述.

Example: C: A003 CREATE owatagusiam/ S: A003 OK CREATE completed C: A004 CREATE owatagusiam/blurdybloop S: A004 OK CREATE completed

    Note: 本示例的解释取决于 LIST 是否返回 "/" 作为 hierarchy separator.
如果 "/" 是 hierarchy separator, 则创建名为 "owatagusiam" 的新层级,
其中有一个名为 "blurdybloop" 的成员. 否则, 创建同一层级级别上的两个
mailboxes.

6.3.4. DELETE 命令 (DELETE Command)

Arguments: mailbox name

Responses: no specific responses for this command

Result: OK - delete completed NO - delete failure: can't delete mailbox with that name BAD - command unknown or arguments invalid

RFC 3501 IMAPv4 March 2003

  DELETE 命令永久移除具有给定名称的 mailbox. 只有在 mailbox 已被删除时
才返回带标签 OK 响应. 尝试删除 INBOX 或不存在的 mailbox name 是
错误.

DELETE 命令不得移除下级层级名称. 例如, 如果 mailbox "foo" 有一个
下级 "foo.bar", 假设 "." 是 hierarchy delimiter character, 移除 "foo"
不得移除 "foo.bar". 尝试删除既有下级层级名称又具有 \Noselect
mailbox name attribute 的名称是错误, 更多细节见 LIST response 的描述.

允许删除有下级层级名称且没有 \Noselect mailbox name attribute 的名称.
在这种情况下, 该 mailbox 中的所有消息都会被移除, 并且该名称会获得
\Noselect mailbox name attribute.

已删除 mailbox 的 highest-used unique identifier value 必须被保留,
这样用同一名称创建的新 mailbox 就不会重用前一个实例的 identifiers,
除非新实例具有不同的 unique identifier validity value. 更多细节见 UID
命令的描述.

Examples: C: A682 LIST "" * S: * LIST () "/" blurdybloop S: * LIST (\Noselect) "/" foo S: * LIST () "/" foo/bar S: A682 OK LIST completed C: A683 DELETE blurdybloop S: A683 OK DELETE completed C: A684 DELETE foo S: A684 NO Name "foo" has inferior hierarchical names C: A685 DELETE foo/bar S: A685 OK DELETE Completed C: A686 LIST "" * S: * LIST (\Noselect) "/" foo S: A686 OK LIST completed C: A687 DELETE foo S: A687 OK DELETE Completed

RFC 3501 IMAPv4 March 2003

           C: A82 LIST "" *
S: * LIST () "." blurdybloop
S: * LIST () "." foo
S: * LIST () "." foo.bar
S: A82 OK LIST completed
C: A83 DELETE blurdybloop
S: A83 OK DELETE completed
C: A84 DELETE foo
S: A84 OK DELETE Completed
C: A85 LIST "" *
S: * LIST () "." foo.bar
S: A85 OK LIST completed
C: A86 LIST "" %
S: * LIST (\Noselect) "." foo
S: A86 OK LIST completed

6.3.5. RENAME 命令 (RENAME Command)

Arguments: 现有 mailbox name 新 mailbox name

Responses: 此命令无特定响应

Result: OK - rename completed NO - rename 失败: 无法重命名具有该名称的 mailbox, 无法重命名为具有该名称的 mailbox BAD - 命令未知或参数无效

  RENAME 命令更改 mailbox 的名称. 只有在 mailbox 已被重命名时才返回
带标签 OK 响应. 尝试从不存在的 mailbox name 重命名, 或重命名到
已存在的 mailbox name, 都是错误. 重命名中的任何错误都会返回带标签
NO response.

如果该名称有下级层级名称, 则下级层级名称必须也被重命名. 例如, 将
"foo" 重命名为 "zap" 会把 "foo/bar" 重命名为 "zap/bar", 假设 "/" 是
hierarchy delimiter character.

如果服务器的 hierarchy separator character 出现在名称中, 服务器应该
创建任何必要的上级层级名称, 以便 RENAME 命令能成功完成. 换句话说, 在
hierarchy separator character 为 "/" 的服务器上尝试将 "foo/bar/zap"
重命名为 baz/rag/zowie 时, 如果 baz/ 和 baz/rag/ 尚不存在, 应该创建
它们.

RFC 3501 IMAPv4 March 2003

  旧 mailbox name 的 highest-used unique identifier value 必须被保留,
这样用同一名称创建的新 mailbox 就不会重用前一个实例的 identifiers,
除非新实例具有不同的 unique identifier validity value. 更多细节见 UID
命令的描述.

允许重命名 INBOX, 并且它有特殊行为. 它会将 INBOX 中的所有消息移动到
具有给定名称的新 mailbox, 使 INBOX 保持为空. 如果服务器实现支持 INBOX
的下级层级名称, 这些名称不受 INBOX 重命名影响.

Examples: C: A682 LIST "" * S: * LIST () "/" blurdybloop S: * LIST (\Noselect) "/" foo S: * LIST () "/" foo/bar S: A682 OK LIST completed C: A683 RENAME blurdybloop sarasoop S: A683 OK RENAME completed C: A684 RENAME foo zowie S: A684 OK RENAME Completed C: A685 LIST "" * S: * LIST () "/" sarasoop S: * LIST (\Noselect) "/" zowie S: * LIST () "/" zowie/bar S: A685 OK LIST completed

           C: Z432 LIST "" *
S: * LIST () "." INBOX
S: * LIST () "." INBOX.bar
S: Z432 OK LIST completed
C: Z433 RENAME INBOX old-mail
S: Z433 OK RENAME completed
C: Z434 LIST "" *
S: * LIST () "." INBOX
S: * LIST () "." INBOX.bar
S: * LIST () "." old-mail
S: Z434 OK LIST completed

RFC 3501 IMAPv4 March 2003

6.3.6. SUBSCRIBE 命令 (SUBSCRIBE Command)

Arguments: mailbox

Responses: 此命令无特定响应

Result: OK - subscribe completed NO - subscribe 失败: 无法订阅该名称 BAD - 命令未知或参数无效

  SUBSCRIBE 命令把指定 mailbox name 添加到服务器的 "active" 或
"subscribed" mailboxes 集合中, 该集合由 LSUB 命令返回. 只有订阅成功时,
该命令才返回带标签 OK 响应.

服务器可以验证 SUBSCRIBE 的 mailbox 参数以确认其存在. 但是, 即使具有
该名称的 mailbox 不再存在, 它也不得单方面从订阅列表中移除已有的
mailbox name.

Note: 该要求是因为服务器站点可以选择在内容过期后例行移除具有
已知名称的 mailbox, 例如 "system-alerts", 其意图是在有新内容
适合发布时重新创建它.

Example: C: A002 SUBSCRIBE #news.comp.mail.mime S: A002 OK SUBSCRIBE completed

6.3.7. UNSUBSCRIBE 命令 (UNSUBSCRIBE Command)

Arguments: mailbox name

Responses: 此命令无特定响应

Result: OK - unsubscribe completed NO - unsubscribe 失败: 无法取消订阅该名称 BAD - 命令未知或参数无效

  UNSUBSCRIBE 命令从服务器的 "active" 或 "subscribed" mailboxes 集合中
移除指定 mailbox name, 该集合由 LSUB 命令返回. 只有取消订阅成功时,
该命令才返回带标签 OK 响应.

Example: C: A002 UNSUBSCRIBE #news.comp.mail.mime S: A002 OK UNSUBSCRIBE completed

RFC 3501 IMAPv4 March 2003

6.3.8. LIST 命令 (LIST Command)

Arguments: reference name 可包含通配符的 mailbox name

Responses: 未加标签响应: LIST

Result: OK - list completed NO - list 失败: 无法列出该 reference 或 name BAD - 命令未知或参数无效

  LIST 命令从客户端可用的所有名称完整集合中返回一个名称子集. 返回零个或
多个未加标签 LIST replies, 其中包含 name attributes, hierarchy
delimiter 和 name; 更多细节见 LIST reply 的描述.

LIST 命令应该快速返回其数据, 不应有不当延迟. 例如, 它不应该
过度费力地计算 \Marked 或 \Unmarked 状态或执行其他处理; 如果每个名称
需要 1 秒处理, 那么 1200 个名称的列表将花费 20 分钟!

空 ("" string) reference name 参数表示 mailbox name 按 SELECT 的方式
解释. 返回的 mailbox names 必须匹配所提供的 mailbox name pattern.
非空 reference name 参数是一个 mailbox 或 mailbox hierarchy 的某一级
的名称, 并指示解释 mailbox name 的上下文.

空 ("" string) mailbox name 参数是一个特殊请求, 用于返回 hierarchy
delimiter 以及 reference 中给定名称的 root name. 如果 reference 是
non-rooted 或为空字符串, 作为 root 返回的值可以是空字符串. 在所有
情况下, 都会返回 hierarchy delimiter, 如果没有 hierarchy 则返回 NIL.
这允许客户端即使在当前不存在该名称的 mailboxes 时, 也能获得 hierarchy
delimiter, 或发现 mailbox names 是扁平的.

reference 和 mailbox name 参数会被解释为表示明确从左到右层级的规范
形式. 返回的 mailbox names 将采用解释后的形式.

RFC 3501 IMAPv4 March 2003

       Note: reference 参数的解释由实现定义. 它取决于服务器实现是否
具有 "current working directory" 的概念以及前导 "break out
characters", 后者会覆盖当前工作目录.

例如, 在导出 UNIX 或 NT 文件系统的服务器上, reference 参数包含
当前工作目录, mailbox name 参数则包含在当前工作目录中解释得到的
名称.

如果服务器实现没有 break out characters 的概念, 规范形式通常是
reference name 后接 mailbox name. 注意, 如果服务器实现 namespace
约定 (5.1.2 节), "#" 是 break out character, 必须按此处理.

如果 reference 参数不是 mailbox hierarchy 的一级, 即它是
\NoInferiors name, 和/或 reference 参数不以 hierarchy delimiter
结尾, 则如何解释由实现决定. 例如, reference 为 "foo/bar" 且
mailbox name 为 "rag/baz" 时, 可以解释为 "foo/bar/rag/baz",
"foo/barrag/baz", 或 "foo/rag/baz". 除非用户明确请求, 客户端
不应该使用这样的 reference 参数. 除非 reference 是 mailbox
hierarchy 的一级且以 hierarchy delimiter 结尾, 否则层级浏览器
不得对服务器对 reference 的解释作任何假设.

reference 参数中被包含在解释形式里的任何部分应该作为解释形式的
前缀. 它应该也采用与 reference name 参数相同的形式. 该规则允许
客户端判断返回的 mailbox name 是否处于 reference 参数的上下文中, 或者
mailbox 参数的某些内容是否覆盖了 reference 参数. 没有这条规则, 客户端
就必须了解服务器的命名语义, 包括哪些字符是覆盖命名上下文的
"breakouts".

RFC 3501 IMAPv4 March 2003

       例如, 以下是在基于 UNIX 的服务器上 reference 和 mailbox names
可能被解释的示例:

Reference Mailbox Name Interpretation
------------ ------------ --------------
~smith/Mail/ foo.* ~smith/Mail/foo.*
archive/ % archive/%
#news. comp.mail.* #news.comp.mail.*
~smith/Mail/ /usr/doc/foo /usr/doc/foo
archive/ ~fred/Mail/* ~fred/Mail/*

前三个示例展示了在 reference 参数上下文中的解释. 注意,
"~smith/Mail" 不应该被转换为类似 "/u2/users/smith/Mail" 的
内容, 否则客户端将无法判断该解释是在 reference 的上下文中完成的.

字符 "*" 是通配符, 匹配此位置的零个或多个字符. 字符 "%" 类似于 "*",
但它不匹配 hierarchy delimiter. 如果 "%" 通配符是 mailbox name 参数
的最后一个字符, 则也返回匹配的 hierarchy levels. 如果这些 hierarchy
levels 本身不是可选择的 mailboxes, 它们会带有 \Noselect mailbox name
attribute 返回, 更多细节见 LIST response 的描述.

服务器实现允许通过防止某些字符或名称在某些情况下匹配通配符, 从通配符
字符中 "隐藏" 原本可访问的 mailboxes. 例如, 基于 UNIX 的服务器可能会
限制 "*" 的解释, 使初始 "/" 字符不匹配.

如果此服务器为此用户支持 INBOX, 并且大写字符串 "INBOX" 按上述通配符
规则匹配解释后的 reference 和 mailbox name 参数, 则 LIST 输出中包含
特殊名称 INBOX. 省略 INBOX 的标准是 SELECT INBOX 是否会返回失败; 用户
真实的 INBOX 位于此服务器还是其他服务器并不相关.

RFC 3501 IMAPv4 March 2003

Example: C: A101 LIST "" "" S: * LIST (\Noselect) "/" "" S: A101 OK LIST Completed C: A102 LIST #news.comp.mail.misc "" S: * LIST (\Noselect) "." #news. S: A102 OK LIST Completed C: A103 LIST /usr/staff/jones "" S: * LIST (\Noselect) "/" / S: A103 OK LIST Completed C: A202 LIST ~/Mail/ % S: * LIST (\Noselect) "/" ~/Mail/foo S: * LIST () "/" ~/Mail/meetings S: A202 OK LIST completed

6.3.9. LSUB 命令 (LSUB Command)

Arguments: reference name 可包含通配符的 mailbox name

Responses: 未加标签响应: LSUB

Result: OK - lsub completed NO - lsub 失败: 无法列出该 reference 或 name BAD - 命令未知或参数无效

  LSUB 命令从用户声明为 "active" 或 "subscribed" 的名称集合中返回一个
名称子集. 返回零个或多个未加标签 LSUB replies. LSUB 的参数形式与 LIST
的参数相同.

返回的未加标签 LSUB response 可以包含与 LIST 未加标签响应不同的
mailbox flags. 如果发生这种情况, 未加标签 LIST 中的 flags 被认为更具
权威性.

将 LSUB 与 % 通配符一起使用时会出现一种特殊情况. 考虑 "foo/bar" 已订阅
但 "foo" 未订阅的情况, hierarchy delimiter 为 "/". 对 LSUB 使用 "%"
通配符时, LSUB response 中必须返回 foo, 而不是 foo/bar, 并且必须将其
标记为 \Noselect attribute.

即使具有某名称的 mailbox 不再存在, 服务器也不得单方面从订阅列表
中移除已有的 mailbox name.

RFC 3501 IMAPv4 March 2003

Example: C: A002 LSUB "#news." "comp.mail.*" S: * LSUB () "." #news.comp.mail.mime S: * LSUB () "." #news.comp.mail.misc S: A002 OK LSUB completed C: A003 LSUB "#news." "comp.%" S: * LSUB (\NoSelect) "." #news.comp.mail S: A003 OK LSUB completed

6.3.10. STATUS 命令 (STATUS Command)

Arguments: mailbox name status data item names

Responses: 未加标签响应: STATUS

Result: OK - status completed NO - status 失败: 该名称没有 status BAD - 命令未知或参数无效

  STATUS 命令请求所指示 mailbox 的状态. 它不改变当前 selected mailbox,
也不影响被查询 mailbox 中任何消息的状态; 特别是, STATUS 不得导致
消息失去 \Recent flag.

STATUS 命令提供一种替代方案: 无需打开第二个 IMAP4rev1 连接并对某个
mailbox 执行 EXAMINE 命令, 即可查询该 mailbox 的状态, 同时不取消第一
个 IMAP4rev1 连接中的当前 selected mailbox.

与 LIST 命令不同, STATUS 命令不保证快速响应. 在某些情况下, 它可能相当
慢. 在某些实现中, 服务器必须在内部以只读方式打开 mailbox, 以获取某些
状态信息. 同样不同于 LIST 命令, STATUS 命令不接受通配符.

Note: STATUS 命令旨在访问当前 selected mailbox 之外其他 mailboxes
的状态. 因为 STATUS 命令可能导致 mailbox 在内部被打开, 并且对于
selected mailbox 可通过其他方式获得这些信息, 所以 STATUS 命令
不应该用于当前 selected mailbox.

RFC 3501 IMAPv4 March 2003

       STATUS 命令不得用作 "检查 selected mailbox 中是否有新消息"
的操作, 关于检查新消息的正确方法, 更多信息见第 7, 7.3.1 和
7.3.2 节.

因为 STATUS 命令不保证快速返回结果, 客户端不应该期望能够
连续发出许多 STATUS 命令并获得合理性能.

当前定义的可请求 status data items 如下:

MESSAGES
mailbox 中的消息数.

RECENT
设置了 \Recent flag 的消息数.

UIDNEXT
mailbox 的下一个 unique identifier value. 更多信息见 2.3.1.1 节.

UIDVALIDITY
mailbox 的 unique identifier validity value. 更多信息见 2.3.1.1 节.

UNSEEN
未设置 \Seen flag 的消息数.

Example: C: A042 STATUS blurdybloop (UIDNEXT MESSAGES) S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292) S: A042 OK STATUS completed

RFC 3501 IMAPv4 March 2003

6.3.11. APPEND 命令 (APPEND Command)

Arguments: mailbox name 可选的 flag parenthesized list 可选的 date/time string message literal

Responses: 此命令无特定响应

Result: OK - append completed NO - append 错误: 无法追加到该 mailbox, flags, date/time 或 message text 中存在错误 BAD - 命令未知或参数无效

  APPEND 命令把 literal 参数作为一条新消息追加到指定目标 mailbox 的末尾.
该参数应该采用 [RFC-2822] message 格式. 消息中允许 8-bit 字符.
不能正确保留 8-bit 数据的服务器实现必须能够使用 [MIME-IMB] content
transfer encoding 将 8-bit APPEND 数据可逆地转换为 7-bit.

Note: 可以存在例外, 例如 draft messages, 在这些情况下 APPEND 的
message literal 参数中会省略必需的 [RFC-2822] header lines. 这样
做的完整影响必须被理解并谨慎权衡.

如果指定了 flag parenthesized list, 则应该在生成的消息中设置这些
flags; 否则, 生成消息的 flag list 默认设置为空. 无论哪种情况, Recent
flag 也会被设置.

如果指定了 date-time, 则应该在生成的消息中设置 internal date;
否则, 生成消息的 internal date 默认设置为当前日期和时间.

如果 append 因任何原因不成功, mailbox 必须恢复到 APPEND 尝试之前的
状态; 不允许部分追加.

如果目标 mailbox 不存在, 服务器必须返回错误, 并且不得自动创建
mailbox. 除非确定目标 mailbox 无法创建, 否则服务器必须以
"[TRYCREATE]" response code 作为带标签 NO 响应文本的前缀. 这会
提示客户端可以尝试 CREATE 命令, 如果 CREATE 成功, 再重试 APPEND.

RFC 3501 IMAPv4 March 2003

  如果该 mailbox 当前已被选中, 应该执行正常的新消息动作. 具体而言,
服务器应该立即通过未加标签 EXISTS response 通知客户端. 如果服务器
未这样做, 客户端可以在一个或多个 APPEND 命令之后发出 NOOP 命令, 或在
NOOP 不可用时发出 CHECK 命令.

Example: C: A003 APPEND saved-messages (\Seen) {310} S: + Ready for literal data C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST) C: From: Fred Foobar [email protected] C: Subject: afternoon meeting C: To: [email protected] C: Message-Id: [email protected] C: MIME-Version: 1.0 C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII C: C: Hello Joe, do you think we can meet at 3:30 tomorrow? C: S: A003 OK APPEND completed

    Note: APPEND 命令不用于消息投递, 因为它不提供传输 [SMTP] envelope
information 的机制.

6.4. 客户端命令 - 已选择状态 (Client Commands - Selected State)

在 selected state 中, 允许使用操作 mailbox 中消息的命令.

除通用命令 CAPABILITY, NOOP 和 LOGOUT, 以及 authenticated state 命令 SELECT, EXAMINE, CREATE, DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, LSUB, STATUS 和 APPEND 外, 下列命令在 selected state 中有效: CHECK, CLOSE, EXPUNGE, SEARCH, FETCH, STORE, COPY 和 UID.

6.4.1. CHECK 命令 (CHECK Command)

Arguments: none

Responses: 此命令无特定响应

Result: OK - check completed BAD - 命令未知或参数无效

  CHECK 命令请求对当前 selected mailbox 执行 checkpoint. checkpoint 指与
mailbox 相关, 由实现定义的任何 housekeeping, 例如将服务器内存中的
mailbox 状态与其磁盘状态协调, 这些工作通常不会作为每个命令的一部分
执行. checkpoint 可以需要非瞬时的实际时间才能完成. 如果服务器实现没有
这类 housekeeping 考量, CHECK 等同于 NOOP.

RFC 3501 IMAPv4 March 2003

  不保证 CHECK 会导致产生 EXISTS 未加标签响应. 应使用 NOOP 而不是
CHECK 来轮询新消息.

Example: C: FXXZ CHECK S: FXXZ OK CHECK Completed

6.4.2. CLOSE 命令 (CLOSE Command)

Arguments: none

Responses: 此命令无特定响应

Result: OK - close completed, now in authenticated state BAD - 命令未知或参数无效

  CLOSE 命令从当前 selected mailbox 中永久移除所有设置了 \Deleted flag 的
消息, 并从 selected state 返回 authenticated state. 不发送 未加标签
EXPUNGE responses.

如果 mailbox 是通过 EXAMINE 命令选中的, 或以其他方式只读选中, 则不会
移除任何消息, 也不会给出错误.

即使已经选中 mailbox, 也可以在不先发出 CLOSE 命令的情况下发出 SELECT,
EXAMINE, 或 LOGOUT 命令. SELECT, EXAMINE 和 LOGOUT 命令会隐式关闭
当前 selected mailbox, 而不执行 expunge. 但是, 当删除了许多消息时,
CLOSE-LOGOUT 或 CLOSE-SELECT 序列明显快于 EXPUNGE-LOGOUT 或
EXPUNGE-SELECT, 因为不会发送客户端可能会忽略的未加标签 EXPUNGE
responses.

Example: C: A341 CLOSE S: A341 OK CLOSE completed

RFC 3501 IMAPv4 March 2003

6.4.3. EXPUNGE 命令 (EXPUNGE Command)

Arguments: none

Responses: 未加标签响应: EXPUNGE

Result: OK - expunge completed NO - expunge 失败: 无法 expunge (e.g., permission denied) BAD - 命令未知或参数无效

  EXPUNGE 命令从当前 selected mailbox 中永久移除所有设置了 \Deleted flag
的消息. 在向客户端返回 OK 之前, 会为每条被移除的消息发送一个 未加标签
EXPUNGE response.

Example: C: A202 EXPUNGE S: * 3 EXPUNGE S: * 3 EXPUNGE S: * 5 EXPUNGE S: * 8 EXPUNGE S: A202 OK EXPUNGE completed

    Note: 在本示例中, 消息 3, 4, 7 和 11 设置了 \Deleted flag. 更多
说明见 EXPUNGE response 的描述.

6.4.4. SEARCH 命令 (SEARCH Command)

Arguments: 可选的 [CHARSET] specification searching criteria (一个或多个)

Responses: 必需的未加标签响应: SEARCH

Result: OK - search completed NO - search 错误: 无法搜索该 [CHARSET] 或 criteria BAD - 命令未知或参数无效

  SEARCH 命令在 mailbox 中搜索匹配给定搜索条件的消息. 搜索条件由一个或
多个 search keys 组成. 来自服务器的未加标签 SEARCH response 包含与
搜索条件匹配的消息所对应的 message sequence numbers 列表.

RFC 3501 IMAPv4 March 2003

  指定多个 keys 时, 结果是匹配这些 keys 的所有消息的交集 (AND function).
例如, 条件 DELETED FROM "SMITH" SINCE 1-Feb-1994 指 1994 年 2 月 1 日
以来放入 mailbox 的, 来自 Smith 的所有已删除消息. search key 也可以是
一个由一个或多个 search keys 组成的括号列表, 例如供 OR 和 NOT keys 使用.

服务器实现可以在 SEARCH 匹配中排除 terminal content media types 不是
TEXT 和 MESSAGE 的 [MIME-IMB] body parts.

可选的 [CHARSET] specification 由单词 "CHARSET" 后跟一个已注册
[CHARSET] 组成. 它指示搜索条件中出现的字符串的 [CHARSET]. 在比较
US-ASCII 以外 [CHARSET] 中的文本之前, [MIME-IMB] content transfer
encodings, 以及 [RFC-2822]/[MIME-IMB] headers 中的 [MIME-HDRS] strings,
必须被解码. US-ASCII 必须被支持; 其他 [CHARSET]s 可以被支持.

如果服务器不支持指定的 [CHARSET], 它必须返回带标签 NO 响应,
而不是 BAD. 该响应应该包含 BADCHARSET response code, 后者可以列出
服务器支持的 [CHARSET]s.

在所有使用字符串的 search keys 中, 如果该字符串是字段的子字符串, 则
消息匹配该 key. 匹配不区分大小写.

定义的 search keys 如下. 参数的精确语法定义见 正式语法 (Formal Syntax) 章节.

<sequence set>
message sequence numbers 对应指定 message sequence number set 的消息.

ALL
mailbox 中的所有消息; 用于 ANDing 的默认初始 key.

ANSWERED
设置了 \Answered flag 的消息.

RFC 3501 IMAPv4 March 2003

  BCC <string>
envelope structure 的 BCC 字段中包含指定字符串的消息.

BEFORE <date>
internal date 早于指定日期的消息, 忽略时间和时区.

BODY <string>
消息正文中包含指定字符串的消息.

CC <string>
envelope structure 的 CC 字段中包含指定字符串的消息.

DELETED
设置了 \Deleted flag 的消息.

DRAFT
设置了 \Draft flag 的消息.

FLAGGED
设置了 \Flagged flag 的消息.

FROM <string>
envelope structure 的 FROM 字段中包含指定字符串的消息.

HEADER <field-name> <string>
具有指定 field-name 的 header 且该 header 文本中包含指定字符串的消息,
field-name 如 [RFC-2822] 中定义, header 文本指冒号之后的内容. 如果
要搜索的字符串长度为零, 则匹配所有具有指定 field-name 的 header line
的消息, 不考虑其内容.

KEYWORD <flag>
设置了指定 keyword flag 的消息.

LARGER <n>
[RFC-2822] 大小大于指定 octets 数的消息.

NEW
设置了 \Recent flag 但未设置 \Seen flag 的消息. 这在功能上等同于
"(RECENT UNSEEN)".

RFC 3501 IMAPv4 March 2003

  NOT <search-key>
不匹配指定 search key 的消息.

OLD
未设置 \Recent flag 的消息. 这在功能上等同于 "NOT RECENT", 而不是
"NOT NEW".

ON <date>
internal date 位于指定日期内的消息, 忽略时间和时区.

OR <search-key1> <search-key2>
匹配任一 search key 的消息.

RECENT
设置了 \Recent flag 的消息.

SEEN
设置了 \Seen flag 的消息.

SENTBEFORE <date>
[RFC-2822] Date: header 早于指定日期的消息, 忽略时间和时区.

SENTON <date>
[RFC-2822] Date: header 位于指定日期内的消息, 忽略时间和时区.

SENTSINCE <date>
[RFC-2822] Date: header 位于或晚于指定日期的消息, 忽略时间和时区.

SINCE <date>
internal date 位于或晚于指定日期的消息, 忽略时间和时区.

SMALLER <n>
[RFC-2822] 大小小于指定 octets 数的消息.

RFC 3501 IMAPv4 March 2003

  SUBJECT <string>
envelope structure 的 SUBJECT 字段中包含指定字符串的消息.

TEXT <string>
消息 header 或 body 中包含指定字符串的消息.

TO <string>
envelope structure 的 TO 字段中包含指定字符串的消息.

UID <sequence set>
unique identifiers 对应指定 unique identifier set 的消息. 允许
sequence set ranges.

UNANSWERED
未设置 \Answered flag 的消息.

UNDELETED
未设置 \Deleted flag 的消息.

UNDRAFT
未设置 \Draft flag 的消息.

UNFLAGGED
未设置 \Flagged flag 的消息.

UNKEYWORD <flag>
未设置指定 keyword flag 的消息.

UNSEEN
未设置 \Seen flag 的消息.

RFC 3501 IMAPv4 March 2003

Example: C: A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM "Smith" S: * SEARCH 2 84 882 S: A282 OK SEARCH completed C: A283 SEARCH TEXT "string not in mailbox" S: * SEARCH S: A283 OK SEARCH completed C: A284 SEARCH CHARSET UTF-8 TEXT {6} C: XXXXXX S: * SEARCH 43 S: A284 OK SEARCH completed

    Note: 由于本文档限于 7-bit ASCII 文本, 无法显示实际 UTF-8 数据.
"XXXXXX" 是实际事务中 6 octets 的 8-bit 数据的占位符.

6.4.5. FETCH 命令 (FETCH Command)

Arguments: sequence set message data item names 或 macro

Responses: untagged responses: FETCH

Result: OK - fetch completed NO - fetch 错误: 无法获取该数据 BAD - 命令未知或参数无效

  FETCH 命令检索邮箱中与消息关联的数据. 要获取的数据项可以是单个
atom, 也可以是括号括起的列表.

在正式语法中由 msg-att-static 规则标识的大多数数据项是静态的,
对任何特定消息都不得改变. 在正式语法中由 msg-att-dynamic 规则
标识的其他数据项可以改变, 这种改变可能是 STORE 命令的结果,
也可能由外部事件导致.

例如, 如果客户端在已经知道某条消息信封的情况下又收到该消息的
ENVELOPE, 它可以安全地忽略新传输的信封.

有三个宏指定常用的数据项集合, 可以代替数据项使用. 宏必须单独使用,
不得与其他宏或数据项结合使用.

RFC 3501 IMAPv4 March 2003

  ALL
等价于以下内容的宏: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE)

FAST
等价于以下内容的宏: (FLAGS INTERNALDATE RFC822.SIZE)

FULL
等价于以下内容的宏: (FLAGS INTERNALDATE RFC822.SIZE ENVELOPE
BODY)

当前定义的可获取数据项如下:

BODY
BODYSTRUCTURE 的不可扩展形式.

BODY[<section>]<<partial>>
特定正文节的文本. 节规范是一组由句点分隔的零个或多个部分说明符.
部分说明符可以是部分编号, 或以下之一: HEADER, HEADER.FIELDS,
HEADER.FIELDS.NOT, MIME, 和 TEXT. 空的节规范指整个消息, 包括头部.

每条消息至少有一个 part number. 非 [MIME-IMB] 消息, 以及没有封装
消息的非 multipart [MIME-IMB] 消息, 只有 part 1.

Multipart 消息按照其在消息中出现的顺序分配连续的部分编号. 如果
某个特定部分的类型是 message 或 multipart, 则其各部分必须以一个
句点后跟该嵌套 multipart 部分中的部分编号来表示.

MESSAGE/RFC822 类型的部分也有嵌套的部分编号, 这些编号指向 MESSAGE
部分正文中的各部分.

HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, 和 TEXT 部分说明符可以是
唯一的部分说明符, 也可以由一个或多个数字部分说明符作为前缀,
前提是该数字部分说明符指向 MESSAGE/RFC822 类型的部分. MIME 部分
说明符必须由一个或多个数字部分说明符作为前缀.

HEADER, HEADER.FIELDS, 和 HEADER.FIELDS.NOT 部分说明符指消息的
[RFC-2822] 头部, 或封装的 [MIME-IMT] MESSAGE/RFC822 消息的头部.
HEADER.FIELDS 和 HEADER.FIELDS.NOT 后跟 field-name 名称列表
(field-name 如 [RFC-2822] 中定义), 并返回头部的一个子集.

RFC 3501 IMAPv4 March 2003

     HEADER.FIELDS 返回的子集只包含 field-name