6. Client Commands (客户端命令)
本节描述 IMAP4rev1 命令. 命令按允许该命令的状态组织. 在多个状态下允许的命令列在最小允许状态中 (例如, 在已认证和已选择状态下有效的命令列在已认证状态命令中).
命令参数 (在下面的命令描述中由 "Arguments:" 标识) 按功能而非语法描述. 命令参数的精确语法在正式语法 (Formal Syntax) 章节中描述.
某些命令会导致返回特定的服务器响应, 这些在下面的命令描述中由 "Responses:" 标识. 有关这些响应的信息, 请参阅响应 (Responses) 章节中的响应描述, 以及正式语法章节中这些响应的精确语法. 任何命令都可能导致传输服务器数据. 因此, 不特别需要服务器数据的命令指定 "no specific responses for this command" 而不是 "none".
命令描述中的 "Result:" 指的是命令的可能标记状态响应, 以及这些状态响应的任何特殊解释.
连接的状态仅由记录为改变状态的成功命令改变. 被拒绝的命令 (BAD 响应) 永远不会改变连接或所选邮箱的状态. 失败的命令 (NO 响应) 通常不会改变连接或所选邮箱的状态, 例外情况是 SELECT 和 EXAMINE 命令.
6.1. Client Commands - Any State (任何状态下的客户端命令)
以下命令在任何状态下都有效: CAPABILITY, NOOP 和 LOGOUT.
6.1.1. CAPABILITY Command (CAPABILITY 命令)
Arguments (参数): none (无)
Responses (响应): REQUIRED untagged response: CAPABILITY (必需的未标记响应: CAPABILITY)
Result (结果):
OK- capability completed (能力查询完成)BAD- command unknown or arguments invalid (命令未知或参数无效)
CAPABILITY 命令请求列出服务器支持的能力. 服务器必须 (MUST) 在 (标记的) OK 响应之前发送单个未标记的 CAPABILITY 响应, 其中 "IMAP4rev1" 作为列出的能力之一.
以 "AUTH=" 开头的能力名称表示服务器支持该特定认证机制. 根据定义, 所有此类名称都是本规范的一部分. 例如, 实验性 "blurdybloop" 认证器的授权能力将是 "AUTH=XBLURDYBLOOP" 而不是 "XAUTH=BLURDYBLOOP" 或 "XAUTH=XBLURDYBLOOP".
其他能力名称指的是本规范的扩展, 修订或修正. 有关其他信息, 请参阅 CAPABILITY 响应的文档. 除了本规范中定义的基本 IMAP4rev1 集之外, 没有任何能力在没有客户端明确操作调用该能力的情况下启用.
客户端和服务器实现必须 (MUST) 实现 STARTTLS, LOGINDISABLED 和 AUTH=PLAIN (在 [IMAP-TLS] 中描述) 能力. 有关重要信息, 请参阅安全考虑 (Security Considerations) 章节.
有关站点或实现特定能力的形式信息, 请参阅标题为 "Client Commands - Experimental/Expansion" 的章节.
示例:
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 Command (NOOP 命令)
Arguments (参数): none (无)
Responses (响应): no specific responses for this command (but see below) (此命令没有特定响应, 但见下文)
Result (结果):
OK- noop completed (noop 完成)BAD- command unknown or arguments invalid (命令未知或参数无效)
NOOP 命令始终成功. 它什么也不做.
由于任何命令都可以返回未标记数据形式的状态更新, 因此 NOOP 命令可以在不活动期间用作新消息或消息状态更新的周期性轮询 (这是执行此操作的首选方法). NOOP 命令还可用于重置服务器上的任何不活动自动登出计时器.
示例:
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
6.1.3. LOGOUT Command (LOGOUT 命令)
Arguments (参数): none (无)
Responses (响应): REQUIRED untagged response: BYE (必需的未标记响应: BYE)
Result (结果):
OK- logout completed (登出完成)BAD- command unknown or arguments invalid (命令未知或参数无效)
LOGOUT 命令通知服务器客户端已完成连接. 服务器必须 (MUST) 在 (标记的) OK 响应之前发送 BYE 未标记响应, 然后关闭网络连接.
示例:
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 (未认证状态下的客户端命令)
在未认证状态下, AUTHENTICATE 或 LOGIN 命令建立认证并进入已认证状态. AUTHENTICATE 命令为各种认证技术, 隐私保护和完整性检查提供了通用机制, 而 LOGIN 命令使用传统的用户名和明文密码对, 并且没有建立隐私保护或完整性检查的方法.
STARTTLS 命令是建立会话隐私保护和完整性检查的替代形式, 但不建立认证或进入已认证状态.
服务器实现可以 (MAY) 允许在不建立认证的情况下访问某些邮箱. 这可以通过 [ANONYMOUS] 中描述的 ANONYMOUS [SASL] 认证器来完成. 较旧的约定是使用用户 ID "anonymous" 的 LOGIN 命令, 在这种情况下, 需要密码, 尽管服务器可以选择接受任何密码. 对匿名用户施加的限制取决于实现.
一旦认证 (包括作为匿名用户), 就不可能重新进入未认证状态.
除了通用命令 (CAPABILITY, NOOP 和 LOGOUT) 外, 以下命令在未认证状态下有效: STARTTLS, AUTHENTICATE 和 LOGIN. 有关这些命令的重要信息, 请参阅安全考虑 (Security Considerations) 章节.
6.2.1. STARTTLS Command (STARTTLS 命令)
Arguments (参数): none (无)
Responses (响应): no specific response for this command (此命令没有特定响应)
Result (结果):
OK- starttls completed, begin TLS negotiation (starttls 完成, 开始 TLS 协商)BAD- command unknown or arguments invalid (命令未知或参数无效)
[TLS] 协商在服务器的标记 OK 响应末尾的 CRLF 之后立即开始. 一旦客户端发出 STARTTLS 命令, 它禁止 (MUST NOT) 发出进一步的命令, 直到看到服务器响应并且 [TLS] 协商完成.
即使在 [TLS] 协商期间提供了客户端凭据, 服务器仍保持在未认证状态. 这不排除诸如 EXTERNAL (在 [SASL] 中定义) 之类的认证机制使用由 [TLS] 协商确定的客户端身份.
一旦 [TLS] 已启动, 客户端必须 (MUST) 丢弃有关服务器能力的缓存信息, 并且应该 (SHOULD) 重新发出 CAPABILITY 命令. 这对于防止在 STARTTLS 之前更改能力列表的中间人攻击是必要的. 服务器可以 (MAY) 在 STARTTLS 之后公布不同的能力.
示例:
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
6.2.2. AUTHENTICATE Command (AUTHENTICATE 命令)
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] 认证机制. 如果服务器支持请求的认证机制, 它执行认证协议交换以认证和标识客户端. 它还可以 (MAY) 协商用于后续协议交互的可选 (OPTIONAL) 安全层. 如果不支持请求的认证机制, 服务器应该 (SHOULD) 通过发送标记的 NO 响应来拒绝 AUTHENTICATE 命令.
AUTHENTICATE 命令不支持 [SASL] 的可选 "initial response" 功能. [SASL] 的第 5.1 节指定了如何处理使用初始响应的认证机制.
本协议的 [SASL] 配置文件指定的服务名称是 "imap".
认证协议交换由一系列特定于认证机制的服务器质询和客户端响应组成. 服务器质询由带有 "+" 标记的命令继续请求响应组成, 后跟 BASE64 编码的字符串. 客户端响应由单行组成, 包含 BASE64 编码的字符串. 如果客户端希望取消认证交换, 它发出由单个 "*" 组成的行. 如果服务器收到这样的响应, 它必须 (MUST) 通过发送标记的 BAD 响应来拒绝 AUTHENTICATE 命令.
如果通过 [SASL] 认证交换协商了安全层, 它在客户端认证交换结束的 CRLF 之后, 以及服务器标记 OK 响应的 CRLF 之后立即生效.
虽然客户端和服务器实现必须 (MUST) 实现 AUTHENTICATE 命令本身, 但不需要实现除 [IMAP-TLS] 中描述的 PLAIN 机制之外的任何认证机制. 此外, 认证机制不需要支持任何安全层.
注意: 服务器实现必须 (MUST) 实现一个配置, 在该配置中它不允许 (NOT permit) 任何明文密码机制, 除非已协商 STARTTLS 命令或提供了某些其他保护会话免受密码窥探的机制. 服务器站点不应该 (SHOULD NOT) 使用允许明文密码机制而没有这种针对密码窥探的保护机制的任何配置. 客户端和服务器实现应该 (SHOULD) 实现不使用明文密码的其他 [SASL] 机制, 例如 [SASL] 中描述的 GSSAPI 机制和/或 [DIGEST-MD5] 机制.
服务器和客户端可以支持多个认证机制. 服务器应该 (SHOULD) 在 CAPABILITY 命令的响应中列出其支持的认证机制, 以便客户端知道要使用哪些认证机制.
服务器可以 (MAY) 在成功 AUTHENTICATE 命令的标记 OK 响应中包含 CAPABILITY 响应代码, 以便自动发送能力. 如果客户端识别这些自动能力, 则不需要发送单独的 CAPABILITY 命令. 只有在 AUTHENTICATE 命令未协商安全层时才应该这样做, 因为作为 AUTHENTICATE 命令的一部分的标记 OK 响应不受加密/完整性检查保护. [SASL] 要求客户端在这种情况下重新发出 CAPABILITY 命令.
如果 AUTHENTICATE 命令失败并返回 NO 响应, 客户端可以 (MAY) 通过发出另一个 AUTHENTICATE 命令来尝试另一个认证机制. 它也可以 (MAY) 尝试使用 LOGIN 命令进行认证 (有关更多详细信息, 请参阅第 6.2.3 节). 换句话说, 客户端可以 (MAY) 按降序偏好请求认证类型, 以 LOGIN 命令作为最后的手段.
在认证交换期间从客户端传递到服务器的授权身份由服务器解释为客户端请求其特权的用户名.
示例:
S: * OK IMAP4rev1 Server
C: A001 AUTHENTICATE GSSAPI
S: +
C: YIIB+wYJKoZIhvcSAQICAQBuggHqMIIB5qADAgEFoQMCAQ6iBw
MFACAAAACjggEmYYIBIjCCAR6gAwIBBaESGxB1Lndhc2hpbmd0
b24uZWR1oi0wK6ADAgEDoSQwIhsEaW1hcBsac2hpdmFtcy5jYW
Mud2FzaGluZ3Rvbi5lZHWjgdMwgdCgAwIBAaEDAgEDooHDBIHA
cS1GSa5b+fXnPZNmXB9SjL8Ollj2SKyb+3S0iXMljen/jNkpJX
AleKTz6BQPzj8duz8EtoOuNfKgweViyn/9B9bccy1uuAE2HI0y
C/PHXNNU9rBziJ8Lm0tTNc98kUpjXnHZhsMcz5Mx2GR6dGknb
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
注意: 服务器质询和客户端响应中的换行符是为了编辑清晰, 在真实的认证器中不存在.
6.2.3. LOGIN Command (LOGIN 命令)
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 命令向服务器标识客户端, 并携带认证此用户的明文密码.
服务器可以 (MAY) 在成功 LOGIN 命令的标记 OK 响应中包含 CAPABILITY 响应代码, 以便自动发送能力. 如果客户端识别这些自动能力, 则不需要发送单独的 CAPABILITY 命令.
示例:
C: a001 LOGIN SMITH SESAME
S: a001 OK LOGIN completed
注意: 在不安全的网络 (例如互联网) 上使用 LOGIN 命令是安全风险, 因为任何监控网络流量的人都可以获得明文密码. 不应该 (SHOULD NOT) 使用 LOGIN 命令, 除非作为最后的手段, 建议客户端实现有一种方式来禁用任何不安全的 LOGIN 命令使用.
6.3. Client Commands - Authenticated State (已认证状态下的客户端命令)
在已认证状态下, 允许将邮箱作为原子实体进行操作的命令. 在这些命令中, SELECT 和 EXAMINE 命令将选择邮箱进行访问并进入已选择状态.
除了通用命令 (CAPABILITY, NOOP 和 LOGOUT) 外, 以下命令在已认证状态下有效: SELECT, EXAMINE, CREATE, DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, LSUB, STATUS 和 APPEND.
6.3.1. SELECT Command (SELECT 命令)
Arguments (参数): mailbox name (邮箱名称)
Responses (响应):
- REQUIRED untagged responses: FLAGS, EXISTS, RECENT (必需的未标记响应: FLAGS, EXISTS, RECENT)
- REQUIRED OK untagged responses: UNSEEN, PERMANENTFLAGS, UIDNEXT, UIDVALIDITY (必需的 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 命令选择一个邮箱, 以便可以访问邮箱中的消息. 在向客户端返回 OK 之前, 服务器必须 (MUST) 向客户端发送以下未标记数据. 请注意, 本协议的早期版本仅需要 FLAGS, EXISTS 和 RECENT 未标记数据, 因此, 客户端实现应该 (SHOULD) 为缺失的数据实现默认行为, 如与各个项目讨论的那样.
必需的未标记响应:
-
FLAGS: 邮箱中定义的标志. 有关更多详细信息, 请参阅 FLAGS 响应的描述.
-
<n>EXISTS: 邮箱中的消息数量. 有关更多详细信息, 请参阅 EXISTS 响应的描述. -
<n>RECENT: 设置了\Recent标志的消息数量. 有关更多详细信息, 请参阅 RECENT 响应的描述. -
OK [UNSEEN
<n>]: 邮箱中第一个未读消息的消息序列号. 如果缺少此项, 客户端无法对邮箱中的第一个未读消息做出任何假设, 并且如果想要找到它, 需要发出 SEARCH 命令. -
OK [PERMANENTFLAGS (
<list of flags>)]: 客户端可以永久更改的消息标志列表. 如果缺少此项, 客户端应该 (should) 假设所有标志都可以永久更改. -
OK [UIDNEXT
<n>]: 下一个唯一标识符值. 有关更多信息, 请参阅第 2.3.1.1 节. 如果缺少此项, 客户端无法对下一个唯一标识符值做出任何假设. -
OK [UIDVALIDITY
<n>]: 唯一标识符有效性值. 有关更多信息, 请参阅第 2.3.1.1 节. 如果缺少此项, 服务器不支持唯一标识符.
连接中一次只能选择一个邮箱, 同时访问多个邮箱需要多个连接. SELECT 命令在尝试新选择之前自动取消选择当前选择的任何邮箱. 因此, 如果选择了邮箱并尝试失败的 SELECT 命令, 则不会选择任何邮箱.
如果允许客户端修改邮箱, 服务器应该 (SHOULD) 在标记的 OK 响应的文本前加上 [READ-WRITE] 响应代码.
如果不允许客户端修改邮箱但允许读取访问, 则邮箱将被选择为只读, 并且服务器必须 (MUST) 在 SELECT 的标记 OK 响应的文本前加上 [READ-ONLY] 响应代码. 通过 SELECT 的只读访问与 EXAMINE 命令的不同之处在于, 某些只读邮箱可以 (MAY) 允许在每个用户 (而不是全局) 基础上更改永久状态. 在基于服务器的 .newsrc 文件中标记的 Netnews 消息是可以使用只读邮箱修改的此类每用户永久状态的示例.
示例:
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
6.3.2. EXAMINE Command (EXAMINE 命令)
Arguments (参数): mailbox name (邮箱名称)
Responses (响应):
- REQUIRED untagged responses: FLAGS, EXISTS, RECENT (必需的未标记响应: FLAGS, EXISTS, RECENT)
- REQUIRED OK untagged responses: UNSEEN, PERMANENTFLAGS, UIDNEXT, UIDVALIDITY (必需的 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 相同并返回相同的输出, 但是, 所选邮箱被标识为只读. 不允许对邮箱的永久状态 (包括每用户状态) 进行任何更改, 特别是, EXAMINE 禁止 (MUST NOT) 导致消息失去 \Recent 标志.
EXAMINE 命令的标记 OK 响应的文本必须 (MUST) 以 [READ-ONLY] 响应代码开头.
示例:
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 Command (CREATE 命令)
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 命令使用给定名称创建邮箱. 仅当已使用该名称创建新邮箱时才返回 OK 响应. 尝试创建 INBOX 或引用现有邮箱的名称是错误的. 创建中的任何错误都将返回标记的 NO 响应.
如果邮箱名称以服务器的层次分隔符字符 (由 LIST 命令从服务器返回) 作为后缀, 则这是客户端打算在层次结构中的此名称下创建邮箱名称的声明. 不需要此声明的服务器实现必须 (MUST) 忽略该声明. 在任何情况下, 创建的名称都不带尾随层次分隔符.
如果服务器的层次分隔符字符出现在名称的其他位置, 服务器应该 (SHOULD) 创建成功完成 CREATE 命令所需的任何上级层次名称. 换句话说, 在层次分隔符字符为 / 的服务器上尝试创建 foo/bar/zap 应该 (SHOULD) 创建 foo/ 和 foo/bar/, 如果它们尚不存在.
如果使用与已删除邮箱相同的名称创建新邮箱, 其唯一标识符必须 (MUST) 大于邮箱先前版本中使用的任何唯一标识符, 除非 (UNLESS) 新版本具有不同的唯一标识符有效性值. 有关更多详细信息, 请参阅 UID 命令的描述.
示例:
C: A003 CREATE owatagusiam/
S: A003 OK CREATE completed
C: A004 CREATE owatagusiam/blurdybloop
S: A004 OK CREATE completed
注意: 此示例的解释取决于是否从 LIST 返回 / 作为层次分隔符. 如果 / 是层次分隔符, 则创建名为 "owatagusiam" 的新层次级别, 其中包含名为 "blurdybloop" 的成员. 否则, 在同一层次级别创建两个邮箱.
6.3.4. DELETE Command (DELETE 命令)
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 (命令未知或参数无效)
DELETE 命令永久删除具有给定名称的邮箱. 仅当邮箱已被删除时才返回标记的 OK 响应. 尝试删除 INBOX 或不存在的邮箱名称是错误的.
DELETE 命令禁止 (MUST NOT) 删除下级层次名称. 例如, 如果邮箱 "foo" 具有下级 "foo.bar" (假设 . 是层次分隔符字符), 删除 "foo" 禁止 (MUST NOT) 删除 "foo.bar". 尝试删除具有下级层次名称并且还具有 \Noselect 邮箱名称属性的名称是错误的 (有关更多详细信息, 请参阅 LIST 响应的描述).
允许删除具有下级层次名称并且没有 \Noselect 邮箱名称属性的名称. 在这种情况下, 该邮箱中的所有消息都将被删除, 并且该名称将获得 \Noselect 邮箱名称属性.
必须 (MUST) 保留已删除邮箱的最高使用唯一标识符的值, 以便使用相同名称创建的新邮箱不会重用先前版本的标识符, 除非 (UNLESS) 新版本具有不同的唯一标识符有效性值. 有关更多详细信息, 请参阅 UID 命令的描述.
示例:
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
另一个示例:
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 Command (RENAME 命令)
Arguments (参数):
- existing mailbox name (现有邮箱名称)
- new mailbox name (新邮箱名称)
Responses (响应): no specific responses for this command (此命令没有特定响应)
Result (结果):
OK- rename completed (重命名完成)NO- rename failure: can't rename mailbox with that name, can't rename to mailbox with that name (重命名失败: 无法重命名该名称的邮箱, 无法重命名为该名称的邮箱)BAD- command unknown or arguments invalid (命令未知或参数无效)
RENAME 命令更改邮箱的名称. 仅当邮箱已被重命名时才返回标记的 OK 响应. 尝试从不存在的邮箱名称重命名或重命名为已存在的邮箱名称是错误的. 重命名中的任何错误都将返回标记的 NO 响应.
如果名称具有下级层次名称, 则下级层次名称也必须 (MUST) 被重命名. 例如, 将 "foo" 重命名为 "zap" 将把 "foo/bar" (假设 / 是层次分隔符字符) 重命名为 "zap/bar".
如果服务器的层次分隔符字符出现在名称中, 服务器应该 (SHOULD) 创建成功完成 RENAME 命令所需的任何上级层次名称. 换句话说, 在层次分隔符字符为 / 的服务器上尝试将 "foo/bar/zap" 重命名为 "baz/rag/zowie" 应该 (SHOULD) 创建 baz/ 和 baz/rag/, 如果它们尚不存在.
必须 (MUST) 保留旧邮箱名称的最高使用唯一标识符的值, 以便使用相同名称创建的新邮箱不会重用先前版本的标识符, 除非 (UNLESS) 新版本具有不同的唯一标识符有效性值. 有关更多详细信息, 请参阅 UID 命令的描述.
允许重命名 INBOX, 并且具有特殊行为. 它将 INBOX 中的所有消息移动到具有给定名称的新邮箱, 使 INBOX 为空. 如果服务器实现支持 INBOX 的下级层次名称, 则这些名称不受 INBOX 重命名的影响.
示例:
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
INBOX 重命名示例:
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
6.3.6. SUBSCRIBE Command (SUBSCRIBE 命令)
Arguments (参数): mailbox (邮箱)
Responses (响应): no specific responses for this command (此命令没有特定响应)
Result (结果):
OK- subscribe completed (订阅完成)NO- subscribe failure: can't subscribe to that name (订阅失败: 无法订阅该名称)BAD- command unknown or arguments invalid (命令未知或参数无效)
SUBSCRIBE 命令将指定的邮箱名称添加到服务器的 "活动 (active)" 或 "已订阅 (subscribed)" 邮箱集中, 由 LSUB 命令返回. 此命令仅在订阅成功时返回标记的 OK 响应.
服务器可以 (MAY) 验证 SUBSCRIBE 的邮箱参数以验证它是否存在. 但是, 即使该名称的邮箱不再存在, 它也禁止 (MUST NOT) 单方面从订阅列表中删除现有邮箱名称.
注意: 此要求是因为服务器站点可以选择在其内容过期后例行删除具有众所周知名称 (例如, "system-alerts") 的邮箱, 意图是在新内容合适时重新创建它.
示例:
C: A002 SUBSCRIBE #news.comp.mail.mime
S: A002 OK SUBSCRIBE completed
6.3.7. UNSUBSCRIBE Command (UNSUBSCRIBE 命令)
Arguments (参数): mailbox name (邮箱名称)
Responses (响应): no specific responses for this command (此命令没有特定响应)
Result (结果):
OK- unsubscribe completed (取消订阅完成)NO- unsubscribe failure: can't unsubscribe that name (取消订阅失败: 无法取消订阅该名称)BAD- command unknown or arguments invalid (命令未知或参数无效)
UNSUBSCRIBE 命令从服务器的 "活动 (active)" 或 "已订阅 (subscribed)" 邮箱集中删除指定的邮箱名称, 由 LSUB 命令返回. 此命令仅在取消订阅成功时返回标记的 OK 响应.
示例:
C: A002 UNSUBSCRIBE #news.comp.mail.mime
S: A002 OK UNSUBSCRIBE completed
6.3.8. LIST Command (LIST 命令)
Arguments (参数):
- reference name (参考名称)
- mailbox name with possible wildcards (可能带通配符的邮箱名称)
Responses (响应): untagged responses: LIST (未标记响应: LIST)
Result (结果):
OK- list completed (列表完成)NO- list failure: can't list that reference or name (列表失败: 无法列出该参考或名称)BAD- command unknown or arguments invalid (命令未知或参数无效)
LIST 命令从客户端可用的所有名称的完整集合中返回名称子集. 返回零个或多个未标记的 LIST 回复, 包含名称属性, 层次分隔符和名称, 有关更多详细信息, 请参阅 LIST 回复的描述.
LIST 命令应该 (SHOULD) 快速返回其数据, 不应有不当延迟. 例如, 它不应该 (SHOULD NOT) 过度麻烦地计算 \Marked 或 \Unmarked 状态或执行其他处理, 如果每个名称需要 1 秒的处理, 那么 1200 个名称的列表将需要 20 分钟!
空 ("" 字符串) 参考名称参数表示邮箱名称按 SELECT 解释. 返回的邮箱名称必须 (MUST) 与提供的邮箱名称模式匹配. 非空参考名称参数是邮箱或邮箱层次结构级别的名称, 并指示解释邮箱名称的上下文.
空 ("" 字符串) 邮箱名称参数是一个特殊请求, 用于返回层次分隔符和参考中给出的名称的根名称. 如果参考是非根的或为空字符串, 则作为根返回的值可以 (MAY) 是空字符串. 在所有情况下, 都会返回层次分隔符 (如果没有层次结构, 则为 NIL). 即使当前不存在该名称的邮箱, 这也允许客户端获取层次分隔符 (或发现邮箱名称是扁平的).
参考和邮箱名称参数被解释为表示明确的从左到右层次结构的规范形式. 返回的邮箱名称将采用解释形式.
注意: 参考参数的解释是由实现定义的. 这取决于服务器实现是否具有 "当前工作目录" 和前导 "跳出字符" 的概念, 后者会覆盖当前工作目录.
例如, 在导出 UNIX 或 NT 文件系统的服务器上, 参考参数包含当前工作目录, 邮箱名称参数将包含在当前工作目录中解释的名称.
如果服务器实现没有跳出字符的概念, 规范形式通常是参考名称附加邮箱名称. 请注意, 如果服务器实现命名空间约定 (第 5.1.2 节), # 是跳出字符并且必须这样处理.
如果参考参数不是邮箱层次结构的级别 (即, 它是 \NoInferiors 名称), 和/或参考参数不以层次分隔符结尾, 则如何解释这一点取决于实现. 例如, 参考 "foo/bar" 和邮箱名称 "rag/baz" 可以解释为 "foo/bar/rag/baz", "foo/barrag/baz" 或 "foo/rag/baz". 客户端不应该 (SHOULD NOT) 使用此类参考参数, 除非用户明确请求. 层次浏览器禁止 (MUST NOT) 对服务器解释参考做出任何假设, 除非参考是邮箱层次结构的级别并且以层次分隔符结尾.
解释形式中包含的参考参数的任何部分都应该 (SHOULD) 作为解释形式的前缀. 它也应该 (SHOULD) 采用与参考名称参数相同的形式. 此规则允许客户端确定返回的邮箱名称是否在参考参数的上下文中, 或者邮箱参数的某些内容是否覆盖了参考参数. 如果没有此规则, 客户端将必须了解服务器的命名语义, 包括哪些字符是覆盖命名上下文的 "跳出".
LIST 示例 (参考和邮箱名称在UNIX服务器上的解释):
| 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/* |
前三个示例演示了参考参数上下文中的解释. 请注意, "~smith/Mail" 不应该 (SHOULD NOT) 转换为类似 "/u2/users/smith/Mail" 的内容, 否则客户端将无法确定解释是在参考的上下文中.
通配符:
- 字符
*是通配符, 匹配此位置的零个或多个字符 - 字符
%类似于*, 但它不匹配层次分隔符 - 如果
%通配符是邮箱名称参数的最后一个字符, 还会返回匹配的层次结构级别 - 如果这些层次结构级别不是可选择的邮箱, 则使用
\Noselect邮箱名称属性返回它们
允许服务器实现通过在某些情况下阻止某些字符或名称匹配通配符, 从通配符字符 "隐藏" 其他可访问的邮箱. 例如, 基于 UNIX 的服务器可能限制 * 的解释, 使得初始 / 字符不匹配.
如果此服务器支持此用户的 INBOX, 并且大写字符串 "INBOX" 与如上所述的带有通配符的解释参考和邮箱名称参数匹配, 则特殊名称 INBOX 包含在 LIST 的输出中. 省略 INBOX 的标准是 SELECT INBOX 是否会返回失败, 用户的真实 INBOX 是驻留在此服务器还是其他服务器上并不相关.
LIST 示例:
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 Command (LSUB 命令)
Arguments (参数):
- reference name (参考名称)
- mailbox name with possible wildcards (可能带通配符的邮箱名称)
Responses (响应): untagged responses: LSUB (未标记响应: LSUB)
Result (结果):
OK- lsub completed (lsub 完成)NO- lsub failure: can't list that reference or name (lsub 失败: 无法列出该参考或名称)BAD- command unknown or arguments invalid (命令未知或参数无效)
LSUB 命令从用户已声明为 "活动 (active)" 或 "已订阅 (subscribed)" 的名称集中返回名称子集. 返回零个或多个未标记的 LSUB 回复. LSUB 的参数与 LIST 的参数形式相同.
返回的未标记 LSUB 响应可以 (MAY) 包含与 LIST 未标记响应不同的邮箱标志. 如果发生这种情况, 未标记 LIST 中的标志被认为更具权威性.
使用 LSUB 与 % 通配符时会出现特殊情况. 考虑如果订阅了 "foo/bar" (层次分隔符为 /) 但未订阅 "foo" 会发生什么. LSUB 的 % 通配符必须 (MUST) 在 LSUB 响应中返回 foo 而不是 foo/bar, 并且必须 (MUST) 使用 \Noselect 属性标记.
即使该名称的邮箱不再存在, 服务器也禁止 (MUST NOT) 单方面从订阅列表中删除现有邮箱名称.
示例:
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 Command (STATUS 命令)
Arguments (参数):
- mailbox name (邮箱名称)
- status data item names (状态数据项名称)
Responses (响应): untagged responses: STATUS (未标记响应: STATUS)
Result (结果):
OK- status completed (状态完成)NO- status failure: no status for that name (状态失败: 该名称没有状态)BAD- command unknown or arguments invalid (命令未知或参数无效)
STATUS 命令请求指定邮箱的状态. 它不会更改当前选择的邮箱, 也不会影响查询邮箱中任何消息的状态 (特别是, STATUS 禁止 (MUST NOT) 导致消息失去 \Recent 标志).
STATUS 命令提供了打开第二个 IMAP4rev1 连接并对邮箱执行 EXAMINE 命令以查询该邮箱的状态的替代方法, 而无需取消选择第一个 IMAP4rev1 连接中的当前邮箱.
与 LIST 命令不同, STATUS 命令不保证响应速度快. 在某些情况下, 它可能非常慢. 在某些实现中, 服务器必须在内部以只读方式打开邮箱以获取某些状态信息. 此外, 与 LIST 命令不同, STATUS 命令不接受通配符.
注意: STATUS 命令旨在访问当前选择的邮箱以外的邮箱的状态. 因为 STATUS 命令可能导致邮箱在内部打开, 并且因为此信息可通过所选邮箱上的其他方式获得, 所以不应该 (SHOULD NOT) 在当前选择的邮箱上使用 STATUS 命令.
STATUS 命令禁止 (MUST NOT) 用作 "检查所选邮箱中的新消息" 操作 (有关新消息检查的正确方法的更多信息, 请参阅第 7, 7.3.1 和 7.3.2 节).
因为 STATUS 命令不保证其结果速度快, 所以客户端不应该 (SHOULD NOT) 期望能够发出许多连续的 STATUS 命令并获得合理的性能.
当前定义的可请求状态数据项:
- MESSAGES: 邮箱中的消息数量
- RECENT: 设置了
\Recent标志的消息数量 - UIDNEXT: 邮箱的下一个唯一标识符值. 有关更多信息, 请参阅第 2.3.1.1 节
- UIDVALIDITY: 邮箱的唯一标识符有效性值. 有关更多信息, 请参阅第 2.3.1.1 节
- UNSEEN: 未设置
\Seen标志的消息数量
示例:
C: A042 STATUS blurdybloop (UIDNEXT MESSAGES)
S: * STATUS blurdybloop (MESSAGES 231 UIDNEXT 44292)
S: A042 OK STATUS completed
6.3.11. APPEND Command (APPEND 命令)
Arguments (参数):
- mailbox name (邮箱名称)
- OPTIONAL flag parenthesized list (可选的标志括号列表)
- OPTIONAL date/time string (可选的日期/时间字符串)
- message literal (消息字面量)
Responses (响应): no specific responses for this command (此命令没有特定响应)
Result (结果):
OK- append completed (追加完成)NO- append error: can't append to that mailbox, error in flags or date/time or message text (追加错误: 无法追加到该邮箱, 标志或日期/时间或消息文本错误)BAD- command unknown or arguments invalid (命令未知或参数无效)
APPEND 命令将字面量参数作为新消息追加到指定目标邮箱的末尾. 此参数应该 (SHOULD) 采用 [RFC-2822] 消息的格式. 消息中允许使用 8 位字符. 无法正确保留 8 位数据的服务器实现必须 (MUST) 能够使用 [MIME-IMB] 内容传输编码可逆地将 8 位 APPEND 数据转换为 7 位.
注意: 可能存在例外, 例如, 草稿消息, 其中在 APPEND 的消息字面量参数中省略了必需的 [RFC-2822] 头部行. 必须理解并仔细权衡这样做的全部含义.
如果指定了标志括号列表, 则应该 (SHOULD) 在结果消息中设置标志, 否则, 结果消息的标志列表默认设置为空. 在任何一种情况下, 还会设置 Recent 标志.
如果指定了日期时间, 则应该 (SHOULD) 在结果消息中设置内部日期, 否则, 结果消息的内部日期默认设置为当前日期和时间.
如果由于任何原因追加不成功, 邮箱必须 (MUST) 恢复到 APPEND 尝试之前的状态, 不允许部分追加.
如果目标邮箱不存在, 服务器必须 (MUST) 返回错误, 并且禁止 (MUST NOT) 自动创建邮箱. 除非确定无法创建目标邮箱, 否则服务器必须 (MUST) 发送响应代码 [TRYCREATE] 作为标记 NO 响应文本的前缀. 这向客户端提示, 如果 CREATE 成功, 它可以尝试 CREATE 命令并重试 APPEND.
如果当前选择了邮箱, 则应该 (SHOULD) 发生正常的新消息操作. 具体来说, 服务器应该 (SHOULD) 立即通过未标记的 EXISTS 响应通知客户端. 如果服务器不这样做, 客户端可以 (MAY) 在一个或多个 APPEND 命令后发出 NOOP 命令 (或者, 如果失败, 发出 CHECK 命令).
示例:
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
注意: APPEND 命令不用于消息传递, 因为它不提供传输 [SMTP] 信封信息的机制.
6.4. Client Commands - Selected State (已选择状态下的客户端命令)
在已选择状态下, 允许操作邮箱中消息的命令.
除了通用命令 (CAPABILITY, NOOP 和 LOGOUT) 和已认证状态命令 (SELECT, EXAMINE, CREATE, DELETE, RENAME, SUBSCRIBE, UNSUBSCRIBE, LIST, LSUB, STATUS 和 APPEND) 外, 以下命令在已选择状态下有效: CHECK, CLOSE, EXPUNGE, SEARCH, FETCH, STORE, COPY 和 UID.
6.4.1. CHECK Command (CHECK 命令)
Arguments (参数): none (无)
Responses (响应): no specific responses for this command (此命令没有特定响应)
Result (结果):
OK- check completed (检查完成)BAD- command unknown or arguments invalid (命令未知或参数无效)
CHECK 命令请求对当前选择的邮箱进行检查点 (Checkpoint). 检查点指的是与邮箱关联的任何依赖于实现的管理工作 (例如, 将服务器的邮箱内存状态与其磁盘上的状态解析), 这些工作通常不作为每个命令的一部分执行. 检查点可以 (MAY) 需要非瞬时的实时时间才能完成. 如果服务器实现没有此类管理工作, 则 CHECK 等同于 NOOP.
不能保证 CHECK 会导致 EXISTS 未标记响应发生. 应该 (SHOULD) 使用 NOOP 而不是 CHECK 进行新消息轮询.
示例:
C: FXXZ CHECK
S: FXXZ OK CHECK Completed
6.4.2. CLOSE Command (CLOSE 命令)
Arguments (参数): none (无)
Responses (响应): no specific responses for this command (此命令没有特定响应)
Result (结果):
OK- close completed, now in authenticated state (关闭完成, 现在处于已认证状态)BAD- command unknown or arguments invalid (命令未知或参数无效)
CLOSE 命令从当前选择的邮箱中永久删除所有设置了 \Deleted 标志的消息, 并从已选择状态返回到已认证状态. 不发送未标记的 EXPUNGE 响应.
如果邮箱是通过 EXAMINE 命令选择的, 或以只读方式选择的, 则不会删除任何消息, 也不会产生任何错误.
即使邮箱已被选择, 也可以 (MAY) 在不先发出 CLOSE 命令的情况下发出 SELECT, EXAMINE 或 LOGOUT 命令. SELECT, EXAMINE 和 LOGOUT 命令隐式关闭当前选择的邮箱而不执行清除操作. 但是, 当有许多消息被删除时, CLOSE-LOGOUT 或 CLOSE-SELECT 序列比 EXPUNGE-LOGOUT 或 EXPUNGE-SELECT 要快得多, 因为不会发送未标记的 EXPUNGE 响应 (客户端可能会忽略这些响应).
示例:
C: A341 CLOSE
S: A341 OK CLOSE completed
6.4.3. EXPUNGE Command (EXPUNGE 命令)
Arguments (参数): none (无)
Responses (响应): untagged responses: EXPUNGE (未标记响应: EXPUNGE)
Result (结果):
OK- expunge completed (清除完成)NO- expunge failure: can't expunge (例如, 权限被拒绝) (清除失败: 无法清除 (例如, 权限被拒绝))BAD- command unknown or arguments invalid (命令未知或参数无效)
EXPUNGE 命令从当前选择的邮箱中永久删除所有设置了 \Deleted 标志的消息. 在向客户端返回 OK 之前, 对每个被删除的消息发送一个未标记的 EXPUNGE 响应.
示例:
C: A202 EXPUNGE
S: * 3 EXPUNGE
S: * 3 EXPUNGE
S: * 5 EXPUNGE
S: * 8 EXPUNGE
S: A202 OK EXPUNGE completed
注意: 在此示例中, 消息 3, 4, 7 和 11 设置了 \Deleted 标志. 有关进一步说明, 请参阅 EXPUNGE 响应的描述.
6.4.4. SEARCH Command (SEARCH 命令)
Arguments (参数): OPTIONAL [CHARSET] specification, searching criteria (one or more) (可选的 [CHARSET] 规范, 搜索条件 (一个或多个))
Responses (响应): REQUIRED untagged response: SEARCH (必需的未标记响应: SEARCH)
Result (结果):
OK- search completed (搜索完成)NO- search error: can't search that [CHARSET] or criteria (搜索错误: 无法搜索该 [CHARSET] 或条件)BAD- command unknown or arguments invalid (命令未知或参数无效)
SEARCH 命令在邮箱中搜索与给定搜索条件匹配的消息. 搜索条件由一个或多个搜索键组成. 来自服务器的未标记 SEARCH 响应包含与搜索条件匹配的那些消息的消息序列号列表.
当指定多个键时, 结果是匹配所有这些键的所有消息的交集 (AND 函数). 例如, 条件 DELETED FROM "SMITH" SINCE 1-Feb-1994 指的是所有来自 Smith 且自 1994 年 2 月 1 日以来放入邮箱的已删除消息. 搜索键也可以是一个或多个搜索键的括号列表 (例如, 与 OR 和 NOT 键一起使用).
服务器实现可以 (MAY) 从 SEARCH 匹配考虑中排除终端内容媒体类型不是 TEXT 和 MESSAGE 的 [MIME-IMB] 正文部分.
可选的 [CHARSET] 规范由单词 "CHARSET" 后跟一个注册的 [CHARSET] 组成. 它指示出现在搜索条件中的字符串的 [CHARSET]. 必须 (MUST) 在与 US-ASCII 以外的 [CHARSET] 进行比较之前解码 [MIME-IMB] 内容传输编码和 [RFC-2822]/[MIME-IMB] 标头中的 [MIME-HDRS] 字符串. 必须 (MUST) 支持 US-ASCII; 可以 (MAY) 支持其他 [CHARSET].
如果服务器不支持指定的 [CHARSET], 则必须 (MUST) 返回标记的 NO 响应 (而不是 BAD). 此响应应该 (SHOULD) 包含 BADCHARSET 响应代码, 该代码可以 (MAY) 列出服务器支持的 [CHARSET].
在所有使用字符串的搜索键中, 如果字符串是字段的子字符串, 则消息匹配该键. 匹配不区分大小写.
定义的搜索键如下. 有关参数的精确语法定义, 请参阅正式语法 (Formal Syntax) 章节.
<sequence set>
- 消息序列号对应于指定消息序列号集的消息.
ALL
- 邮箱中的所有消息; 用于 AND 操作的默认初始键.
ANSWERED
- 设置了
\Answered标志的消息.
BCC <string>
- 在信封结构的 BCC 字段中包含指定字符串的消息.
BEFORE <date>
- 内部日期 (忽略时间和时区) 早于指定日期的消息.
BODY <string>
- 在消息正文中包含指定字符串的消息.
CC <string>
- 在信封结构的 CC 字段中包含指定字符串的消息.
DELETED
- 设置了
\Deleted标志的消息.
DRAFT
- 设置了
\Draft标志的消息.
FLAGGED
- 设置了
\Flagged标志的消息.
FROM <string>
- 在信封结构的 FROM 字段中包含指定字符串的消息.
HEADER <field-name> <string>
- 具有指定字段名 (如 [RFC-2822] 中定义) 的标头, 并且在标头文本 (冒号后的内容) 中包含指定字符串的消息. 如果要搜索的字符串长度为零, 则匹配所有具有指定字段名的标头行的消息, 而不管其内容如何.
KEYWORD <flag>
- 设置了指定关键字标志的消息.
LARGER <n>
- [RFC-2822] 大小大于指定八位字节数的消息.
NEW
- 设置了
\Recent标志但未设置\Seen标志的消息. 这在功能上等同于 "(RECENT UNSEEN)".
NOT <search-key>
- 不匹配指定搜索键的消息.
OLD
- 未设置
\Recent标志的消息. 这在功能上等同于 "NOT RECENT" (而不是 "NOT NEW").
ON <date>
- 内部日期 (忽略时间和时区) 在指定日期内的消息.
OR <search-key1> <search-key2>
- 匹配任一搜索键的消息.
RECENT
- 设置了
\Recent标志的消息.
SEEN
- 设置了
\Seen标志的消息.
SENTBEFORE <date>
- [RFC-2822] Date: 标头 (忽略时间和时区) 早于指定日期的消息.
SENTON <date>
- [RFC-2822] Date: 标头 (忽略时间和时区) 在指定日期内的消息.
SENTSINCE <date>
- [RFC-2822] Date: 标头 (忽略时间和时区) 在指定日期内或之后的消息.
SINCE <date>
- 内部日期 (忽略时间和时区) 在指定日期内或之后的消息.
SMALLER <n>
- [RFC-2822] 大小小于指定八位字节数的消息.
SUBJECT <string>
- 在信封结构的 SUBJECT 字段中包含指定字符串的消息.
TEXT <string>
- 在标头或正文中包含指定字符串的消息.
TO <string>
- 在信封结构的 TO 字段中包含指定字符串的消息.
UID <sequence set>
- 唯一标识符对应于指定唯一标识符集的消息. 允许序列集范围.
UNANSWERED
- 未设置
\Answered标志的消息.
UNDELETED
- 未设置
\Deleted标志的消息.
UNDRAFT
- 未设置
\Draft标志的消息.
UNFLAGGED
- 未设置
\Flagged标志的消息.
UNKEYWORD <flag>
- 未设置指定关键字标志的消息.
UNSEEN
- 未设置
\Seen标志的消息.
示例:
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
注意: 由于本文档限于 7 位 ASCII 文本, 因此无法显示实际的 UTF-8 数据. "XXXXXX" 是实际事务中 6 个八位字节的 8 位数据的占位符.
6.4.5. FETCH Command (FETCH 命令)
Arguments (参数): sequence set, message data item names or macro (序列集, 消息数据项名称或宏)
Responses (响应): untagged responses: FETCH (未标记响应: FETCH)
Result (结果):
OK- fetch completed (获取完成)NO- fetch error: can't fetch that data (获取错误: 无法获取该数据)BAD- command unknown or arguments invalid (命令未知或参数无效)
FETCH 命令检索与邮箱中的消息关联的数据. 要获取的数据项可以是单个原子或括号列表.
大多数数据项 (在正式语法中的 msg-att-static 规则下标识) 是静态的, 对于任何特定消息必须不 (MUST NOT) 改变. 其他数据项 (在正式语法中的 msg-att-dynamic 规则下标识) 可以 (MAY) 改变, 无论是作为 STORE 命令的结果还是由于外部事件.
例如, 如果客户端在已经知道信封时收到消息的 ENVELOPE, 它可以安全地忽略新传输的信封.
有三个宏指定常用的数据项集, 可以用来代替数据项. 宏必须单独使用, 不能与其他宏或数据项结合使用.
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. 空部分规范指的是整个消息, 包括标头.
每条消息至少有一个部分号. 非 [MIME-IMB] 消息和没有封装消息的非多部分 [MIME-IMB] 消息只有部分 1.
多部分消息按照它们在消息中出现的顺序分配连续的部分号. 如果特定部分的类型是 message 或 multipart, 则其部分必须由句点后跟该嵌套多部分部分内的部分号来指示.
类型为 MESSAGE/RFC822 的部分也有嵌套部分号, 指的是 MESSAGE 部分正文的部分.
HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT 和 TEXT 部分说明符可以是唯一的部分说明符, 也可以以一个或多个数字部分说明符作为前缀, 前提是数字部分说明符指的是类型为 MESSAGE/RFC822 的部分. MIME 部分说明符必须以一个或多个数字部分说明符作为前缀.
HEADER, HEADER.FIELDS 和 HEADER.FIELDS.NOT 部分说明符指的是消息或封装的 [MIME-IMT] MESSAGE/RFC822 消息的 [RFC-2822] 标头. HEADER.FIELDS 和 HEADER.FIELDS.NOT 后跟字段名 (如 [RFC-2822] 中定义) 名称列表, 并返回标头的子集. HEADER.FIELDS 返回的子集仅包含那些字段名与列表中某个名称匹配的标头字段; 类似地, HEADER.FIELDS.NOT 返回的子集仅包含具有非匹配字段名的标头字段. 字段匹配不区分大小写, 但在其他方面是精确的. 子集化不排除标头和正文之间的 [RFC-2822] 分隔空行; 空行包含在所有标头获取中, 除非消息没有正文且没有空行的情况.
MIME 部分说明符指的是此部分的 [MIME-IMB] 标头.
TEXT 部分说明符指的是消息的文本正文, 省略 [RFC-2822] 标头.
以下是一个复杂消息及其一些部分说明符的示例:
HEADER ([RFC-2822] 消息标头)
TEXT ([RFC-2822] 消息文本正文) MULTIPART/MIXED
1 TEXT/PLAIN
2 APPLICATION/OCTET-STREAM
3 MESSAGE/RFC822
3.HEADER ([RFC-2822] 消息标头)
3.TEXT ([RFC-2822] 消息文本正文) MULTIPART/MIXED
3.1 TEXT/PLAIN
3.2 APPLICATION/OCTET-STREAM
4 MULTIPART/MIXED
4.1 IMAGE/GIF
4.1.MIME ([MIME-IMB] IMAGE/GIF 的标头)
4.2 MESSAGE/RFC822
4.2.HEADER ([RFC-2822] 消息标头)
4.2.TEXT ([RFC-2822] 消息文本正文) MULTIPART/MIXED
4.2.1 TEXT/PLAIN
4.2.2 MULTIPART/ALTERNATIVE
4.2.2.1 TEXT/PLAIN
4.2.2.2 TEXT/RICHTEXT
可以获取指定文本的子字符串. 这是通过在部分说明符后附加一个左尖括号 (<), 第一个所需八位字节的八位字节位置, 一个句点, 所需的最大八位字节数, 以及一个右尖括号 (>) 来完成的. 如果起始八位字节超出文本的末尾, 则返回空字符串.
任何试图读取超出文本末尾的部分获取都会被适当截断. 从八位字节 0 开始的部分获取作为部分获取返回, 即使发生了此截断.
注意: 这意味着
BODY[]<0.2048>对于 1500 八位字节的消息将返回BODY[]<0>和大小为 1500 的字面量, 而不是BODY[].注意: HEADER.FIELDS 或 HEADER.FIELDS.NOT 部分说明符的子字符串获取是在子集化标头后计算的.
隐式设置 \Seen 标志; 如果这导致标志发生更改, 则应该 (SHOULD) 将它们作为 FETCH 响应的一部分包含在内.
BODY.PEEK[<section>]<<partial>>
- BODY[
<section>] 的替代形式, 不会隐式设置\Seen标志.
BODYSTRUCTURE
- 消息的 [MIME-IMB] 正文结构. 这是由服务器通过解析 [RFC-2822] 标头和 [MIME-IMB] 标头中的 [MIME-IMB] 标头字段来计算的.
ENVELOPE
- 消息的信封结构. 这是由服务器通过将 [RFC-2822] 标头解析为组成部分, 并根据需要对各种字段进行默认设置来计算的.
FLAGS
- 为此消息设置的标志.
INTERNALDATE
- 消息的内部日期.
RFC822
- 在功能上等效于 BODY[], 不同之处在于生成的未标记 FETCH 数据的语法 (返回 RFC822).
RFC822.HEADER
- 在功能上等效于 BODY.PEEK[HEADER], 不同之处在于生成的未标记 FETCH 数据的语法 (返回 RFC822.HEADER).
RFC822.SIZE
- 消息的 [RFC-2822] 大小.
RFC822.TEXT
- 在功能上等效于 BODY[TEXT], 不同之处在于生成的未标记 FETCH 数据的语法 (返回 RFC822.TEXT).
UID
- 消息的唯一标识符.
示例:
C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)])
S: * 2 FETCH ....
S: * 3 FETCH ....
S: * 4 FETCH ....
S: A654 OK FETCH completed
6.4.6. STORE Command (STORE 命令)
Arguments (参数): sequence set, message data item name, value for message data item (序列集, 消息数据项名称, 消息数据项的值)
Responses (响应): untagged responses: FETCH (未标记响应: FETCH)
Result (结果):
OK- store completed (存储完成)NO- store error: can't store that data (存储错误: 无法存储该数据)BAD- command unknown or arguments invalid (命令未知或参数无效)
STORE 命令更改与邮箱中的消息关联的数据. 通常, STORE 将通过未标记的 FETCH 响应返回数据的更新值. 数据项名称中的 ".SILENT" 后缀可防止未标记的 FETCH, 并且服务器应该 (SHOULD) 假设客户端已自行确定更新的值或不关心更新的值.
注意: 无论是否使用了 ".SILENT" 后缀, 如果观察到来自外部源的消息标志更改, 服务器都应该 (SHOULD) 发送未标记的 FETCH 响应. 其目的是在没有竞争条件的情况下确定标志的状态.
当前定义的可以存储的数据项如下:
FLAGS <flag list>
- 用参数替换消息的标志 (
\Recent除外). 返回标志的新值, 就像执行了这些标志的 FETCH 一样.
FLAGS.SILENT <flag list>
- 等效于 FLAGS, 但不返回新值.
+FLAGS <flag list>
- 将参数添加到消息的标志中. 返回标志的新值, 就像执行了这些标志的 FETCH 一样.
+FLAGS.SILENT <flag list>
- 等效于 +FLAGS, 但不返回新值.
-FLAGS <flag list>
- 从消息的标志中删除参数. 返回标志的新值, 就像执行了这些标志的 FETCH 一样.
-FLAGS.SILENT <flag list>
- 等效于 -FLAGS, 但不返回新值.
示例:
C: A003 STORE 2:4 +FLAGS (\Deleted)
S: * 2 FETCH (FLAGS (\Deleted \Seen))
S: * 3 FETCH (FLAGS (\Deleted))
S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen))
S: A003 OK STORE completed
6.4.7. COPY Command (COPY 命令)
Arguments (参数): sequence set, mailbox name (序列集, 邮箱名称)
Responses (响应): no specific responses for this command (此命令没有特定响应)
Result (结果):
OK- copy completed (复制完成)NO- copy error: can't copy those messages or to that name (复制错误: 无法复制这些消息或到该名称)BAD- command unknown or arguments invalid (命令未知或参数无效)
COPY 命令将指定的消息复制到指定目标邮箱的末尾. 应该 (SHOULD) 保留消息的标志和内部日期, 并且应该 (SHOULD) 在副本中设置 Recent 标志.
如果目标邮箱不存在, 服务器应该 (SHOULD) 返回错误. 它不应该 (SHOULD NOT) 自动创建邮箱. 除非确定无法创建目标邮箱, 否则服务器必须 (MUST) 发送响应代码 "[TRYCREATE]" 作为标记的 NO 响应文本的前缀. 这为客户端提供了一个提示, 即如果 CREATE 成功, 它可以尝试 CREATE 命令并重试 COPY.
如果 COPY 命令因任何原因不成功, 服务器实现必须 (MUST) 将目标邮箱恢复到 COPY 尝试之前的状态.
示例:
C: A003 COPY 2:4 MEETING
S: A003 OK COPY completed
6.4.8. UID Command (UID 命令)
Arguments (参数): command name, command arguments (命令名称, 命令参数)
Responses (响应): untagged responses: FETCH, SEARCH (未标记响应: FETCH, SEARCH)
Result (结果):
OK- UID command completed (UID 命令完成)NO- UID command error (UID 命令错误)BAD- command unknown or arguments invalid (命令未知或参数无效)
UID 命令有两种形式. 在第一种形式中, 它采用带有适合关联命令的参数的 COPY, FETCH 或 STORE 命令作为其参数. 但是, 序列集参数中的数字是唯一标识符而不是消息序列号. 允许序列集范围, 但不能保证唯一标识符是连续的.
不存在的唯一标识符将被忽略, 不会生成任何错误消息. 因此, UID FETCH 命令可能会在不返回任何数据的情况下返回 OK, 或者 UID COPY 或 UID STORE 可能会在不执行任何操作的情况下返回 OK.
在第二种形式中, UID 命令采用带有 SEARCH 命令参数的 SEARCH 命令. 参数的解释与 SEARCH 相同; 但是, UID SEARCH 命令的 SEARCH 响应中返回的数字是唯一标识符而不是消息序列号. 例如, 命令 UID SEARCH 1:100 UID 443:557 返回对应于两个序列集的交集的唯一标识符, 即消息序列号范围 1:100 和 UID 范围 443:557.
注意: 在上面的示例中, 出现了 UID 范围 443:557. 关于不存在的唯一标识符在没有任何错误消息的情况下被忽略的相同注释也适用于此. 因此, 即使 UID 443 或 557 都不存在, 此范围也是有效的, 并且将包括现有的 UID 495.
另请注意, UID 范围 559:* 始终包括邮箱中最后一条消息的 UID, 即使 559 高于任何分配的 UID 值. 这是因为范围的内容独立于范围端点的顺序. 因此, 以 * 作为端点之一的任何 UID 范围至少指示一条消息 (具有最高编号 UID 的消息), 除非邮箱为空.
未标记 FETCH 响应中 "*" 后的数字始终是消息序列号, 而不是唯一标识符, 即使对于 UID 命令响应也是如此. 但是, 无论 UID 是否被指定为 FETCH 的消息数据项, 服务器实现都必须 (MUST) 隐式包含 UID 消息数据项作为由 UID 命令引起的任何 FETCH 响应的一部分.
注意: 关于包含 UID 消息数据项作为 FETCH 响应一部分的规则主要适用于 UID FETCH 和 UID STORE 命令, 包括不包含 UID 作为消息数据项的 UID FETCH 命令. 尽管其他 UID 命令不太可能导致未标记的 FETCH, 但此规则也适用于这些命令.
示例:
C: A999 UID FETCH 4827313:4828442 FLAGS
S: * 23 FETCH (FLAGS (\Seen) UID 4827313)
S: * 24 FETCH (FLAGS (\Seen) UID 4827943)
S: * 25 FETCH (FLAGS (\Seen) UID 4828442)
S: A999 OK UID FETCH completed
6.5. Client Commands - Experimental/Expansion (客户端命令 - 实验性/扩展)
6.5.1. X<atom> Command (X<atom> 命令)
Arguments (参数): implementation defined (由实现定义)
Responses (响应): implementation defined (由实现定义)
Result (结果):
OK- command completed (命令完成)NO- failure (失败)BAD- command unknown or arguments invalid (命令未知或参数无效)
任何以 X 为前缀的命令都是实验性命令. 不属于本规范, 本规范的标准或标准跟踪修订版, 或 IESG 批准的实验性协议的命令必须 (MUST) 使用 X 前缀.
实验性命令发出的任何添加的未标记响应也必须 (MUST) 以 X 为前缀. 服务器实现不得 (MUST NOT) 发送任何此类未标记响应, 除非客户端通过发出关联的实验性命令来请求它.
示例:
C: a441 CAPABILITY
S: * CAPABILITY IMAP4rev1 XPIG-LATIN
S: a441 OK CAPABILITY completed
C: A442 XPIG-LATIN
S: * XPIG-LATIN ow-nay eaking-spay ig-pay atin-lay
S: A442 OK XPIG-LATIN ompleted-cay