IMAP命令与分析
https://www.cnblogs.com/crystalray/p/3304688.html
Internet Mail Access Protocol(縮寫為IMAP,以前稱作交互郵件訪問協(xié)議(interactive mail access protocol))IMAP是斯坦福大學(xué)在1986年開發(fā)的研發(fā)的一種郵件獲取協(xié)議。它的主要作用是郵件客戶端(例如MS Outlook Express)可以通過這種協(xié)議從郵件服務(wù)器上獲取郵件的信息,下載郵件等。當(dāng)前的權(quán)威定義是RFC3501。IMAP協(xié)議運(yùn)行在TCP/IP協(xié)議之上,使用的端口是143。它與POP3協(xié)議的主要區(qū)別是用戶可以不用把所有的郵件全部下載,可以通過客戶端直接對(duì)服務(wù)器上的郵件進(jìn)行操作。
具體協(xié)議內(nèi)容可以查閱:http://www.faqs.org/rfcs/rfc3501.html?中文版:http://blog.csdn.net/qqnnhhbb/article/details/6428681
與POP3協(xié)議類似,IMAP(Internet消息訪問協(xié)議)也是提供面向用戶的郵件收取服務(wù)。常用的版本是IMAP4。IMAP4改進(jìn)了POP3的不足,用戶可以通過瀏覽信件頭來(lái)決定是否收取、刪除和檢索郵件的特定部分,還可以在服務(wù)器上創(chuàng)建或更改文件夾或郵箱,它除了支持POP3協(xié)議的脫機(jī)操作模式外,還支持聯(lián)機(jī)操作和斷連接操作。它為用戶提供了有選擇的從郵件服務(wù)器接收郵件的功能、基于服務(wù)器的信息處理功能和共享信箱功能。IMAP4的脫機(jī)模式不同于POP3,它不會(huì)自動(dòng)刪除在郵件服務(wù)器上已取出的郵件,其聯(lián)機(jī)模式和斷連接模式也是將郵件服務(wù)器作為“遠(yuǎn)程文件服務(wù)器”進(jìn)行訪問,更加靈活方便。
支持連接和斷開兩種操作模式。當(dāng)使用POP3時(shí),客戶端只會(huì)連接在服務(wù)器上一段的時(shí)間,直到它下載完所有新信息,客戶端即斷開連接。在IMAP中,只要用戶界面是活動(dòng)的和下載信息內(nèi)容是需要的,客戶端就會(huì)一直連接在服務(wù)器上。對(duì)于有很多或者很大郵件的用戶來(lái)說(shuō),使用IMAP4模式可以獲得更快的響應(yīng)時(shí)間。支持多個(gè)客戶同時(shí)連接到一個(gè)郵箱。POP3協(xié)議假定郵箱當(dāng)前的連接是唯一的連接。相反,IMAP4協(xié)議允許多個(gè)用戶同時(shí)訪問郵箱同時(shí)提供一種機(jī)制讓客戶能夠感知其他當(dāng)前連接到這個(gè)郵箱的用戶所做的操作。支持訪問消息中的MIME部分和部分獲取。幾乎所有的Internet郵件都是以MIME格式傳輸?shù)摹IME允許消息包含一個(gè)樹型結(jié)構(gòu),這個(gè)樹型結(jié)構(gòu)的葉子節(jié)點(diǎn)都是單一內(nèi)容類型而非葉子節(jié)點(diǎn)都是多塊類型的組合。IMAP4協(xié)議允許客戶端獲取任何獨(dú)立的MIME部分和獲取信息的一部分或者全部。這些機(jī)制使得用戶無(wú)需下載附件就可以瀏覽消息內(nèi)容或者在獲取內(nèi)容的同時(shí)瀏覽。支持在服務(wù)器保留消息狀態(tài)信息。通過使用在IMAP4協(xié)議中定義的標(biāo)志客戶端可以跟蹤消息狀態(tài),例如郵件是否被讀取,回復(fù),或者刪除。這些標(biāo)識(shí)存儲(chǔ)在服務(wù)器,所以多個(gè)客戶在不同時(shí)間訪問一個(gè)郵箱可以感知其他用戶所做的操作。支持在服務(wù)器上訪問多個(gè)郵箱。IMAP4客戶端可以在服務(wù)器上創(chuàng)建,重命名,或刪除郵箱(通常以文件夾形式顯現(xiàn)給用戶)。支持多個(gè)郵箱還允許服務(wù)器提供對(duì)于共享和公共文件夾的訪問。支持服務(wù)器端搜索。IMAP4提供了一種機(jī)制給客戶使客戶可以要求服務(wù)器搜索符合多個(gè)標(biāo)準(zhǔn)的信息。在這種機(jī)制下客戶端就無(wú)需下載郵箱中所有信息來(lái)完成這些搜索。支持一個(gè)定義良好的擴(kuò)展機(jī)制。吸取早期Internet協(xié)議的經(jīng)驗(yàn),IMAP的擴(kuò)展定義了一個(gè)明確的機(jī)制。很多對(duì)于原始協(xié)議的擴(kuò)展已被提議并廣泛使用。無(wú)論使用POP3還是IMAP4來(lái)獲取消息,客戶端使用SMTP協(xié)議來(lái)發(fā)送。郵件客戶可能是POP客戶端或者IMAP客戶端,但都會(huì)使用SMTP。
?
IMAP的狀態(tài)圖如下:
(1)未預(yù)認(rèn)證的連接(OK歡迎) (2)預(yù)認(rèn)證的連接(PREAUTH歡迎) (3)被拒絕的連接(BYE歡迎) (4)成功LOGIN或者AUTHENTICATE命令 (5)成功的SELECT或者EXAMINE命令 (6)CLOSE命令,或者失敗的SELECT、EXAMINE命令 (7)LOGOUT命令,服務(wù)器關(guān)閉,或者連接已關(guān)閉
?
這里使用telnet命令來(lái)對(duì)126郵箱進(jìn)行操作參數(shù)分別是郵件服務(wù)器地址和端口(143)如果是SSL的話連993
?
capability命令請(qǐng)求服務(wù)器支持的功能列表,從這返回可見126郵箱不支持AUTHENTICATE功能的。
noop命令什么也不做,用來(lái)向服務(wù)器發(fā)送自動(dòng)命令,防止因長(zhǎng)時(shí)間處于不活動(dòng)狀態(tài)而導(dǎo)致連接中斷
使用STARTTLS命令可以加密傳輸郵件內(nèi)容,因?yàn)槲沂褂玫氖莟elnet不支持加密傳輸,所以使用明文登錄。
不過在IMAP協(xié)議中要求“
一個(gè)服務(wù)器實(shí)現(xiàn)體必須實(shí)現(xiàn)一個(gè)配置,認(rèn)證時(shí),要求: (1)STARTTLS命令已經(jīng)通過。 或者 (2)其它保護(hù)會(huì)話防密碼竊聽的機(jī)制已經(jīng)提供。 或者 (3)以下措施已采用: (a)LOGINDISABLED功能被通報(bào),且使用簡(jiǎn)單文本密碼的[SASL]機(jī)制(如,PLAIN)沒在功能列表中通報(bào)。 且 (b)AUTHENTICATE命令返回一個(gè)錯(cuò)誤,即使密碼是正確的。 (c)AUTHENTICATE命令返回使用簡(jiǎn)單文本密碼的所有[SASL]機(jī)制的一個(gè)錯(cuò)誤,即使密碼是正確的。 針對(duì)一個(gè)失敗的LOGIN命令的一個(gè)服務(wù)器錯(cuò)誤郵件不應(yīng)當(dāng)指明該用戶名,對(duì)于該密碼,是無(wú)效的。”
登錄成功后狀態(tài)變?yōu)閍uthenticated。
select 命令選擇一個(gè)郵箱,如果成功則狀態(tài)變?yōu)閟elected。此時(shí)是可對(duì)郵箱進(jìn)行讀寫操作的。
examine命令和select命令效果一樣,返回的內(nèi)容也類似,區(qū)別在于examine是只讀的。
create命令創(chuàng)建文件夾
rename命令能夠重命名
delete 刪除指定文件夾和其所有郵件
subscribe 指定郵箱為活動(dòng)的
可以通過lsub查看活動(dòng)郵箱
unsubscribe取消訂閱活動(dòng)郵箱
list命令列出符合條件的郵箱,第一個(gè)參數(shù)是基址,第二個(gè)是郵箱名,可使用通配符。
status顯示指定郵箱的指定信息,該命令不會(huì)改變當(dāng)前郵箱的選中狀態(tài)。
append命令添加一個(gè)新郵件到指定文件夾中
check命令用來(lái)在郵箱設(shè)置一個(gè)檢查點(diǎn)。沒有參數(shù)。就是IMAP中的sync命令。任何未完成的操作,例如從服務(wù)器內(nèi)存向硬盤寫數(shù)據(jù),都將會(huì)被做完以保持郵箱的一致性狀態(tài)。該命令確保乃村中的磁盤緩沖數(shù)據(jù)都被寫到了磁盤上。
close命令取消當(dāng)前選中狀態(tài),變回authenticated
expunge命令刪除所有flags中有deleted標(biāo)記的郵件
search命令可以根據(jù)搜索條件在活動(dòng)狀態(tài)的郵箱中搜索郵件,并返回郵件號(hào)。搜索的關(guān)鍵字有如下幾種:
ALL 郵件中所有郵件;ANDing的默認(rèn)初始關(guān)鍵詞。 ANSWERED 帶有/Answered標(biāo)記位的郵件。 BCC <string> 在信封結(jié)構(gòu)的BCC域包含有指定字符串的郵件。 BEFORE?<date> 實(shí)際日期(忽視時(shí)間和時(shí)區(qū))早于指定日期的郵件。 BODY <string> 在郵件的主體域包含有指定字符串的郵件。 CC <string> 在信封結(jié)構(gòu)的CC域包含有指定字符串的郵件。 DELETED 帶有/Deleted標(biāo)記位的郵件。 DRAFT 帶有/Draft標(biāo)記位的郵件。 FLAGGED 帶有/Flagged標(biāo)記位的郵件。 FROM <string> 在信封結(jié)構(gòu)的FROM域包含有指定字符串的郵件。 HEADER?<field-name>?<string> 帶有一個(gè)含指定field-name([RFC-2822]中定義)的頭部、且在該頭部(它跟在colon之后)的文本中包含指定字符串的郵 件。如果將要檢索的字符串(參數(shù)中的string)長(zhǎng)度為零,那么,它將匹配帶有一個(gè)含指定field-name、內(nèi)容可有可無(wú)的頭部行的所有郵件。 KEYWORD?<flag> 帶有指定關(guān)鍵詞標(biāo)記位的郵件。 LARGER?<n> 帶有一個(gè)[RFC-2822](定義)的、大于指定字節(jié)數(shù)的大小的郵件。 NEW 帶有/Recent標(biāo)記位,但不帶有/Seen標(biāo)記的郵件。它在功能上等效于“(RECENT?UNSEEN)”。 NOT <search-key> 不符合指定檢索關(guān)鍵詞的郵件。 OLD 不帶有/Recent標(biāo)記位的郵件。它在功能上等效于“NOT?RECENT”(與“NOT?NEW”相反)。 ON <date> 實(shí)際日期(忽視時(shí)間和時(shí)區(qū))在指定日期的郵件。 OR <search-key1>?<search-key2> 符合任意一個(gè)檢索關(guān)鍵詞的郵件。 RECENT 帶有/Recent標(biāo)記位的郵件。 SEEN 帶有/Seen標(biāo)記位的郵件。 SENTBEFORE?<date> [RFC-2822]Date:?header(忽視時(shí)間和時(shí)區(qū))早于指定日期的郵件。 SENTON?<date> [RFC-2822]Date:?header?(忽視時(shí)間和時(shí)區(qū))在指定日期的郵件。 SENTSINCE?<date> [RFC-2822]Date:?header?(忽視時(shí)間和時(shí)區(qū))在指定日期或者晚于指定日期的郵件。 SINCE?<date> 實(shí)際日期(忽視時(shí)間和時(shí)區(qū))在指定日期或者晚于指定日期的郵件。 SMALLER?<n> 帶有一個(gè)[RFC-2822]的、小于指定字節(jié)數(shù)大小的郵件。 SUBJECT?<string> 在信封結(jié)構(gòu)的SUBJECT域含有指定字符串的郵件。 TEXT <string> 在郵件的頭部或者主體含有指定字符串的郵件。 TO?<string> 在信封結(jié)構(gòu)的TO域含有指定字符串的郵件。 UID?<sequence?set> 帶有指定唯一標(biāo)識(shí)符集相應(yīng)的唯一標(biāo)識(shí)符的郵件。序列集順序排列是允許的。 UNANSWERED 不帶有/Answered標(biāo)記位的郵件。 UNDELETED 不帶有/Deleted標(biāo)記位的郵件。 UNDRAFT 不帶有/Draft標(biāo)記位的郵件。 UNFLAGGED 不帶有/Flagged標(biāo)記位的郵件。 UNKEYWORD?<flag> 不帶有指定關(guān)鍵詞標(biāo)記位的郵件。 UNSEEN 不帶有/Seen標(biāo)記位的郵件。 ? 搜索從2013年1月1日到2013年5月1日的郵件
搜索標(biāo)題或者正文中包含test字符串的郵件
?
FETCH 命令用于讀取郵件的文本信息,且僅用于顯示的目的。包含兩個(gè)參數(shù),messageset:表示希望讀取的郵件號(hào)列表,IAMP服務(wù)器郵箱中的每個(gè)郵件都有 一個(gè)唯一的ID標(biāo)識(shí),(郵件號(hào)列表參數(shù)可以是一個(gè)郵件號(hào),也可以是由逗號(hào)分隔的多個(gè)郵件號(hào),或者由冒號(hào)間隔的一個(gè)范圍),IMAP服務(wù)器返回郵件號(hào)列表中 全部郵件的指定數(shù)據(jù)項(xiàng)內(nèi)容。
數(shù)據(jù)名參數(shù)確定能夠被獨(dú)立返回的郵件的一部分,下面我們看看各參數(shù)返回的郵件信息:
ALL:只返回按照一定格式的郵件摘要,包括郵件標(biāo)志、RFC822.SIZE、自身的時(shí)間和信封信息。IMAP客戶機(jī)能夠?qū)?biāo)準(zhǔn)郵件解析成這些信息并顯示出來(lái)。
BODY:只返回郵件體文本格式和大小的摘要信息。IMAP客戶機(jī)可以識(shí)別這些細(xì)膩,并向用戶顯示詳細(xì)的關(guān)于郵件的信息。其實(shí)是一些非擴(kuò)展的BODYSTRUCTURE的信息。
FAST:只返回郵件的一些摘要,包括郵件標(biāo)志、RFC822.SIZE、和自身的時(shí)間。
FULL:同樣的還是一些摘要信息,包括郵件標(biāo)志、RFC822.SIZE、自身的時(shí)間和BODYSTRUCTURE的信息。
BODYSTRUCTUR: 是郵件的[MIME-IMB]的體結(jié)構(gòu)。這是服務(wù)器通過解析[RFC-2822]頭中的[MIME-IMB]各字段和[MIME-IMB]頭信息得出來(lái) 的。包括的內(nèi)容有:郵件正文的類型、字符集、編碼方式等和各附件的類型、字符集、編碼方式、文件名稱等等。
ENVELOPE:信息的信封結(jié)構(gòu)。是服務(wù)器通過解析[RFC-2822]頭中的[MIME-IMB]各字段得出來(lái)的,默認(rèn)各字段都是需要的。主要包括:自身的時(shí)間、附件數(shù)、收件人、發(fā)件人等。
FLAGS:此郵件的標(biāo)志。
INTERNALDATE:自身的時(shí)間。
RFC822.SIZE:郵件的[RFC-2822]大小
RFC822.HEADER:在功能上等同于BODY.PEEK[HEADER],
RFC822:功能上等同于BODY[]。
RFC822.TEXT:功能上等同于BODY[TEXT]
UID:返回郵件的UID號(hào),UID號(hào)是唯一標(biāo)識(shí)郵件的一個(gè)號(hào)碼。
BODY[section] <<partial>>:返回郵件的中的某一指定部分,返回的部分用section來(lái)表示,section部分包含的信息通常是 代表某一部分的一個(gè)數(shù)字或者是下面的某一個(gè)部分:HEADER, HEADER.FIELDS, HEADER.FIELDS.NOT, MIME, and TEXT。如果section部分是空的話,那就代表返回全部的信息,包括頭信息。
BODY[HEADER]返回完整的文件頭信息。
BODY[HEADER.FIELDS ()]:在小括號(hào)里面可以指定返回的特定字段。
BODY[HEADER.FIELDS.NOT ()]:在小括號(hào)里面可以指定不需要返回的特定字段。
BODY[MIME]:返回郵件的[MIME-IMB]的頭信息,在正常情況下跟BODY[HEADER]沒有區(qū)別。
BODY[TEXT]:返回整個(gè)郵件體,這里的郵件體并不包括郵件頭。
現(xiàn)在我們遇到了一個(gè)問題,如果我們要單獨(dú)提取郵件的附件怎么辦?
通過以上的命令我們是無(wú)法做到的,但是我們別忘了在section部分還有其他的方式可以來(lái)表示我們要提取的郵件的部分,那就的通過區(qū)段數(shù)來(lái)表示。那下面就讓我們來(lái)看看什么是區(qū)段數(shù)。
每 個(gè)郵件都至少有一個(gè)區(qū)段數(shù),Non-[MIME-IMB]型的郵件和non-multipart [MIME-IMB]的郵件是沒有經(jīng)過MIME編碼之后的信息的,那這樣的信息只有一個(gè)區(qū)段數(shù)1。多區(qū)段型的信息被編排成一個(gè)連續(xù)的區(qū)段數(shù),這和實(shí)際信息 里出現(xiàn)的是一樣的。如果一個(gè)特定的區(qū)段有類型信息或者是多區(qū)段的,一個(gè)MESSAGE/RFC822類型的區(qū)段也含有嵌套的區(qū)段數(shù),這些區(qū)段數(shù)是指向這些 信息區(qū)段的信息體的。
說(shuō)了那么多拗口的,現(xiàn)在我們講的更簡(jiǎn)單易懂一些。在一個(gè)郵件體里面,區(qū)段數(shù)1代表的郵件的正文,區(qū)段數(shù)二代表的是第一個(gè)附 件,區(qū)段數(shù)三代表的是第二個(gè)附件,以此類推。在這些區(qū)段里,如果有哪個(gè)區(qū)段又是多區(qū)段的,比如2區(qū)段的內(nèi)容格式是mulipart或者是 MESSAGE/RFC822類型的,那么這個(gè)區(qū)段又嵌套了多個(gè)子區(qū)段,嵌套的各子區(qū)段是用2.1,2.2……等等表示,類似,如果2.1又有嵌套,那么 還會(huì)有2.1.1,2.1.2等區(qū)段。這樣的嵌套是沒有限制的。
?
抓取431號(hào)郵件的摘要
抓取430到433號(hào)郵件的日期和主題
抓取433號(hào)郵件的附件的前128字節(jié)
?
store命令用于修改指定郵件的屬性,包括給郵件打上已讀標(biāo)記、刪除標(biāo)記,等等。
copy命令將制定郵件拷貝到指定郵箱中
uid命令可以將郵件號(hào)為條件的命令轉(zhuǎn)為唯一標(biāo)示符來(lái)表示
logout命令退出系統(tǒng)
轉(zhuǎn)載于:https://www.cnblogs.com/onelikeone/p/7865580.html
總結(jié)
- 上一篇: GANs的回顾
- 下一篇: thinkphp $this-displ