1. 程式人生 > >IMAP協議備註

IMAP協議備註

【參考資料】
【1】https://tools.ietf.org/html/rfc3501

一 基本概念
  1. IMAP(Internet Mail Access Protocal) Internet 郵件訪問協議,RFC3501定義,用於郵件客戶端(如outlook等)從郵件伺服器獲取、下載郵件資訊。
  2. IMAP基於TCP協議,預設監聽143埠。
  3. IMAP採用命令、響應的互動,使用多行文字的形式,以CRLF換行;這點基本與POP3相同。

二 郵件屬性
郵件標識

在IMAP中,郵件以兩種方式來唯一標識:

  1. 唯一識別符號: 分配給每個的32位UID,與UID驗證值一起組成一個64位的唯一識別符號,該識別符號在會話中不允許改變。UID將會隨著郵件的收取不斷遞增,客戶端可以基於此判斷是否存在新郵件,類似時間戳。
  2. 郵件序列號: 郵件在郵箱中的相對位置,從1開始,當出現郵件刪除時,該序號會重排。
郵件標記

每個郵件可以增加一個字串,包括多個以\開頭的標籤字串來標記郵件的某些屬性,如下:

標籤 作用
/Seen 郵件已讀
/Answered 郵件已經回覆
/Flagged 緊急或特別關注
/Deleted 刪除狀態
/Draft 草稿狀態
/Recent 新到達

三 狀態流程

當IMAP客戶端和服務端建立連線,則處於如下四個狀態之一:

狀態 作用
未認證狀態 要求客戶端提供一個認證證書,每次新連線除非已經“預認證”,否則則處於該狀態
認證狀態 完成認證,可以選擇郵箱
選中狀態 已經選擇一個郵箱並登陸
登出狀態 客戶端登出

在這裡插入圖片描述


四 主要客戶端命令

注意: 客戶端發每條命令,前面要帶一個字母數字組成的標籤,類似“A01”

任何狀態

4.1 CAPABILITY
引數: 無
功能: 請求伺服器支援的功能列表
例子:

C: abcd CAPABILITY
S: * CAPABILITY IMAP4rev1 STARTTLS AUTH=GSSAPI LOGINDISABLED
S: abcd OK CAPABILITY completed

4.2 NOOP
引數: 無
功能: 請求返回一個空訊息
例子:

C: a002 NOOP
S: a002 OK NOOP completed

4.3 LOGOUT
引數: 無
功能: 客戶端登出
例子:

C: A023 LOGOUT
S: * BYE IMAP4rev1 Server logging out
S: A023 OK LOGOUT completed
注:此時服務端、客戶端斷開連線。

未認證狀態

4.4 STARTTLS
引數: 無
功能: 觸發一個TLS會話
例子:

C: a001 CAPABILITY
S: * CAPABILITY IMAP4rev1 STARTTLS LOGINDISABLED
S: a001 OK CAPABILITY completed
C: a002 STARTTLS
S: a002 OK Begin TLS negotiation now
注: 此時雙方開始協商構建TLS會話,之後的資料將在TLS層上互動

一旦“TLS”開始,客戶端必須丟棄關於伺服器功能的快取資訊,且應當重新發出CAPABILITY命令。這對保護免受修改功能列表指向STARTTLS的中間者攻擊是有必要的
C: a003 CAPABILITY
S: * CAPABILITY IMAP4rev1 AUTH=PLAIN
S: a003 OK CAPABILITY completed
C: a004 LOGIN joe password
S: a004 OK LOGIN completed

4.5 AUTHENTICATE
引數: 認證機制名稱
功能: 進行認證操作,該操作完成則進入“認證狀態”
例子: 略

4.6 LOGIN
引數: 使用者名稱、密碼
功能: 登入,登入完成後進入“認證狀態”
例子: 見 4.4 CAPABILITY 例子

認證狀態

4.7 SELECT
引數: 郵箱名稱
功能: 選擇某個郵件,從而可以訪問其中的郵件
例子:

C: A142 SELECT INBOX
S: * 172 EXISTS
S: * 1 RECENT
S: * OK [UNSEEN 12] Message 12 is first unseen
S: * OK [UIDVALIDITY 3867529045] UID valid
S: * OK [UIDNEXT 4392] Predicted next UID
S: * FLAGS (/Answered /Flagged /Deleted /Seen /Draft)
S: * OK [PERMANENTFLAGS (/Deleted /Seen /*)] Limited
S: A142 OK [READ-WRITE] SELECT completed

備註: next UID被客戶端用來推測是否收到新郵件。

4.8 EXAMINE
引數: 郵箱名稱
功能: 檢查郵箱,基本同SELECT
例子: 略

4.9 CREATE
引數: 郵箱名
功能: 建立一個郵箱
例子:

C: A003 CREATE owatagusiam/
S: A003 OK CREATE completed

4.10 DELETE
引數: 郵箱名
功能: 刪除一個郵箱
例子:

C: A683 DELETE blurdybloop
S: A683 OK DELETE completed
C: A684 DELETE foo
S: A684 NO Name “foo” has inferior hierarchical names

4.11 RENAME
引數: 當前郵箱名 新的郵箱名
功能: 重新命名一個郵箱
例子:

C: Z433 RENAME INBOX old-mail
S: Z433 OK RENAME completed

4.11 SUBSCRIBE(UNSUBSCRIBE)
引數: 郵箱名
功能: 將郵箱加入(取消加入)活動或訂閱郵箱列表
例子:

C: A002 SUBSCRIBE #news.comp.mail.mime
S: A002 OK SUBSCRIBE completed

4.12 LIST
引數: 第一個引數是 字首,第二個引數是 帶萬用字元的郵箱名
功能: 給出符合條件的郵箱名
例子:

C: A202 LIST ~/Mail/ %
S: * LIST (\Noselect) “/” ~/Mail/foo
S: * LIST () “/” ~/Mail/meetings
S: A202 OK LIST completed

4.13 LSUB
引數: 第一個引數是 字首,第二個引數是 帶萬用字元的郵箱名
功能: 給出符合條件的訂閱郵件名
例子:

C: A002 LSUB “#news.” “comp.mail.*”
S: * LSUB () “.” #news.comp.mail.mime
S: * LSUB () “.” #news.comp.mail.misc
S: A002 OK LSUB completed

4.14 APPEND
引數: 郵箱名,郵件資料等
功能: 上載一個郵件到某個郵箱內,包括這個新郵件的屬性、日期等
例子:

C: A003 APPEND saved-messages (\Seen) {310}
S: + Ready for literal data
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: Hello Joe, do you think we can meet at 3:30 tomorrow?
C:
S: A003 OK APPEND completed

選中狀態

4.15 CHECK
引數: 無
功能: 設定檢查點,用以保證郵箱資料的一致性
例子:

C: FXXZ CHECK
S: FXXZ OK CHECK Completed

4.16 CLOSE
引數: 無
功能: 關閉會話,回到”認證狀態“
例子:

C: A341 CLOSE
S: A341 OK CLOSE completed

4.17 EXPUNGE
引數: 無
功能: 永久刪除全部帶“刪除”標記位的郵件
例子:

C: A202 EXPUNGE
S: A202 OK EXPUNGE completed

4.17 SEARCH
引數: 根據協議定義的關鍵詞,包括狀態、時間、抄送人等等,此處不做羅列
功能: 檢索符合要求的郵件,返回郵件號
例子:

C: A282 SEARCH FLAGGED SINCE 1-Feb-1994 NOT FROM “Smith”
S: * SEARCH 2 84 882
S: A282 OK SEARCH completed
C: A283 SEARCH TEXT “string not in mailbox”
S: * SEARCH
S: A283 OK SEARCH completed
C: A284 SEARCH CHARSET UTF-8 TEXT {6}
C: XXXXXX
S: * SEARCH 43
S: A284 OK SEARCH completed

4.18 FETCH
引數: 包含兩個引數,一個是郵件序號列表,一個是郵件內容的包含範圍,如全部、文字含頭部、日期、主題,甚至多少位元組範圍的內容等等,此處不做羅列
功能: 根據引數要求返回具體郵件的文字資訊
例子:

C: A654 FETCH 2:4 (FLAGS BODY[HEADER.FIELDS (DATE FROM)])
S: * 2 FETCH …
S: * 3 FETCH …
S: * 4 FETCH …
S: A654 OK FETCH completed
備註: rfc文件此處省略的就是具體的返回內容

4.19 STORE
引數: 待修改的郵件列表,修改命令、修改的屬性
功能: 修改指定郵件的屬性
例子:

注:下例中給郵件增加了刪除屬性
C: A003 STORE 2:4 +FLAGS (\Deleted)
S: * 2 FETCH (FLAGS (\Deleted \Seen))
S: * 3 FETCH (FLAGS (\Deleted))
S: * 4 FETCH (FLAGS (\Deleted \Flagged \Seen))
S: A003 OK STORE completed