協議基礎:使用Telnet學習IMAP協議

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 [email protected] 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 [email protected] 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 [email protected] 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. 還可以獲取服務器中的所有郵件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章