最近几天在学习IMAP协议,虽然网络上对IMAP介绍的资料不少,但是有关IMAP协议指令的资料很少,能让我这个新手研究明白的资料就更少了。刚开始学习的时候抱着官方的指导手册看,虽然已经翻译成了中文,但是那专业的描述,真的是晦涩难懂啊。怎么看,那东西都是属于文艺青年专有的,不是我这个普通青年能理解的东西。庆幸的是经过了我几天的东拼西凑,总算是把这个协议弄懂了六七成,现在可以做到用IMAP协议收发邮件了。下面就对这两天的学习做个小结。
一旦客户端和服务器间的连接建立完成,一个IMAP4rev1连接就会处于4种状态中的某一种。
1.未认证状态 :在未认证状态下,大多数命令在得到许可前,客户端必须提供认证证书。若非连接已经是预认证了的,一个连接开始时,就进入了未认证状态。
2. 认证状态 :在认证状态下,客户端是认证了的,它必须先于影响邮件的命令被许可前,选择一个邮箱以访问。当一个预认证连接开始,被认可的认证证书已经提供,选择一个邮箱发生错误后,或者一个成功的CLOSE命令后,就进入了认证状态。
3. 选中状态 :在一个选中状态,一个邮箱被选中以访问。当一个邮箱被成功选中时,就进入了这个状态。
4. 注销状态 :在注销状态下,连接正在被终止。一个客户端请求(通过LOGOUT命令),或者客户端、服务器的单方面动作,都会导致进入这个状态。
之所以提及到状态,是因为IMAP协议的很多指令只有在处于某种状态下才会有效。下面我就为大家罗列一下指令的作用的权限吧。
1.在任何状态下都有效的指令(全局命令):CAPALIBILY,NOOP,LOGOUT。
2.未认证状态下有效的指令(未认证状态命令):STARTTLS,AUTHENTICATE,LOGIN和全局命令。
3.认证状态下有效的指令(认证状态命令):SELECT,EXAMINE,CREATE,DELETE,RENAME,SUBSCRIBE,UNSUBSCRIBE,LIST,LSUB,STATUS,APPEND和全局命令
4.在选中状态下有效的指令(选中状态指令):CHECK,CLOSE,EXPUNGE,SEARCH,FETCH,STORE,COPY,UID和全局命令、认证状态命令。jie
上面所说的基本上就是IMAP协议里的所有指令了。下面我将要介绍其中一部分我理解了的指令(这些指令就可以实现收取邮件了。)
1.
CREATE <folder>
CREATE可以创建指定名字的新邮箱。邮箱名称通常是带路径的文件夹全名。(有些IMAP客户机使用邮件夹称呼新邮箱)
C: A003 CREATE owatagusiam/ /*创建一个新目录owatagusiam*/
S: A003 OK CREATE completed
C: A004 CREATE owatagusiam/blurdybloop
/* 在创建的目录owatagusiam下创建一个名为blurdybloop 的邮箱,当然可以省略第一步,直接A004 CREATE owatagusiam/blurdybloop ,表示在新的目录owatagusiam 下创建了一个名为blurdybloop 的邮箱*/
S: A004 OK CREATE completed
/**********IMAP协议发送指令有个不同于SMTP和POP协议的一个地方,就是指令全面必须要加一个4位标签,如A003,A004.这个标签有什么特别的意义我也不清楚。对于这个标签,你可以随便写也可以是“abcd”,"efgh",只要是保证是四位就可以了。可以重复,我多次试验,也没有发现重复了会带来什么问题。这个CREATE指令我也没有发送成功过,不知道为什么。如果有懂的朋友,希望指点一二。说这么多大家未必明白,举个例子就行了(后面我回贴上详细代码,大家一看便知了)。比如说要发送LOGOUT指令,发送过去的指令要写成这样"a001 logout\r\n",只有这样服务器才能识别。 ************/
2.
DELETE <folder>
DELETE命令删除指定名字的文件夹。文件夹名字通常是带路径的文件夹全名,当邮箱被删除后,其中的邮件也不复存在。
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
3.
RENAME <old folder><new folder>
RENAME命令可以修改文件夹的名称,它使用两个参数:当前邮箱名和新邮箱名,两个参数的命名符合标准路径命名规则。
C: A683 RENAME blurdybloop sarasoop
S: A683 OK RENAME completed
C: A684 RENAME stuff/junk newbox /*把stuff目录(文件夹)下的邮箱junk改名为newbox*/
S: A684 OK RENAME Completed
4.
LIST <BASE><template>
LIST命令用于列出邮箱中已有的文件夹,有点像操作系统的列目录命令,有两个参数,邮箱路径参数BASE:表示用户登陆目录;第二个参数template:表示希望显示的邮箱名。这个命令可以包含起始的路径位置和需要列出的文件夹所符合的特征,可以使用通配符"*"。
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
5.
APPEND <folder><at