IMAP 介绍
IMAP
全称是 Internet Mail Access Protocol,即交互式邮件存取协议,它是跟 POP3 类似邮件访问标准协议之一。不同的是,开启了 IMAP 后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
与 POP3 的差异大家可以看这里
邮件协议包括 SMTP,POP3,IMAP。由于SMTP 和POP3这两个协议网络上介绍的比较多,包括命令的使用和 PHP 代码的使用都可以搜的到,所以这篇文章主要讲解怎么样使用命令来操作IMAP。
想了解怎么用命令来操作 SMTP 和POP3的朋友可以移步到以下两个地址
- 邮件实现详解(二)—— 手工体验 smtp 和 pop3 协议
- 协议基础: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>"
-
<mailbox path>
邮箱路径,如果为 ” “,则列出根目录的所有文件夹 -
<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
需要注意的是:
- IMAP的命令使用与 POP3 类似,主要的区别在于登录认证。
- 在用
PHP
做邮箱检测时,可以借助上面的方式来实现。PHP
检测部分我已经写好了代码,可以在github
上查看。 - 还可以获取服务器中的所有邮件