關於IMAP協議——命令學習

1.CREATE <folder>
CREATE可以創建指定名字的新郵箱。郵箱名稱通常是帶路徑的文件夾全名。(有些IMAP客戶機使用郵件夾稱呼新郵箱)
C: A003 CREATE owatagusiam/                 /*創建一個新目錄owatagusiam*/
S: A003 OK CREATE completed
C: A004 CREATE owatagusiam/blurdybloop  
/* 在創建的目錄owatagusiam下創建一個名爲blurdybloop 的郵箱,當然可以省略第一步,直接A004 CREATE owatagusiam/blurdybloop ,表示在新的目錄owatagusiam 下創建了一個名爲blurdybloop 的郵箱*/         
S: A004 OK CREATE completed

2.DELETE <folder>
DELETE命令刪除指定名字的文件夾。文件夾名字通常是帶路徑的文件夾全名,當郵箱被刪除後,其中的郵件也不復存在。
C: A683 DELETE blurdybloop
S: A683 OK DELETE completed 
C: A684 DELETE foo
S: A684 NO Name "foo" has inferior hierarchical names
C: A685 DELETE foo/bar 
S: A685 OK DELETE Completed

3.RENAME <old folder><new folder>
RENAME命令可以修改文件夾的名稱,它使用兩個參數:當前郵箱名和新郵箱名,兩個參數的命名符合標準路徑命名規則。
C: A683 RENAME blurdybloop sarasoop
S: A683 OK RENAME completed
C: A684 RENAME stuff/junk newbox         /*把stuff目錄(文件夾)下的郵箱junk改名爲newbox*/
S: A684 OK RENAME Completed

4.LIST <BASE><template>
LIST命令用於列出郵箱中已有的文件夾,有點像操作系統的列目錄命令,有兩個參數,郵箱路徑參數BASE:表示用戶登陸目錄;第二個參數template:表示希望顯示的郵箱名。這個命令可以包含起始的路徑位置和需要列出的文件夾所符合的特徵,可以使用通配符"*"。
C: A101 LIST "" ""
S: * LIST (\Noselect) "/" ""
S: A101 OK LIST Completed
C: A102 LIST #news.comp.mail.misc ""
S: * LIST (\Noselect) "." #news.
S: A102 OK LIST Completed
C: A103 LIST /usr/staff/jones ""
S: * LIST (\Noselect) "/" /
S: A103 OK LIST Completed
C: A202 LIST ~/Mail/ %
S: * LIST (\Noselect) "/" ~/Mail/foo
S: * LIST () "/" ~/Mail/meetings
S: A202 OK LIST completed

5.APPEND <folder><attributes><date/time><size><mail data>
APPEND命令允許Client上載一個郵件到指定的Folder(文件夾/郵箱)中。命令中包含了新郵件的屬性、日期/時間、大小,隨後是郵件數據。
C: A003 APPEND saved-messages (\Seen) {310}
C: Date: Mon, 7 Feb 1994 21:52:25 -0800 (PST)
C: From: Fred Foobar <[email protected]>
C: Subject: afternoon meeting
C: To: [email protected]
C: Message-Id: <[email protected]>
C: MIME-Version: 1.0
C: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
C:
C: Hello Joe, do you think we can meet at 3:30 tomorrow?
C:
S: A003 OK APPEND completed

6.SELECT <folder>
SELECT命令讓Client選定某個郵箱(Folder),表示即將對該郵箱(Folder)內的郵件作操作。郵箱標誌的當前狀態也返回給了用戶,同時返回的還有一些關於郵件和郵箱的附加信息。
C: A142 SELECT INBOX
S: * 172 EXISTS
S: * 1 RECENT
S: * OK [UNSEEN 12] Message 12 is first unseen
S: * OK [UIDVALIDITY 3857529045] UIDs valid
S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)
S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited
S: A142 OK [READ-WRITE] SELECT completed

7.FETCH <mail id><datanames>
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等區段。這樣的嵌套是沒有限制的。下面我們通過例子來了解一下fetch具體是怎麼按區段下載的。
HEADER ([RFC-2822] header of the message)
TEXT ([RFC-2822] text body of the message) MULTIPART/MIXED
1 TEXT/PLAIN
2 APPLICATION/OCTET-STREAM
3 MESSAGE/RFC822
3.HEADER ([RFC-2822] header of the message)
3. TEXT ([RFC-2822] text body of the message) MULTIPART/MIXED
3.1 TEXT/PLAIN
3.2 APPLICATION/OCTET-STREAM
4 MULTIPART/MIXED
4.1 IMAGE/GIF
4.1. MIME ([MIME-IMB] header for the IMAGE/GIF)
4.2 MESSAGE/RFC822
4.2. HEADER ([RFC-2822] header of the message)
4.2. TEXT ([RFC-2822] text body of the message) MULTIPART/MIXED
4.2.1 TEXT/PLAIN
4.2.2 MULTIPART/ALTERNATIVE
4.2.2.1 TEXT/PLAIN
4.2.2.2 TEXT/RICHTEXT
如果我們需要取第一個附件,那麼命令就是:
C:a2 fetch 4 body[2];
取第三個區段的第一個子區段文本正文,命令就是:
C:a2 fetch 4 body[3.1];
取第四個區段的第二個子區段再嵌套的第一個子區段的文本正文,命令如下:
C:a2 fetch 4 body[4.2.1]
當然這個例子只是針對於一個特殊的郵件結構,一般的郵件應該都沒有這麼複雜的結構。
再 接下來我們再看看最後一個參數有什麼用?BODY[section]可以使用partial字段進行修改,該字段包含兩個用“.”隔開的數字,第一個數 字、是八進制表示的希望顯示的數據輸出起始位置,第二個數字是八進制表示希望顯示的數據長度。這項功能可以進一步設定輸出格式,例如,如果你希望顯示1號 郵件中郵件提的前1500個字符,可以使用命令:
FETCH 1 BODY[TEXT]<0.1500>
該命令取回郵件提的前1500個字符並定義爲TEXT,如果郵件體少於1500個字符則返回整個郵件體。
例:
C: 100 FETCH 3:5  BODY[header.fields (Date From Subject)]  /*冒號表示間隔的一個範圍:請求郵件從3到5之間所有郵件的Date:字段、 From:字段和 Subject:字段的信息*/
S: *  3  FETCH  (BODY[HEADER.FIELDS (“DATE” “FROM” “SUBJECT”)]  {112}
DATE: Tue, 14 Sep 1999 10:09:50 -500
From: [email protected]
Subject: This is the first test message
)
S: *  4  FETCH  (BODY[HEADER.FIELDS (“DATE” “FROM” “SUBJECT”)]  {113}
DATE: Tue, 14 Sep 1999 10:10:04 -500
From: [email protected]
Subject: This is the second test message
)
S: *  5  FETCH  (BODY[HEADER.FIELDS (“DATE” “FROM” “SUBJECT”)]  {112}
DATE: Tue, 14 Sep 1999 10:20:26 -500
From: [email protected]
Subject: This is the first test message
S: A100 OK FETCH completed
C: A101 FETCH BODY[TEXT]
S:* This is the fourth test message for IMAP
S: A101 OK FETCH completed
FETCH命令是IMAP協議裏最複雜的命令。FETCH的命令參數很多、很複雜,但基本的特徵是允許將郵件按照MIME結構拆解爲零碎的部件來提取。例如,可以利用FETCH命令提取郵件頭、某一個附件、或某一郵件附件頭部的某一字段,等等。
BODY.PEEK [<section>] <<partial>>:
在 缺省設置時,宏BODY[<section>]<<partial>>會設置郵件的\SEEN標誌。如果你想在不設 置\SEEN標誌的情況下閱讀郵件的部分信息,那麼可以將該宏替代BODY .PEEK[section],後者完成同前者一樣的功能但不會設置該郵件的\SEEN標誌。

8.STORE <mail id><new attributes>
STORE 命令用於修改指定郵件的屬性,包括給郵件打上已讀標記、刪除標記,等等。STORE命令當前只有兩個數據項類型可用,FLAGS:表示郵件的一組標誌; FLAGS.SLIENT,表示一組郵件的標誌,通過在兩種數據項前加上加號或者減號可以進一步改變它們的執行情況,加號表示數據項的值添加到郵件中,減 號表示將數據項的值從郵件中刪除。
C: A003 STORE 2:4 +FLAGS (\Deleted)      /*冒號表示間隔的一個範圍:給從2到4的郵件設置Deleted屬性*/
S: * 2 FETCH FLAGS (\Deleted \Seen)
S: * 3 FETCH FLAGS (\Deleted)
S: * 4 FETCH FLAGS (\Deleted \Flagged \Seen)
S: A003 OK STORE completed

9.CLOSE
CLOSE命令表示Client結束對當前Folder(文件夾/郵箱)的訪問,關閉郵箱該郵箱中所有標誌爲、DELETED的郵件就被從物理上刪除。CLOSE沒有命令參數。隨後可以SELECT另一Folder。
C: A341 CLOSE
S: A341 OK CLOSE completed

10.EXPUNGE
EXPUNGE命令在不關閉郵箱的情況下刪除所有的標誌爲、DELETED的郵件。EXPUNGE刪除的郵件將不可以恢復。 
C: A202 EXPUNGE
S: * 3 EXPUNGE
S: * 3 EXPUNGE
S: * 5 EXPUNGE
S: * 8 EXPUNGE
S: A202 OK EXPUNGE completed
LOGOUT
LOGOUT命令結束本次IMAP會話。
C: A023 LOGOUT
S: * BYE IMAP4rev1 Server logging out
S: A023 OK LOGOUT completed
(Server and client then close the connection)

11.EXAMINE <mailbox>
EXAMINE命令以只讀方式打開郵箱,參數是需要打開的郵箱的名字,使用EXAMINE命令打開的郵箱不允許對郵件進行改動,因此不能增加或刪除郵件的標誌。

12.SUBSCRIBE <mailbox>
SUBSCRIBE命令用來在客戶機的活動郵箱列表中增加一個郵箱,該命令只有一個參數,希望添加的郵箱名。
C: A114 SUBSCRIBE new/anotherbox
S: A114 OK SUBSCRIBE completed

13.UNSUBSCRIBE <mailbox>
UNSUBSCRIBE命令用來從活動列表中去掉一個郵箱,一個參數:希望去掉的郵箱名。
C: A115 UNSUBSCRIBE new/anotherbox
S: A115 OK SUBSCRIBE completed

14.LSUB <folder><mailbox>
LSUB命令修正了LIST命令,LIST返回用戶$HOME目錄下所有的文件,但LSUB命令只顯示那些使用SUBSCRIBE命令設置爲活動郵箱的文件。兩個參數:郵箱路徑和郵箱名。
C: A116 LSUB “” *
S:* LSUB () “/” stuff/junk
S:* LSUB () “/” neebox
S:* LSUB () “/” new/anotherbox
S: A116 OK LSUB completed

15.STATUS <mailbox>(<parameter1>  < parameter2>  ……<parameter5>)
STATUS命令查詢郵箱的當前狀態。第一個參數是需要查詢的郵箱名,第二個參數是客戶機需要查詢的項目列表(要查詢顯示的信息),當在圓括號中。STATUS可以在不使用SELECT命令(打開郵箱)或者EXAMINE(以只讀方式打開郵箱)前提下獲取郵箱的信息。
                     STATUS命令可以獲得的數據項
   項 目                 說  明
MESSAGE            郵箱中的郵件總數
RECENT              郵箱中標誌爲\RECENT的郵件數
UIDNEXT             可以分配給新郵件的下一個UID
UIDVALIDITY       郵箱的UID有效性標誌
UNSEEN              郵箱中沒有被標誌爲\UNSEEN的郵件數
C: A117 STATUS inbox  (message recent unseen)
S:* STATUS inbox (MESSAGE 1 RECENT 0 UNSENN 0)
S: A117 OK STATUS completed
C: A118 STATUS newbox  (message recent unseen)
S:* STATUS inbox (MESSAGE 1 RECENT 0 UNSENN 2)
S: A118 OK STATUS completed

16.CHECK 
CHECK命令用來在郵箱設置一個檢查點。沒有參數。就是IMAP中的sync命令。任何未完成的操作,例如從服務器內存向硬盤寫數據,都將會被做完以保持郵箱的一致性狀態。該命令確保乃村中的磁盤緩衝數據都被寫到了磁盤上。

17.SEARCH [CHARSET specification] (search criteria)
命 令可以根據搜索條件在處於活動狀態的郵箱中搜索郵件,然後顯示匹配的郵件編號。字符集標誌參數[CHARSET specification]由CHARSET和註冊的字符集標誌符組成,缺省的標誌符是US-ASCⅡ,所以該參數長省略。search criteria:查詢條件參數,明確查詢的關鍵字和值。查詢關鍵字有幾十種。
C: A119 SEARCH header subject another
S: SEARCH 1 2
S:* A119 OK SEARCH completed
C: A120 SEARCH header subject another
S: *SEARCH 2
S: A120 OK SEARCH completed
C: A121 SEARCH UNSEEN
S: *SEARCH 1 2
S: A120 OK SEARCH completed
以上每個例子都在郵件頭的Subject:字段中查詢一個不同的單詞。服務器返回條件的郵件號列表,如果沒有匹配郵件則返回不帶UID的SEARCH單詞。

18.COPY <mail id><mailboxname>
COPY命令可以把郵件從一個郵箱複製到另一個郵箱,兩個參數:mail id是希望從活動郵箱中複製的郵件的標號,mailboxname是希望郵件被複制到的郵箱。
IAMP沒有定義移動郵件的命令,移動操作相當於先把郵件複製到新郵箱中,然後對源郵箱中的郵件設置\DELETED標誌。下一次執行檢查點過後,新郵箱中的郵件被刪除,新郵件就被顯示出來。

19.UID
UID 命令和FETCH、COPY、STORE命令或者SEARCH命令一起使用,它允許這些命令使用郵件的UID號而不是在郵箱中的順序號。UID號是唯一標 識郵件系統中郵件的32位證書。通常這些命令都使用順序號來標識郵箱中的郵件,使用UID可以使IMAP客戶機記住不同IMAP會話中的郵件。

20.CAPABILITY
CAPABILITY命令請求返回IMAP服務器支持的功能列表,服務器收到客戶機發送的CAPABILITY命令後將返回該服務器所支持的功能。無參數。
C: A122 CAPABILITY
S:*A122 CAPABILITY IMAP4 IMAP4REVl NAMESPACE IDLE SCAN SORT   MAILBOX
--REFERRALS [ic:ccc] LOGIN-REFERRALS AUTH=LOGIN THREAD=
ORDERDSUBJECT
S: A122 OK CAPABILITY completed

21.NOOP
NOOP命令什麼也不做,用來向服務器發送自動命令,防止因長時間處於不活動狀態而導致連接中斷,服務器對該命令的響應始終爲肯定。無參數。

22.LOGOUT
LOGOUT命令使當前登陸用戶退出登陸並關閉所有打開的郵箱,任何做了\DELETED標誌的郵件都將在這個時候被刪除。

這裏不是所有的命令都列出來了,沒有列出來的命令如果需要的可以去參考RFC3501。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章