IMAP 介绍

IMAP 全称是 Internet Mail Access Protocol,即交互式邮件存取协议,它是跟 POP3 类似邮件访问标准协议之一。不同的是,开启了 IMAP 后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

与POP3的差异大家可以看这里

邮件协议包括SMTPPOP3IMAP。由于SMTPPOP3这两个协议网络上介绍的比较多,包括命令的使用和PHP代码的使用都可以搜的到,所以这篇文章主要讲解怎么样使用命令来操作IMAP

想了解怎么用命令来操作SMTPPOP3的朋友可以移步到以下两个地址

  1. 邮件实现详解(二)------手工体验smtp和pop3协议
  2. 协议基础:SMTP:使用Telnet学习SMTP协议

IMAP 命令详解

  • 端口 143/993 (telnet/SSL)

     Port 143 (plain / no SSL)  // 非SSL
     telnet <IP> 143
     ....
     Port 993 (SSL)             // SSL
     openssl s_client -connect <IP>:993
     CONNECTED(00000003)
     depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
     verify error:num=20:unable to get local issuer certificate
     verify return:0
     ---
     Certificate chain
     ...
  • 命令格式

    命令输入:
      <随机字符串ID> command
    响应:
      <随机字符串ID> OK <ANSWER DETAIL>
      
    例如:
      A1 login test@qq.com password
      A1 OK login successful

    A1 即是 <随机字符串ID>,可以是你定义的任何字符串,同时返回的文本也带有这个字符串。

    SSL 示例

    $ telnet imap.qq.com 143
     \* OK [CAPABILITY IMAP4 IMAP4rev1 ID AUTH=LOGIN NAMESPACE] QQMail IMAP4Server ready 
     A1 LOGIN test@qq.com password
     A1 OK Success login ok
     A1 LIST "" "*"
     \* LIST (\NoSelect \HasChildren) "/" "&UXZO1mWHTvZZOQ-"
     \* LIST (\HasNoChildren) "/" "INBOX"
     \* LIST (\HasNoChildren) "/" "Sent Messages"
     \* LIST (\HasNoChildren) "/" "Drafts"
     \* LIST (\HasNoChildren) "/" "Deleted Messages"
     \* LIST (\HasNoChildren) "/" "Junk"
     \* LIST (\HasNoChildren) "/" "&UXZO1mWHTvZZOQ-/QQ&kK5O9ouilgU-"
     \* LIST (\HasNoChildren) "/" "&UXZO1mWHTvZZOQ-/&jURukA-"
     \* LIST (\HasNoChildren) "/" "&UXZO1mWHTvZZOQ-/&kK5O9l9SaGM-"
     \* LIST (\HasNoChildren) "/" "&g0l6Pw-"

    SSL示例

    $ openssl s_client -crlf -connect imap.qq.com:993
      ...
      \* OK [CAPABILITY IMAP4 IMAP4rev1 ID AUTH=LOGIN NAMESPACE] QQMail IMAP4Server ready
  • 登录认证
    ID LOGIN <EMAIL> <PASSWORD>

    $ A1 LOGIN test@qq.com password
      A1 OK Success login ok
  • 列出邮件文件夹
    LIST "<mailbox path>" "<search argument>"

    1. <mailbox path> 邮箱路径,如果为" ", 则列出根目录的所有文件夹
    2. <search argument>是区分大小写的,可为 “” 或 “%”,“”匹配所有,“%”只匹配当前层

      $ A1 LIST "" "*"
  • 选择一个文件夹

    $ A1 SELECT INBOX
      \* 1254 EXISTS  // 共存在1254封邮件
      \* 0 RECENT     // 最新的邮件
      \* OK [UNSEEN 75]  // 未读
      \* OK [UIDVALIDITY 1429146575] UID validity status  
      \* OK [UIDNEXT 2475] Predicted next UID
      \* FLAGS (\Answered \Flagged \Deleted \Draft \Seen)
      \* OK [PERMANENTFLAGS (\* \Answered \Flagged \Deleted \Draft \Seen)] Permanent flags
      A1 OK [READ-WRITE] SELECT complete

需要注意的是:

  1. IMAP的命令使用与POP3类似,主要的区别在于登录认证。
  2. 在用PHP做邮箱检测时,可以借助上面的方式来实现。PHP检测部分我已经写好了代码,可以在github上查看。
  3. 还可以获取服务器中的所有邮件

大步点点
191 声望14 粉丝

There are only two things you need to be a great programmer: curiosity and kindness. Everything else you can learn over time. Everything.