POP3協議規範(中文版) (轉)

worldblog發表於2007-12-26
POP3協議規範(中文版) (轉)[@more@]

POP3 郵局-版本3

1. 簡介

對於在上的比較小的結點,支援訊息傳輸(MTS)是不實際的。例如,一臺工作站可能不具有充足的資源允許SMTP和相當的本地傳送系統保持序駐留,並持續執行。同樣的,將一臺個人長時間連線在IP型別網路上的費用也是可觀的(結點缺少的資源被稱為“性”)。

雖然如此,在這樣的小結點上允許管理郵件是十分有用的,並且這些結點經常支援一個來管理郵件。為解決這一問題,能夠支援MTS的結點就為這些不能支援的結點提供了郵件功能。郵局協議-版本3就是使這樣的工作站可以用一種比較實用的方法來訪問儲存於伺服器上的儲存郵件。通常,這意味著工作站可以從伺服器上取得郵件,而伺服器為它暫時儲存郵件。

在下文中,客戶主機指的是利用POP3服務的主機,而伺服器主機指的是提供POP3服務的主機。

2. 簡單說明

在此文件中不指明客戶主機如何將郵件送入到傳送系統中去。但這裡有一個說明:當使用者代理需要將資訊送到傳送系統時,它在接力主機上建立SMTP連線(這些接力主機可以是POP3主機,也可以不是)。

 

3. 基本操作

初始時,伺服器透過偵聽TCP埠110開始POP3服務。當客戶主機需要使用服務時,它將與伺服器主機建立TCP連線。當連線建立後,POP3傳送確認訊息。客戶和POP3伺服器相互(分別)命令和響應,這一過程一直要持續到連線終止。

POP3命令由一個命令和一些引數組成。所有命令以一個CRLF對結束。命令和引數由可列印的ASCII字元組成,它們之間由空格間隔。命令一般是三到四個字母,每個引數卻可達40個字元長。

POP3響應由一個狀態碼和一個可能跟有附加資訊的命令組成。所有響應也是由CRLF對結束。現在有兩種狀態碼,“確定” ("+OK")和“失敗” ("-ERR")。

對於特定命令的響應是由許多字元組成的。在這些情況中,下面一一表述:在傳送第一行響應和一個CRLF之後,任何的附加資訊行傳送,他們也由CRLF對結束。當所有資訊傳送結束時,傳送最後一行,包括一個結束字元(十進位制碼46,也就是“.”)和一個CRLF對。如果資訊中的任何一行以結束字元開始,此行就是透過在那一行預先裝入結束而進行字元填充的。因此,多行響應由五個CRLF.CRLF 結束。當檢測多行響應時,客戶檢測以確認此行是否以結束字元開始。如果是的,而且其後的字元不是CRLF,此行的第一個字元(結束字元)將被拋棄;如果其後緊跟CRLF,從POP伺服器來的響應終止,包括.CRLF 的行也不被認為是多行響應的一部分了。

在生命週期中,POP3會話有幾個不同的狀態。一旦TCP連線被開啟,而且POP3伺服器傳送了確認資訊,此過程就進入了“確認”狀態。在此狀態中,客戶必須向POP3伺服器確認自己是其的客戶。一旦確認成功,伺服器就獲取與客戶郵件相關的資源,此時這一過程進入了“操作”狀態。在此狀態中,客戶提出服務,當客戶發出QUIT命令時,此過程進入了“”狀態。在此狀態中,POP3伺服器釋放在“操作”狀態中取得的資源,併傳送訊息,終止連線。

POP3伺服器可以擁有一個自動退出登入的記時器。此記時器必須至少可以記錄10分鐘。這樣從客戶傳送的訊息才可能重新整理此記時器。當記時器失效時,POP3會話並不進入“更新”狀態,而是關閉TCP連線,而且不刪除任何訊息,不向客戶傳送任何響應。

 

4. “確認”狀態

 

一時TCP連線由POP3客戶開啟,POP3伺服器傳送一個單行的確認。這個訊息可以是由CRLF結束的任何字元。例如,它可以是:

S: +OK POP3 server ready

 

注意:這個訊息是一個POP3應答。POP3伺服器應該給出一個“確定”響應作為確認。

此時POP3會話就進入了“確認”狀態。此時,客戶必須向伺服器證明它的身份。在文件中介紹兩種可能的處理機制,一種是USER和PASS命令,另一種是在後面要介紹的APOP命令。

用USER和PASS命令進行確認過程,客戶必須首先傳送USER命令,如果POP3伺服器以“確認”狀態碼響應,客戶就可以傳送PASS命令以完成確認,或者傳送QUIT命令終止POP3會話。如果POP3伺服器返回“失敗”狀態碼,客戶可以再傳送確認命令,或者傳送QUIT命令。

當客戶傳送了PASS命令後,伺服器根據USER和PASS命令的附加資訊決定是否允許訪問相應的儲存郵件。

一旦伺服器透過這些資料決定允許客戶訪問儲存郵件,伺服器會在郵件上加上排它鎖,以防止在進入“更新”狀態前對郵件的改變。如果成功獲得了排它鎖,伺服器返回一個“確認”狀態碼。會話進入“操作狀態”,同時沒有任何郵件被標記為刪除。如果郵件因為某種原因不能開啟(例如,排它鎖不能獲得,客戶不能訪問相應的郵件或者郵件不能進行語法分析),伺服器將返回“失敗”狀態碼。在返回“失敗”狀態碼後,伺服器會關閉連線。如果伺服器沒有關閉連線,客戶可以重新傳送確認命令,重新開始,或者傳送QUIT命令。

在伺服器開啟郵件後,它為每個訊息指定一個訊息號,並以八進位制表示每個訊息的長度。第一個訊息被指定為1,第二個訊息被指定為2,以此類推,第N個訊息被指定為N。在POP3命令和響應中,所以的訊息號和長度以十進位制表示。

下面是對上述三條命令的總結:

 

命令格式引數限制響應例子 USER name 指定的字串,這對伺服器至關重要僅在USER和PASS命令失敗後或在“確認”狀態中使用 +OK:有效郵箱;

-ERR:無效郵箱

C: USER mrose

S: +OK mrose is a real hy frood

...

C: USER frated

S: -ERR sorry, no box for frated here

PASS string 口令僅在“確認”狀態中USER命令成功後使用(因為此命令只有一個引數,因此空格不再作為分隔符,而作為口令的一部分) +OK:郵件鎖住並已經準備好;

-ERR無效口令或無法鎖住郵件

C: USER mrose

S: +OK mrose is a real hoopy frood

C: PASS secret

S: +OK mrose's maildrop has 2 messages (320 octets)

...

C: USER mrose

S: +OK mrose is a real hoopy frood

C: PASS secret

S: -ERR maildrop already locked

QUIT (無)(無) +OK C: QUIT

S: +OK dewey POP3 server signing off

 

 

5. “操作”狀態

 

一旦客戶向伺服器成功地確認了自己的身份,伺服器將鎖住並開啟相應的郵件,這時POP3會話進入“操作”狀態。現在客戶可以重複下面的POP3命令,對於每個命令伺服器都會返回應答。最後,客戶傳送QUIT命令,會話進入“更新”狀態。

下面是在“操作”狀態中可用的命令:

命令引數限制說明響應例子 STAT (無)僅在“操作”狀態下可用。伺服器以包括郵件資訊的響應做為“確認”。為簡化語法分析,所有的伺服器要求使用郵件列表的特定格式。“確認”響應由一個空格,以八進位制表示的郵件數目,一個空格和郵件大小。這是最小實現,高階的實現還需要別的資訊。

注意:被標記為刪除的信件不在此列。

+OK: nn mm C: STAT

S: +OK 2 320

LIST [msg] 信件數目(可選),如果出現,不包括標記為刪除的信件。僅在“操作”狀態下可用。如果給出了引數,且POP3伺服器返回包括上述資訊的“確認”,此行稱為資訊的“掃描表”。

如果沒有引數,伺服器返回“確認”響應,此響應便以多行給出。在初的+OK後,對於每個信件,伺服器均給出相應的響應。

為簡化語法分析,所有伺服器要求使用掃描表的特定格式。它包括空格,每個郵件的確切大小。這是最小實現,高階的實現還需要別的資訊。

注意:被標記為刪除的信件不在此列。

+OK:其後跟掃描表;

-ERR:無掃描。

C: LIST

S: +OK 2 messages (320 octets)

S: 1 120

S: 2 200

S: .

...

C: LIST 2

S: +OK 2 200

...

C: LIST 3

S: -ERR no such message, only 2 messages in maildrop

RETR msg 不包括標記為刪除的信件數目。僅在“操作”狀態下可用。如果伺服器返回“確認”,給出的響應是多行的。在初始的+OK後,伺服器傳送與給定資訊號對應的資訊,對於多行響應,注意位元組填充終止符。 +OK:訊息在其後;

-ERR:其後無訊息。

C: RETR 1

S: +OK 120 octets

S:

S: .

DELE msg 不包括標記為刪除的信件數目。僅在“操作”狀態下可用。伺服器將此信件標記為刪除,以後任何關於此信件的操作就會產生錯誤。伺服器在會話進入“更新”狀態前不會真正刪除此信件。 +OK:信件被刪除;

-ERR:無此信件。

C: DELE 1

S: +OK message 1 deleted

...

C: DELE 2

S: -ERR message 2 already deleted

NOOP (無)僅在“操作”狀態下可用。伺服器僅返回“確認”。 +OK C: NOOP

S: +OK

RSET (無)僅在“操作”狀態下可用。所有被標記為刪除的信件復位,伺服器返回“確認”。 +OK C: RSET

S: +OK maildrop has 2 messages (320個字元)

 

 

6.“更新”狀態

 

當客戶在“操作”狀態下傳送QUIT命令後,會話進入“更新”狀態。(注意:如果客戶在“確認”狀態下傳送QUIT後,會話並不進入“更新”狀態。)

如果會話因為QUIT命令以外的原因中斷,會話並不進入“更新”狀態,也不從伺服器中刪除任何信件。

命令引數限制說明響應例子 QUIT (無)(無)伺服器刪除所有標記為刪除的信件,然後釋放排它鎖,並返回這些操作的狀態碼。最後TCP連線被中斷。 +OK C: QUIT

S: +OK dewey POP3 server signing off (清空標記郵件)

...

C: QUIT

S: +OK dewey POP3 server signing off

 

 

7.可選的POP3命令

 

以上討論的命令是對POP3服務的最小實現。以下說明的可選命令允許客戶更方便地處理信件,這是一個比較一般的POP3服務實現。

命令引數限制說明響應例子 TOP msg n 一個是未被標記為刪除的信件數,另一個是非負數(必須提供)僅在“操作”狀態下使用。如果伺服器返回“確認”,響應是多行的。在初始的+OK後,伺服器傳送信件頭,一個空行將信件頭和信件體分開,對於多行響應要注意位元組填充終止符。

注意:如果客戶要求的行數比信件體中的行數大,伺服器會傳送整個信件。

+OK:其後有信件頭;

-ERR:其後無類似訊息。

C: TOP 1 10

S: +OK

S:

S: .

...

C: TOP 100 3

S: -ERR no such message

UIDL [msg] 信件數(可選)。如果給出信件數,不包括被標記為刪除的信件。僅在“操作”狀態下使用。如果給出了引數,且POP3伺服器返回包括上述資訊的“確認”,此行稱為資訊的“獨立-ID表”。

如果沒有引數,伺服器返回“確認”響應,此響應便以多行給出。在初的+OK後,對於每個信件,伺服器均給出相應的響應。此行叫做信件的“獨立-ID表”。

為簡化語法分析,所有伺服器要求使用獨立-ID表的特定格式。它包括空格和信件的獨立-ID。

信件的獨立-ID由0x21到0x7E字元組成,這個符號在給定的儲存郵件中不會重複。

注意:信件不包括被標記為刪除的信件。

+OK:其後是獨立-ID表;

-ERR:其後無類似信件。

C: UIDL

S: +OK

S: 1 whqtswO00WBw418f9t5JxYwZ

S: 2 QhdPYR:00WBw1Ph7x7

S: .

...

C: UIDL 2

S: +OK 2 QhdPYR:00WBw1Ph7x7

...

C: UIDL 3

S: -ERR no such message, only 2 messages in maildrop

APOP name digest 指定郵箱的字串和MD5摘要串。僅在POP3確認後的“確認”狀態中使用。通常,每個POP3會話均以USER/PASS互換開始。這導致了使用者名稱和口令在網路上的顯式傳送,這不會造成什麼危險。但是,許多客戶經常連線到服務檢查信件。通常間隔時間比較短,這就加大了洩密的可能性。

另一種提供“確認”過程的方法是使用APOP命令。

實現APOP命令的伺服器包括一個標記確認的時間戳。例如:在上使用APOP命令的語法為:,其中程式-ID是程式的十進位制的數,時鐘是系統時鐘的十進位制表示,主機名與POP3伺服器名一致。

客戶記錄下此時間戳,然後以送APOP命令。name語法和USER命令一致。Digest是採用MD5演算法產生的包括時間戳和共享金鑰的字串。此金鑰是客戶和伺服器共知的,應該注意保護此金鑰,如果洩密,任何人都能夠以使用者身份進入伺服器。

如果伺服器接到APOP命令,它驗證digest,如果正確,伺服器返回“確認”,進入“操作”狀態;否則,給出“失敗”並停留在“確認”狀態。

注意:共享金鑰的長度增加,解讀它的難度也相應增加,這個金鑰應該是長字串。

+OK:郵件鎖住並準備好;

-ERR:拒絕請求。

S: +OK POP3 server ready <1896.697170952@c.mtview.ca.us>

C: APOP mrose c4c9334bac560ecc979e58001b3e22fb

S: +OK maildrop has 1 message (369 octets)

在此例子中,共享金鑰 <1896.697170952@dbc.mtview.ca.us>tanstaaf由MD5演算法生成,它產生了digest值, c4c9334bac560ecc979e58001b3e22fb

 

 

8. POP3命令總結

 

基礎的POP3命令:

 

USER name 在“確認”狀態有效

PASS string

QUIT

 

STAT 在“操作”狀態有效

LIST [msg]

RETR msg

DELE msg

NOOP

RSET

 

QUIT 在“更新”狀態有效

 

可選的POP3命令:

 

APOP name digest 在“確認”狀態有效

 

TOP msg n 在“操作”狀態有效

UIDL [msg]

 

POP3 響應:

 

+OK

-ERR

 

注意:除了STAT,LIST和UIDL的響應外,其它命令的響應均為"+OK"和 "-ERR"。響應後的所有文字將被客戶略去。

 

9. POP3會話例項

S:

C:

S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us>

C: APOP mrose c4c9334bac560ecc979e58001b3e22fb

S: +OK mrose's maildrop has 2 messages (320 octets)

C: STAT

S: +OK 2 320

C: LIST

S: +OK 2 messages (320 octets)

S: 1 120

S: 2 200

S: .

C: RETR 1

S: +OK 120 octets

S:

S: .

C: DELE 1

S: +OK message 1 deleted

C: RETR 2

S: +OK 200 octets

S:

S: .

C: DELE 2

S: +OK message 2 deleted

C: QUIT

S: +OK dewey POP3 server signing off (maildrop empty)

C:

S:

 

10. 訊息格式

 

在會話過程中的訊息格式都假定與Inte文字訊息格式標準一致。應該注意的是,由於各個伺服器對於換行符的處理不同,因此計數不一定相同。通常,在“確認”狀態中,伺服器能夠以八進位制計算信件的大小。例如,如果在開啟儲存郵件時伺服器內部認定換行符代表一個字元,一般伺服器在計算它時作為兩個字元計。注意,以終止符開始的訊息行不被計數兩次,因為客戶將在接收到多行響應後刪除所有位元組填充。

 

11. 性考慮

可以推測,使用APOP命令可以提供會話期間的保護。相應的,同時實現PASS和APOP命令的伺服器只允許使用者以一種方式訪問;也就是說要麼使用USER/PASS組合,要麼使用APOP命令,不能同時使用兩個。

而且,注意隨著共享金鑰長度的增加,解讀的難度也就上升了。伺服器要提供使用者名稱時不給出任何響應,不給出任何暗示此使用者名稱是否正確。而口令卻在網路上顯式傳送;使用RETR和TOP命令在網路上顯式傳送信件。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-995831/,如需轉載,請註明出處,否則將追究法律責任。

相關文章