网络工作组 M.Crispin
RFC:3501 华盛顿大学
旧版本:2060 2003年3月
级别:标准轨道
互联网消息访问协议
备忘录的状态
本文档描述Internet通信的标准轨道协议,并对实现进行讨论和建议。请参考当前版本的互联网办公协议标准STD)查询本协议的状态。本文档的分发不受限制。
版权声明
版权属于互联网协议,保留所有权利。
抽象
IMAP V4r1 允许客户端访问和控制服务器上的电子邮件消息。IMAP V4r1允许像控制本地文件夹那样控制远程邮箱。IMAP V4r1还提供离线客户端向服务器同步的能力。
IMAP V4r1 的操作包括创建、删除、重命名邮箱,检查是否有新消息,删除消息,设置清除标记,RFC2822和RFC2045格式解析,搜索,查询获取消息的属性、文本、portions thereof。IMAP V4r1的消息用数字来标识。数字可以认为是消息的序列号或者唯一标识。
IMAP V4r1支持单个的服务器,访问多个IMAP V4r1服务器的方法在RFC2244中讨论。
IMAP V4r1不限定发送邮件,该功能在RFC2821邮件传送协议中处理。
目录表
IMAP V4r1协议限定
1. 如何阅读本文档
1.1 本文档的组织
本文档从IMAPV4r1客户端或服务器的实现的视角进行描述。如果你尝试理解协议的操作,请不要忽略第2节描述协议的概述。第3~5节的材料提供IMAPV4r1操作的通用内容和定义。
第6、7和9节描述IMAP命令、相应和语法和限定。他们之间不能分开去理解。特别需要支持的是,不要尝试单独理解命令的语法,应该参考语法规则章节。
1.2 本文档的协定
协定是基本的概念或过程。文档的协定如下:
“C"和”S":标识客户端和服务器。
文档中的关键字必须、可以不、要求、应该、不应该、需要、不需要、可以和可选的在【关键字】中描述。
用“可以”来描述可能出现的情况。
”用户“用来描述普通用户,"客户端"用来描述用户使用的软件.
"连接"用来描述客户端和服务器之间从发布到终止的网络的互操作序列。
“会话”用来描述客户端和服务器从邮箱选定之后到选择停止的互操作序列。
如果没有特殊的描述,字符用来表述7比特的ASCII码。其他的使用字符集进行描述,在【MIME-IMT】和【字符集】中描述,查询这些文档客户获得详细情况。
IMAP使用多个限定协议,他们并不是IMAP协议的一部分,但是在事实上被接受。实现需要理解这些协定,避免冲突或者遗漏实现。比如,&不应该作为邮箱地址分隔符,应为这和邮箱名协议限制冲突,用户可以在邮箱名中使用这个。
1.3 实现需要特别注意的地方
实现IMAP协议时强烈鼓励阅读IMAP协议实现参考文档,这有助于理解协议的复杂性和实现具有互操作性的产品。
IMAP V4r1设计向前兼容IMAP V2和未发布的IMAP2bis。IMAPV4r1和RFC1730描述的IMAPV4兼容;也有例外,RFC1730中增加的一些被证明是存在缺陷的特性被删除了。在IMAPV4r1的演进过程中,早期版本的一些方面被废弃了。在IMAPV4r1实现中废弃的在早期实现中用来的命令、响应、数据格式在【IMAP-OBSOLETE】中描述。
另外一个兼容性关注点是IMAP2bis,和早期协议有很多变化,在【IMAP-COMPAT】中描述。完整的兼容性关注点描述在【IMAP-HISTORICAL】,本文档历史兴趣原发性。
2. 协议概述
2.1 链接级别
IMAPV4r1协议要求TCP协议提供的那种可靠的数据流。如果使用使用TCP协议,IMAPV4r1服务器监听143端口。
2.2 命令和响应
一条IMAPV4r1链接包括客户端和服务器网络连接的建立,服务器初始问候,客户端和服务器的交互。客户端和服务器的交互包括客户端命令,服务器数据和服务器完成结果响应。
客户端和服务器之间传递的所有交互使用行格式,也就是说使用回车换行结束。IMAPV4r1协议的服务器或者客户端上的协议者之读取一行或者读取知道数目的十进制序列。
2.2.1 客户端发送和服务器接收
客户端开始一个操作。没一个客户端命令包括一个前置的描述符(典型的数字字母字符串,比如A0001、A0002),称之为标签。客户端为每个命令生成不同的标签。
客户端必须遵守大纲限定的语法。发送少或者多个空格和参数会被认为语法错误。
两种情况下客户端发送的以行不代表完整的命令。第一种情况,命令参数超过每行的个数限制(参考线性字符串数据格式的描述);第二种情况,命令参数需要服务器反馈(例如AUTHENTICATE命令)。以上两种情况,服务器如果准备接受剩下的命令,发送继续请求的响应。响应携带+作为前缀。
注意: 相反的,如果服务器检测到错误的命令,它发送一个携带匹配命令的标签的BAD的完整响应去拒绝命令避免客户端发送更多的命令。
服务器给另外的命令发送完成的响应(如果正在处理多个进程),或者不带标签的数据也是可能的。另外,命令中的继续请求一直挂起;客户端等待响应后继续操作,和读取服务器另外的响应。所有的情况下,客户端在初始化新的命令前必须发送完成的命令。(包括收到多个命令继续请求响应和已经发送命令的继续请求)。
IMAPV4r1协议中的接收者服务器读取客户端的命令行,解析命令和参数,传送服务器数据和服务器命令完整结果响应。
2.2.2 服务器发送和客户端接收
服务器向客户端传输数据和申明命令没有完成的带*前缀的状态相应,和被称为不带标签的响应。
服务器的数据可能是发送给客户端的命令结果,也可能是服务器延迟地发送。服务器对特定命令相应的结果和服务器延迟发送的数据,在语法上没有差别。
服务器完整结果响应声明了操作的成功或者失败。操作的响应中包含和操作命令请求一致的标签。 如果有多个操作在处理,服务器完成响应中标签对应命令完成。服务的响应包括:OK(声明成功),NO(声明失败),BAD(申明协议错误或者不识别的命令或者命令语法错误)。
服务器应该直接强制语法规范限定。任何协议语法错误客户端命令,包括(但不限于)缺少或者多余的空格和参数,应该被拒绝,客户端给出BAD的响应。
IMAPV4r1的协议接收者读取服务的响应行。然后