PHP中的IMAP擴(kuò)展簡(jiǎn)單入門對(duì)于郵件處理來說,大家比較熟悉的應(yīng)該是 POP3 、 SMTP 這類的協(xié)議,而今天我們介紹的 IMAP 其實(shí)也是非常常用的一種郵件處理協(xié)議。它和 POP3 比較類似,都是以接收處理郵件為主。不過相對(duì)于 POP3 來說,IMAP 在本地的操作都會(huì)直接同步到線上的郵件服務(wù)器, POP3 一般不會(huì)直接地進(jìn)行同步,這就是它們兩個(gè)最大的區(qū)別。關(guān)于這些郵件協(xié)議的具體內(nèi)容,如果還有不太了解的同學(xué),可以多在網(wǎng)上查閱相關(guān)的資料。 不管是 IMAP 還是 POP3 ,與 SMTP 配合后都能非常簡(jiǎn)單地實(shí)現(xiàn)一個(gè)郵件客戶端的功能。這篇文章我們就主要來學(xué)習(xí)一下 PHP 中的 IMAP 擴(kuò)展的一些簡(jiǎn)單內(nèi)容。 安裝擴(kuò)展首先,就是安裝 IMAP 的擴(kuò)展。這個(gè)擴(kuò)展是隨 PHP 源碼包一起發(fā)布的,在編譯的時(shí)候可以直接給 configure 添加 --with-imap 以及 --with-imap-ssl 就可以了。如果是后期安裝的話,直接在源碼包的 ext 目錄下找到 imap 目錄就可以進(jìn)去進(jìn)行普通的擴(kuò)展安裝步驟了。 不過需要注意的是,IMAP 擴(kuò)展是需要操作系統(tǒng)環(huán)境中也安裝一些組件的。 yum install -y libc-client-devel libc-client我們需要安裝 libc-client-devel ,然后建立兩個(gè)軟連接。否則在擴(kuò)展編碼安裝的時(shí)候可能出現(xiàn)問題。 連接 QQ 郵箱接下來,我們嘗試連接一下 QQ 郵箱。 $host = "{imap.qq.com:993/imap2/ssl}INBOX";很簡(jiǎn)單的函數(shù),imap_open() 用于打開連接郵箱的句柄。三個(gè)參數(shù)也很直觀,host 指定郵箱的域名地址,并且可以直接指定連接到郵箱中的哪個(gè)文件夾。在這里我們直接進(jìn)入的是收件箱。連接 QQ 郵箱的時(shí)候用戶名直接使用 QQ 號(hào)就可以了,不需要在后面帶上 @qq.com 。而密碼則是我們?cè)?QQ 郵箱的設(shè)置中,選擇賬號(hào)管理,開通 imap 功能后所獲得的授權(quán)登錄碼。 查看郵箱信息連接郵箱成功后,就可以查看相關(guān)的一些信息。 $rowsCount = imap_num_msg($mbox);imap_num_msg() 返回的是郵箱中的消息數(shù)量,其實(shí)也就是我們的郵件數(shù)量。 $list = imap_list($mbox, "{imap.qq.com}", "*");imap_list() 函數(shù)返回的是郵箱中的文件夾信息,比如我們這里有 INBOX 收件箱、Sent Messages 已發(fā)送郵件、Drafts 草稿箱、Deleted Messages 已刪除郵件、Junk 垃圾箱,另外還有一個(gè)是我的郵箱中綁定的 139 的郵箱文件夾也顯示了出來。 $chk = (array) imap_mailboxmsginfo($mbox);imap_mailboxmsginfo() 返回的是當(dāng)前郵箱文件夾中的信息。從返回的字段可以看出,我們有 Unread 未讀郵件 34 封。新郵件 37 封,大小、獲取時(shí)間、郵箱信息等內(nèi)容。 讀取操作郵件最后就是我們的重頭戲了,如何下載讀取郵件以及進(jìn)行一些簡(jiǎn)單地操作。 $all = imap_search($mbox, "ALL");imap_search() 用于查找郵件,它的第二個(gè)參數(shù)是指定的字符串,比如這個(gè) ALL 就是返回所有的郵件信息,它還可以指定為 DELETED、UNSEEN 等許多內(nèi)容。具體的參數(shù)列表大家可以查閱相關(guān)的文檔。這個(gè)函數(shù)獲取的是郵件信息的所有的郵件編號(hào),其實(shí)可以看出來,它就是從 1 到 37 的數(shù)字編號(hào)。 讀取郵件imap_fetchheader() 和 imap_fetchbody() 分別就是根據(jù)郵件編號(hào)讀取郵件的頭信息和內(nèi)容信息。如果正常打印的話,它們的內(nèi)容都是經(jīng)過編碼的,也就是說我們不能直觀地看到具體的內(nèi)容信息。所以需要對(duì)頭文件進(jìn)行一個(gè) UTF-8 解碼的過程,郵件內(nèi)容則根據(jù)頭信息中的 Content-Transfer-Encoding 字段查看對(duì)應(yīng)的編碼類型進(jìn)行解碼。這里我們只演示了 base64 編碼的情況,其實(shí)它還有別的編碼格式,有興趣的同學(xué)可以自己查閱資料深入了解一下。 // 第一封郵件上述內(nèi)容就是第一封郵件的 header 信息,從信息內(nèi)容中可以看到 Subject 就是郵件的標(biāo)題,這是一封 QQ 郵箱系統(tǒng)發(fā)出的郵件。From 和 To 分別就是發(fā)件人和收件人的郵箱地址。其它比較重要的就是 Content-Type 和 Content-Transfer-Encoding 分別對(duì)應(yīng)著文檔類型、字符集編碼和轉(zhuǎn)換編碼類型。 不同的郵件的郵件頭會(huì)不一樣,我們這里只是展示了最簡(jiǎn)單的一種。 // rawBody郵件的內(nèi)容在使用 imap_base64() 解析之后就是簡(jiǎn)單地 HTML 格式的內(nèi)容。這和頭信息中的 Content-Type 是直接對(duì)應(yīng)的。imap_base64() 其實(shí)和 base64_decode() 并沒有什么區(qū)別,大家直接使用 base64_decode() 也是沒有問題的。當(dāng)然,前提是要判斷 Content-Transfer-Encoding 中是否使用了 base64 來對(duì)郵件內(nèi)容進(jìn)行了編碼。有的郵件中可能連這個(gè)字段都沒有。 復(fù)制、移動(dòng)、刪除郵件imap_mail_copy() 用于復(fù)制郵件,在這里,我們將第一封郵件復(fù)制到了草稿箱中,然后使用 imap_setflag_full() 將這封郵件標(biāo)記為已讀。從參數(shù)就可以看出來 Seem 就是已讀的意思,當(dāng)然它還有別的參數(shù),比如 Deleted 、 Draft 之類的內(nèi)容。 imap_delete() 函數(shù)用于刪除郵件,imap_mail_move() 用于移動(dòng)文件,調(diào)用這兩個(gè)函數(shù)都需要使用 imap_expunge() 來將操作同步到線上。 進(jìn)行完操作后,大家可以直接看一下線上的郵件是不是已經(jīng)產(chǎn)生了相應(yīng)的變化了。 總結(jié)IMAP 的知識(shí)我們就簡(jiǎn)單地入門學(xué)習(xí)一下,因?yàn)樵趯W(xué)習(xí)這塊內(nèi)容的時(shí)候我發(fā)現(xiàn)網(wǎng)上已經(jīng)有很多大神門封裝好的類可以讓我們直接復(fù)制下來使用。另外,它的功能非常豐富,還有很多函數(shù)并沒有介紹,比如說操作附件之類的功能,相信大家在自己的學(xué)習(xí)和使用過程中都會(huì)慢慢接觸到的。 測(cè)試代碼: https://github.com/zhangyue0503/dev-blog/blob/master/php/202012/source/6.PHP中的IMAP擴(kuò)展簡(jiǎn)單入門.php 參考文檔: https://www./manual/zh/book.imap.php |
|
|