协议基础:使用Telnet学习IMAP协议

IMAP 介绍

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

与POP3的差别你们能够看这里html

邮件协议包括SMTPPOP3IMAP。因为SMTPPOP3这两个协议网络上介绍的比较多,包括命令的使用和PHP代码的使用均可以搜的到,因此这篇文章主要讲解怎么样使用命令来操做IMAPgit

想了解怎么用命令来操做SMTPPOP3的朋友能够移步到如下两个地址github

  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
     ...
  • 命令格式bash

    命令输入:
      <随机字符串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>ui

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

    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. 还能够获取服务器中的全部邮件
相关文章
相关标签/搜索