当前位置: 首页 > 后端技术 > PHP

PHP中IMAP扩展的简单介绍

时间:2023-03-29 16:07:21 PHP

对于邮件处理,大家应该对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"//["主题"]=>//string(53)"更安全、更高效、更强大,尽在QQ邮箱APP"//["Date"]=>//string(31)"Wed,16Dec202010:08:54+0800"//["Message-ID"]=>//string(38)""//["X-QQ-STYLE"]=>//string(1)"1"//["X-QQ-SYSID"]=>//string(9)"100000010"//["X-QQ-MIME"]=>//string(21)"TCMime1.0byTencent"//["X-QQ-Mailer"]=>//string(10)"QQMail2.x"//["X-QQ-mid"]=>//string(30)"mmnez10417t1608084534tfekjqwx0"//["Content-Type"]=>//string(26)"text/html;charset="utf-8""//["Content-Transfer-Encoding"]=>//string(6)"base64"//["Mime-Version"]=>//string(3)"1.0"//}以上内容为第一封邮件头信息,从信息内容可以看出,Subject是邮件的标题,是QQ邮箱系统发送的邮件。From和To分别是发件人和收件人的电子邮件地址。另外一个重要的是Content-Type和Content-Transfer-Encoding分别对应文档类型、字符集编码和转换编码类型。不同邮件的header会有所不同,我们这里只展示最简单的一种。//rawBody//string(5850)"//////////imap//////////////QQ邮箱APP,让高效触手可及在这里,您可以登录多个邮箱,方便存储微信邮件,多-window编辑邮件...还有更多功能,等你来探索!//

//...//...邮件的内容就是imap_base64解析后的HTML()格式的内容,这个直接对应header信息中的Content-Type,其实imap_base64()和base64_decode()没有区别,直接用base64_decode()就可以了,当然前提是判断Content-是否在Transfer-Encoding中使用base64对邮件内容进行编码,有的邮件甚至可能没有这个字段复制、移动、删除邮件imap_mail_copy()用于复制邮件,这里放第一个电子邮件将其复制到草稿箱,然后使用imap_setflag_full()将此电子邮件标记为已读。从参数可以看出Seem是read的意思,当然它还有其他的参数,比如Deleted,Draft之类的。imap_delete()函数用于删除邮件,imap_mail_move()用于移动文件。调用这两个函数需要使用imap_expunge()同步操作到线上。运行后可以直接查看在线邮件是否有相应的变化?总结一下IMAP的知识,下面就简单入门学习一下吧,因为在学习这部分内容的时候,发现网上已经有很多大神门封装的类,我们可以直接复制使用。另外它的功能非常丰富,还有很多功能没有介绍,比如操作配件等功能,相信大家在自己的学习和使用过程中也会逐渐接触到。测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/6。PHPIMAP扩展的简单介绍。PHP参考文档:https://www.php.net/manual/zh/book.imap.php各媒体平台均可搜索【硬核项目经理】