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的狀態圖如下:
這里使用telnet命令來對126郵箱進行操作參數分別是郵件服務器地址和端口(143)如果是SSL的話連993
capability命令請求服務器支持的功能列表,從這返回可見126郵箱不支持AUTHENTICATE功能的。
noop命令什么也不做,用來向服務器發送自動命令,防止因長時間處於不活動狀態而導致連接中斷
使用STARTTLS命令可以加密傳輸郵件內容,因為我使用的是telnet不支持加密傳輸,所以使用明文登錄。
不過在IMAP協議中要求“
”
登錄成功后狀態變為authenticated。
select 命令選擇一個郵箱,如果成功則狀態變為selected。此時是可對郵箱進行讀寫操作的。
examine命令和select命令效果一樣,返回的內容也類似,區別在於examine是只讀的。
create命令創建文件夾
rename命令能夠重命名
delete 刪除指定文件夾和其所有郵件
subscribe 指定郵箱為活動的
可以通過lsub查看活動郵箱
unsubscribe取消訂閱活動郵箱
list命令列出符合條件的郵箱,第一個參數是基址,第二個是郵箱名,可使用通配符。
status顯示指定郵箱的指定信息,該命令不會改變當前郵箱的選中狀態。
append命令添加一個新郵件到指定文件夾中
check命令用來在郵箱設置一個檢查點。沒有參數。就是IMAP中的sync命令。任何未完成的操作,例如從服務器內存向硬盤寫數據,都將會被做完以保持郵箱的一致性狀態。該命令確保乃村中的磁盤緩沖數據都被寫到了磁盤上。
close命令取消當前選中狀態,變回authenticated
expunge命令刪除所有flags中有deleted標記的郵件
search命令可以根據搜索條件在活動狀態的郵箱中搜索郵件,並返回郵件號。搜索的關鍵字有如下幾種:
搜索標題或者正文中包含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命令退出系統