注意:服务器邀请和客户端响应中的换行是为了编辑上的清楚,而不是实际认证符。
6.2.3. LOGIN 命令
参数:用户名 密码
响应:此命令无特定响应
结果:OK-login完成,当前是认证状态 NO-login失败:用户名或者密码被拒绝 BAD-未知命令,或者无效参数
LOGIN命令向服务器确认客户端,并带有确认该用户的简单文本型密码。 在一个成功的LOGIN命令的标签化OK响应里,服务器可以包含进一个
CAPABILITY响应码,以便(实现)自动发送功能。如果一个客户认出了这些自动的功能,则它无需发送一个CAPABILITY命令。 例子:
C: a001 LOGIN SMITH SESAME S: a001 OK LOGIN completed
注意:在一个不安全网络(比如因特网)上使用LOGIN命令有安全风险,因为任何网络传输的监控者都可以获取简单文本型密码。LOGIN命令不应当使用,除非作为最后一种方法,同时,建议客户端实现体采取措施使LOGIN命令的任何自动使用无效。
除非STARTTLS命令已经构建,或者已经提供了保护会话免受密码窥探的机制,否则,一个服务器实现体必须实现一个机制,在这个机制里宣告 LOGINDISABLED功能并且不允许LOGIN命令。服务器站点不应当使用没有这样一个免受密码窥探(功能)的保护机制、而允许LOGIN命令的配 置。如果LOGINDISABLED功能被宣告,则一个客户端实现体不能发送一个LOGIN命令。
6.3. 客户端命令-认证状态
在认证状态下,把邮箱作为原语实体来操作的命令是允许的。在这些命令中,SELECT及EXMINE命令将会选中一个邮箱以访问及进入选中状态。
除了常见的命令(CAPABILITY,NOOP,和LOGOUT),以下命令在认证状态下也是正确 的:SELECT,EXAMINE,CREATE,DELETE,RENAME,SUBSCRIBE,UNSUBSCRIBE,LIST,LSUB,STATUS, 和APPEND。
6.3.1. SEELCT命令
参数:邮箱名
响应:要求非标签化的响应:FLAGS,EXISTS,RECENT
要求OK非标签化响应:UNSEEN,PERMANENTFLAGS,UIDNEXT,UIDVALIDITY 结果:OK-select完成,当前是选中状态
NO-select失败,当前是认证状态:不存在这个邮箱,不能访问邮箱 BAD-未知命令,或者参数无效
SELECT命令选中一个邮箱,以便这个邮箱中的邮件可以被访问。在返回一个OK给客户端前,服务器必须发送以下非标签化数据给客户端。要注意 的是,这个协议的早期版本只要求FLAGS,EXISTS,和RECENT非标签化数据;因此,客户端实现体应当把丢失数据作为个别情况讨论。 FLAGS
邮箱中被定义的标记。更多细节参看FLAGS响应的描述。
邮箱中邮件的数量。更多细节参看EXISTS响应的描述。
带有/Recent标记符的邮件的数量。更多细节参看RECENT响应的描述。 OK [UNSEEN
邮箱中第一封不可视邮件的邮件序列号。如果没有这个,客户端就不能对这个油箱中的第一封邮件做任何相关推测,如果想找到它,就需要发出一个SEARCH命令。
OK [PERMANENTFLAGS ()]
客户端可以永久修改的邮件标记的列表。如果没有这个,客户端应当推测所有的标记都是可以永久修改的。 OK [UIDNEXT
下一个唯一标识符的值。更多信息参考2.3.1.1一节。如果没有这个,客户端不能对下一个唯一标识符做任何相关推测。 OK [UIDVALIDITY
当前唯一标识符的值。更多信息参考2.3.1.1一节。如果没有这个,服务器就不支持唯一标识符。
在一个连接中,一次只能选中一个邮箱;同时访问多个邮箱要求多个连接。在尝试新的选择前,SELECT命令自动释放对任何当前选中邮箱的选中。因此,如果一个邮箱被选中,一个失败的SELECT命令正尝试,则没有邮箱被选中。 如果客户端被允许修改邮箱,则服务器应当把“[READ-WRITE]”响应码作为标签化OK响应的文本的前缀。
如果客户端没有修改邮箱的权限,但是有读取权限,则邮箱以只读方面选中,且服务器必须用“[READ-ONLY]”响应码作为标签化OK响应的 文本前缀,以SELECT。通过SELECT方式的只读访问,与通过EXAMINE方式的只读访问,二者的区别在于,特定的只读邮箱可能允许基于用户(而 不是全局)的永久状态的改变。在一个基于服务器的.newsrc文件中做了标记的网络论坛邮件就是这种可以被修改的、带有只读邮箱的、基于用户的永久状态 的一个例子。 例子:
C: A142 SELECT INBOX S: * 172 EXISTS S: * 1 RECENT
S: * OK [UNSEEN 12] Message 12 is first unseen S: * OK [UIDVALIDITY 3867529045] UID 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命令
参数:邮箱名
响应:要求非标签化响应:FLAGS,EXISTS,RECENT
要求OK非标签化响应:UNSEEN,PERMANENTFLAGS,UIDNEXT,UIDVALIDITY 结果:OK-examine完成,当前是选中状态
NO-examine失败,当前是认证状态:没有这个邮箱,不能访问邮箱 BAD-未知命令,或者无效参数
EXAMINE命令与SELECT相同,并返回同样的输出;不过,只读方式时选中的邮箱是一样的。邮箱的永久状态下,没有变动,包括有基于用户的状态的权限;特别的,EXAMINE不能使邮件丢失/Recent标记。
EXAMINE命令的标签化OK响应文本必须以“[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命令
参数:邮箱名
响应:此命令无需特定响应 结果:OK-create完成
NO-create失败:不能创建这个名称的邮箱 BAD-未知命令,或者无效参数
CREATE命令用给定名称创建一个邮箱。只有当这个名称的新邮箱被创建完成时,才返回一个OK响应。试图创建INBOX,或者一个与已在邮箱名同名的邮箱,引发一个错误。创建过程中的任何错误都将返回一个标签化NO响应。
如果邮箱名以服务器的层级分隔符作为尾缀(就像通过LIST命令从服务器返回的),这就告诉客户端准备在这个名称的层级下创建邮箱名。不要求这个通知的的服务器实现体必须忽略这个通知。任何情况下,这个被创建邮箱的名称(应当)没有多余的层级分隔符。
如果邮箱名的其它地方出现服务器的层级分隔符,服务器应当创建CREATE命令成功完成所需要的每一个层级。即,在一个以“/”作为层级分隔符的服务器上创建“foo/bar/zap”的尝试,如果foo/和foo/bar不存在,则应当创建它们。
如果一个被创建的邮箱,它的名称与已经被删除的邮箱名相同,那么,它的唯一标识符必须大于邮箱中先前引用中用到的任何一个唯一标识符,除非新的引用有一个不同的唯一标识符值。更多细节参看UID命令的描述。 例子:
C: A003 CREATE owatagusiam/ S: A003 OK CREATE completed
C: A004 CREATE owatagusiam/blurdybloop S: A004 OK CREATE completed 注意:这个例子的解释依赖于,从LIST“/”是否返回为层级分隔符。如果“/”是层级分隔符,带有一个名为“blurdybloop”成员的一个新层级“owatagusiam”被创建。否则,处在同一层级的两个邮箱被创建。
6.3.4. DELETE命令
参数:邮箱名
响应:此命令无需特定响应 结果:OK-delete完成
NO-delete失败:不能删除这个名称的邮箱 BAD-未知命令,或者无效参数
DELETE命令永久删除给定名称的邮箱。若邮箱被删除,则返回一个标签化的OK响应。尝试删除INBOX,或者一个不存在的邮箱,是错误的。
DELETE命令不能删除子级。例如,如果一个邮箱有一个子级“foo.bar”(假设“.”是层级定义符),删除“foo”不能删除“foo.bar”。尝试删除一个带有子级、并且有/Noselect属性的邮箱名,是错误的(更多细节参看LIST响应的描述)。
删除一个带有子级、并且没有/Noselect属性的邮箱名,是允许的。这种情况下,这个邮箱中的所有邮件被删除,且这个邮箱名将取得/Noselect邮箱名属性。 删除了的邮箱使用的最高唯一标识符的值必须保留,这样一个新创建的同名邮箱就不会再使用先前引用的标识符,除非这个新的引用有一个不同的唯一标识符值。更多细节参看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 DELTE 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命令
参数:已经存在的邮箱名 新的邮箱名
响应:此命令无需特定响应 结果:OK-rename完成
NO-rename失败:不能重命名邮箱为这个名称,不能以这个名称重命名至邮箱 BAD-未知命令,或者无效参数
RENAME命令改变一个邮箱的名称。当且仅当邮箱被重命名完成时,才返回一个标签化的OK响应。尝试把一个不存在的邮箱名重命名至一个已经存在的邮箱名,是错误的。重命名中的任何错误都将返回一个标签化的NO响应。
如果名称有子级名,(当重命名这个名称时)则子级名必须也被重命名。例如,重命名“foo”为“zap”,将重命名“foo/bar”(假设“/”是层级定义符)为“zap/bar”。
如果服务器层级分隔符出现在名称中,那么服务器应当创建RENAME命令成功完成所需要的每一个父级名。即,尝试在一个以“/”为层级分隔符的 服务器上重命名“foo/bar/zap”为baz/rag/zowie,如果baz/和baz/rag/不存在,则应当创建它们。
旧邮箱使用的最高唯一标识符的值必须保留,这样一个新创建的同名邮箱就不会再使用先前引用的标识符,除非这个新的引用有一个不同的唯一标识符值。更多细节参看UID命令的描述。