对于邮件处理,大家应该对POP3、SMTP等协议不陌生,而我们今天介绍的IMAP其实是一个非常常用的邮件处理协议。它与POP3类似,都是以接收和处理邮件为主。不过与POP3相比,IMAP的本地操作会直接同步到在线邮件服务器,而POP3一般不会直接同步,这是两者最大的区别。关于这些邮件协议的具体内容,如果同学们还不是很了解,可以上网查更多相关资料。不管是IMAP还是POP3,配合SMTP后都可以轻松实现邮件客户端的功能。在本文中,我们将主要学习PHP中IMAP扩展的一些简单内容。安装扩展首先,安装IMAP扩展。本扩展与PHP源码包一起发布,编译时直接加上--with-imap和--with-imap-ssl进行配置即可。如果是后装,直接在源码包的ext目录下找到imap目录,然后就可以进去进行普通的扩展安装步骤。但需要注意的是,IMAP扩展需要在操作系统环境中安装一些组件。yuminstall-ylibc-client-devellibc-clientln-s/usr/lib64/libc-client.so/usr/lib/libc-client.aln-s/usr/lib64/libkrb5.so/usr/lib/libkrb5.so我们需要安装libc-client-devel,然后建立两个软链接。否则,安装扩展代码时可能会出现问题。连接QQ邮箱接下来我们尝试连接QQ邮箱。$host="{imap.qq.com:993/imap2/ssl}INBOX";$username="xxxx";//没有@qq.com$password="xxxxxx";//打开imap后授权登录码$mbox=imap_open($host,$username,$password);很简单的函数,imap_open()用于打开连接邮箱的句柄。三个参数也很直观,host指定邮箱的域名地址,可以直接指定连接邮箱中的哪个文件夹。这里我们直接进入收件箱。连接QQ邮箱时直接使用QQ号作为用户名即可,后面不需要加@qq.com。密码是我们在QQ邮箱设置中选择账户管理并开启imap功能后得到的授权登录码。查看邮箱信息连接邮箱成功后,可以查看一些相关信息。$rowsCount=imap_num_msg($mbox);echo$rowsCount,PHP_EOL;//37imap_num_msg()返回邮箱中的消息条数,其实就是我们的邮件条数。$list=imap_list($mbox,"{imap.qq.com}","*");var_dump($list);//array(6){//[0]=>//string(18)"{imap.qq.com}INBOX"//[1]=>//string(26)"{imap.qq.com}已发消息"//[2]=>//string(19)"{imap.qq.com}草稿"//[3]=>//string(29)"{imap.qq.com}删除消息"//[4]=>//string(17)"{imap.qq.com}Junk"//[5]=>//string(51)"{imap.qq.com}&UXZO1mWHTvZZOQ-/xxxxxx@139.com"//}imap_list()函数返回邮箱中的文件夹信息,例如,我们有INBOX收件箱,已发邮件,草稿,已删除邮件,垃圾邮件,另外还有一个我邮箱绑定的139邮箱文件夹也显示出来了。.$chk=(array)imap_mailboxmsginfo($mbox);var_dump($chk);//array(8){//["Unread"]=>//int(34)//["Deleted"]=>//int(0)//["Nmsgs"]=>//int(37)//["Size"]=>//int(951128)//["Date"]=>//string(37)"Wed,16Dec202014:31:50+0800(CST)"//["Driver"]=>//string(4)"imap"//["Mailbox"]=>//string(54)"{imap.qq.com:993/imap/notls/ssl/user="149844827"}INBOX"//["Recent"]=>//int(0)//}imap_mailboxmsginfo()返回当前邮箱信息在文件夹中。从返回的字段中可以看出,我们有34封未读电子邮件。新增37封邮件,包括大小、获取时间、邮箱信息等。最后一部分阅读操作邮件是我们的重头戏,如何下载阅读邮件并进行一些简单的操作。$all=imap_search($mbox,"ALL");var_dump($all);//array(37){//[0]=>//int(1)//[1]=>//int(2)//[2]=>//整数(3)//[3]=>//整数(4)//[4]=>//整数(5)//...//...foreach($allas$m){$headers=imap_fetchheader($mbox,$m);$rawBody=imap_fetchbody($mbox,$m,FT_UID);$headers=iconv_mime_decode_headers($headers,0,"UTF-8");var_dump($headers);如果(isset($headers['Content-Transfer-Encoding'])&&$headers['Content-Transfer-Encoding']=='base64'){$rawBody=imap_base64($rawBody);}var_dump($rawBody);if($m==1){imap_mail_copy($mbox,$m,"草稿");//复制到草稿箱imap_setflag_full($mbox,$m,"Seen");//设置为已读}if($m==2){imap_delete($mbox,$m);//删除imap_expunge($mbox);}if($m==3){imap_mail_move($mbox,$m),"垃圾邮件");//移动imap_expunge($mbox);}}imap_search()用于查找邮件,它的第二个参数是指定的字符串,比如这个ALL就是返回所有的邮件信息,也可以指定为DELETED、UNSEEN等很多具体的参数列表。可以参考相关文档。该函数获取邮件信息的所有邮件号码。其实可以看出是1到37之间的一个数字。读取邮件imap_fetchheader()和imap_fetchbody()分别根据邮件编号读取邮件的头信息和内容信息。如果是正常打印的话,它们的内容是经过编码的,也就是说我们无法直观的看到具体的内容信息。因此需要对头文件进行UTF-8解码处理,根据头信息中Content-Transfer-Encoding字段中对应的编码类型对邮件内容进行解码。这里我们只演示base64编码。其实它还有其他的编码格式。有兴趣的同学可以自行查阅资料了解更多。//第一封邮件//headers//array(13){//["From"]=>//string(29)"QQ邮箱团队<10000@qq.com>"//["To"]=>//string(29)"xxx
