对于邮件解决来说,大家比拟相熟的应该是 POP3 、 SMTP 这类的协定,而明天咱们介绍的 IMAP 其实也是十分罕用的一种邮件解决协定。它和 POP3 比拟相似,都是以接管解决邮件为主。不过绝对于 POP3 来说,IMAP 在本地的操作都会间接同步到线上的邮件服务器, POP3 个别不会间接地进行同步,这就是它们两个最大的区别。对于这些邮件协定的具体内容,如果还有不太理解的同学,能够多在网上查阅相干的材料。
不论是 IMAP 还是 POP3 ,与 SMTP 配合后都能非常简单地实现一个邮件客户端的性能。这篇文章咱们就次要来学习一下 PHP 中的 IMAP 扩大的一些简略内容。
装置扩大
首先,就是装置 IMAP 的扩大。这个扩大是随 PHP 源码包一起公布的,在编译的时候能够间接给 configure 增加 –with-imap 以及 –with-imap-ssl 就能够了。如果是前期装置的话,间接在源码包的 ext 目录下找到 imap 目录就能够进去进行一般的扩大装置步骤了。
不过须要留神的是,IMAP 扩大是须要操作系统环境中也装置一些组件的。
<code class="shell">yum install -y libc-client-devel libc-client ln -s /usr/lib64/libc-client.so /usr/lib/libc-client.a ln -s /usr/lib64/libkrb5.so /usr/lib/libkrb5.so
咱们须要装置 libc-client-devel ,而后建设两个软连贯。否则在扩大编码装置的时候可能呈现问题。
连贯 QQ 邮箱
接下来,咱们尝试连贯一下 QQ 邮箱。
<code class="php">$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 性能后所取得的受权登录码。
查看邮箱信息
连贯邮箱胜利后,就能够查看相干的一些信息。
<code class="php">$rowsCount = imap_num_msg($mbox); echo $rowsCount, PHP_EOL; // 37
imap_num_msg() 返回的是邮箱中的音讯数量,其实也就是咱们的邮件数量。
<code class="php">$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}Sent Messages" // [2]=> // string(19) "{imap.qq.com}Drafts" // [3]=> // string(29) "{imap.qq.com}Deleted Messages" // [4]=> // string(17) "{imap.qq.com}Junk" // [5]=> // string(51) "{imap.qq.com}&UXZO1mWHTvZZOQ-/[email protected]" // }
imap_list() 函数返回的是邮箱中的文件夹信息,比方咱们这里有 INBOX 收件箱、Sent Messages 已发送邮件、Drafts 草稿箱、Deleted Messages 已删除邮件、Junk 垃圾箱,另外还有一个是我的邮箱中绑定的 139 的邮箱文件夹也显示了进去。
<code class="php">$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, 16 Dec 2020 14: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() 返回的是以后邮箱文件夹中的信息。从返回的字段能够看出,咱们有 Unread 未读邮件 34 封。新邮件 37 封,大小、获取工夫、邮箱信息等内容。
读取操作邮件
最初就是咱们的重头戏了,如何下载读取邮件以及进行一些简略地操作。
<code class="php">$all = imap_search($mbox, "ALL"); var_dump($all); // array(37) { // [0]=> // int(1) // [1]=> // int(2) // [2]=> // int(3) // [3]=> // int(4) // [4]=> // int(5) // …… // …… foreach ($all as $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); if (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, "Drafts"); // 拷贝到草稿箱 imap_setflag_full($mbox, $m, "Seen"); // 设置为已读 } if ($m == 2) { imap_delete($mbox, $m); // 删除 imap_expunge($mbox); } if ($m == 3) { imap_mail_move($mbox, $m, "Junk"); // 挪动 imap_expunge($mbox); } }
imap_search() 用于查找邮件,它的第二个参数是指定的字符串,比方这个 ALL 就是返回所有的邮件信息,它还能够指定为 DELETED、UNSEEN 等许多内容。具体的参数列表大家能够查阅相干的文档。这个函数获取的是邮件信息的所有的邮件编号,其实能够看进去,它就是从 1 到 37 的数字编号。
读取邮件
imap_fetchheader() 和 imap_fetchbody() 别离就是依据邮件编号读取邮件的头信息和内容信息。如果失常打印的话,它们的内容都是通过编码的,也就是说咱们不能直观地看到具体的内容信息。所以须要对头文件进行一个 UTF-8 解码的过程,邮件内容则依据头信息中的 Content-Transfer-Encoding 字段查看对应的编码类型进行解码。这里咱们只演示了 base64 编码的状况,其实它还有别的编码格局,有趣味的同学能够本人查阅材料深刻理解一下。
<code class="php">// 第一封邮件 // headers // array(13) { // ["From"]=> // string(29) "QQ邮箱团队 <[email protected]>" // ["To"]=> // string(29) "xxx <[email protected]>" // ["Subject"]=> // string(53) "更平安、更高效、更弱小,尽在QQ邮箱APP" // ["Date"]=> // string(31) "Wed, 16 Dec 2020 10:08:54 +0800" // ["Message-ID"]=> // string(38) "<app_popularize.1608084534.3423313103>" // ["X-QQ-STYLE"]=> // string(1) "1" // ["X-QQ-SYSID"]=> // string(9) "100000010" // ["X-QQ-MIME"]=> // string(21) "TCMime 1.0 by Tencent" // ["X-QQ-Mailer"]=> // string(10) "QQMail 2.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" // }
上述内容就是第一封邮件的 header 信息,从信息内容中能够看到 Subject 就是邮件的题目,这是一封 QQ 邮箱零碎收回的邮件。From 和 To 别离就是发件人和收件人的邮箱地址。其它比拟重要的就是 Content-Type 和 Content-Transfer-Encoding 别离对应着文档类型、字符集编码和转换编码类型。
不同的邮件的邮件头会不一样,咱们这里只是展现了最简略的一种。
<code class="php">// rawBody // string(5850) " // <!DOCTYPE html> // <html> // <head> // <meta charset="UTF-8"> // <title>imap</title> // <style> // @media screen and (min-width: 700px) { // .bottomErweima { // display: block !important; // } // #btn { // display: none !important; // } // .footer { // display: none !important; // } // } // /* vivo手机width: 980px 同时 aspect-ratio小于1的,处于700px-1000px的手机*/ // @media screen and (min-width: 700px) and (max-width: 1000px) and (max-aspect-ratio:1/1){ // .bottomErweima { // display: none !important; // } // #btn { // display: block !important; // } // .footer { // display: block !important; // } // } // </style> // </head> // <body style="width: 100%;margin: 0;padding: 0;position: relative;"> // <div id="email-box" style="max-width: 550px;margin: 0 auto;"> // <div class="email_container"> // <div class="head" style="background: #f3f3f3;"> // <span class="content" style="font-size: 14px;color: #000000;line-height: 26px;display: block;padding: 40px 20px;">QQ邮箱APP,让高效触手可及。在这里,你能够登录多个邮箱账号、便捷存储微信邮件、多窗口编辑邮件......还有更多功能,等你摸索!</span> // </div> // …… // ……
邮件的内容在应用 imap_base64() 解析之后就是简略地 HTML 格局的内容。这和头信息中的 Content-Type 是间接对应的。imap_base64() 其实和 base64_decode() 并没有什么区别,大家间接应用 base64_decode() 也是没有问题的。当然,前提是要判断 Content-Transfer-Encoding 中是否应用了 base64 来对邮件内容进行了编码。有的邮件中可能连这个字段都没有。
复制、挪动、删除邮件
imap_mail_copy() 用于复制邮件,在这里,咱们将第一封邮件复制到了草稿箱中,而后应用 imap_setflag_full() 将这封邮件标记为已读。从参数就可以看进去 Seem 就是已读的意思,当然它还有别的参数,比方 Deleted 、 Draft 之类的内容。
imap_delete() 函数用于删除邮件,imap_mail_move() 用于挪动文件,调用这两个函数都须要应用 imap_expunge() 来将操作同步到线上。
进行完操作后,大家能够间接看一下线上的邮件是不是曾经产生了相应的变动了。
总结
IMAP 的常识咱们就简略地入门学习一下,因为在学习这块内容的时候我发现网上曾经有很多大神门封装好的类能够让咱们间接复制下来应用。另外,它的性能十分丰盛,还有很多函数并没有介绍,比如说操作附件之类的性能,置信大家在本人的学习和应用过程中都会缓缓接触到的。
测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/6.PHP中的IMAP扩大简略入门.php
参考文档:
https://www.php.net/manual/zh/book.imap.php
各自媒体平台均可搜寻【硬核项目经理】