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