郵件服務常用SMTP、POP3、MIME等三種協議

  電子郵件因簡潔、方便,已成爲目前互聯網最成功的一種應用。互聯網上有成千上萬的郵件服務器爲用戶提供服務。每個服務器上有幾十至幾百萬個或更多的用戶郵箱,用戶通過用戶代理(如FoxMail、MS Express)收發郵件,郵件內容除通常的文字信息外,還可附加圖象、音頻、視頻等信息。
 
  保證郵件交換正常使用的是SMTP、POP3、MIME等協議。在郵件服務器上,一般使用文件系統來存儲用戶郵件。發送的服務器和接收的郵件服務器可以不是同一臺。同一域的郵件服務器可採用分佈式結構組成服務器羣。郵件服務器還可定義郵箱別名進行轉發。  

  1.SMTP(簡單郵件傳輸協議)

  1982年制定了SMTP(RFC 821)和郵件報文格式RFC 822。SMTP描述了兩個進程之間如何交換信息,郵件報文格式規定了郵件的具體格式。

  郵件由首部和主體構成,主體部分是郵件的內容,首部由關鍵字、冒號及關鍵信息組成,典型首部如下:

  Date:

  From: [email protected]

  To:[email protected]; [email protected]

  Subject: abcdefg

  CC: [email protected]

  BCC: [email protected]

  Reply-To:

  用SMTP收發郵件的過程爲:建立TCP連接(服務端口號25),傳送郵件,釋放連接。

  傳送郵件的命令:

  如果DATA命令被接收,接收方返回一個354 Intermediate應答,並認定以下的各行都是信件內容。當信件結尾收到並存儲後,接收者發送一個250 OK應答。因爲郵件是在傳送通道上發送,因此必須指明郵件內容結尾,以便應答對話可以重新開始。SMTP通過在最後一行僅發送一個句號來表示郵件內容的結束,在接收方,一個對用戶透明的過程將此符號過濾掉,以不影響正常的數據。

  HELO <SP> <domain> <CRLF>

  MAIL <SP> FROM:<reverse-path> <CRLF>

  RCPT <SP> TO:<forward-path> <CRLF>

  DATA <CRLF>

  RSET <CRLF>

  SEND <SP> FROM:<reverse-path> <CRLF>

  SOML <SP> FROM:<reverse-path> <CRLF>

  SAML <SP> FROM:<reverse-path> <CRLF>

  VRFY <SP> <string> <CRLF>

  EXPN <SP> <string> <CRLF>

  HELP [<SP> <string>] <CRLF>

  NOOP <CRLF>

  QUIT <CRLF>

  TURN <CRLF>

   

  傳送郵件的應答:

  500 格式錯誤,命令不可識別(此錯誤也包括命令行過長)

  501 參數格式錯誤

  502 命令不可實現

  503 錯誤的命令序列

  504 命令參數不可實現

  211 系統狀態或系統幫助響應

  214 幫助信息

  220 <domain> 服務就緒

  221 <domain> 服務關閉傳輸信道

  421 <domain> 服務未就緒,關閉傳輸信道(當必須關閉時,此應答可以作爲對任何命令的響應)

  250 要求的郵件操作完成

  251 用戶非本地,將轉發向<forward-path>

  450 要求的郵件操作未完成,郵箱不可用(例如,郵箱忙)

  550 要求的郵件操作未完成,郵箱不可用(例如,郵箱未找到,或不可訪問)

  451 放棄要求的操作;處理過程中出錯

  551 用戶非本地,請嘗試<forward-path>

  452 系統存儲不足,要求的操作未執行

  552 過量的存儲分配,要求的操作未執行

  553 郵箱名不可用,要求的操作未執行(例如郵箱格式錯誤)

  354 開始郵件輸入,以<CRLF>.<CRLF>結束

  554 操作失敗

   

  例子:

  R: 220 BBN-UNIX.ARPA Simple Mail Transfer Service Ready
S: HELO USC-ISIF.ARPA

  R: 250 BBN-UNIX.ARPA

  S: MAIL FROM:<[email protected]>

  R: 250 OK

  S: RCPT TO:<[email protected]>

  R: 250 OK

  S: RCPT TO:<[email protected]>

  R: 550 No such user here

  S: RCPT TO:<[email protected]>

  R: 250 OK

  S: DATA

  R: 354 Start mail input; end with <CRLF>.<CRLF>

  S: Blah blah blah...

  S: ...etc. etc. etc.

  S: .

  R: 250 OK

  S: QUIT

  R: 221 BBN-UNIX.ARPA Service closing transmission channel

   

  2.POP3(郵局協議)

  1984年制定了POP(RFC 918),以後完善爲POP3(RFC 1939)。用取郵件的過程爲:建立TCP連接(服務端口號110),取郵件,釋放連接。命令與應答類似於SMTP。見下表:

  命令格式

  參數

  響應

  USER name

  指定郵箱的字符串,這對服務器至關重要

  +OK:有效郵箱;

  -ERR:無效郵箱

  PASS string

  口令

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

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

  (因爲此命令只有一個參數,因此空格不再作爲分隔符,而作爲口令的一部分)

  STAT

  (無)

  “確認”響應,空格,以八進制表示的郵件數目,空格和郵件大小。

  LIST [msg]

  信件數目(可選),如果出現,不包括標記爲刪除的信件。

  如果給出了參數,且POP3服務器返回包括上述信息的“確認”,此行稱爲信息的“掃描表”。

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

  RETR msg

   

  如果服務器返回“確認”,給出的響應是多行的。在初始的+OK後,服務器發送與給定信息號對應的信息,對於多行響應,注意字節填充終止符。

  DELE msg

   

  服務器將此信件標記爲刪除,以後任何關於此信件的操作就會產生錯誤。

  NOOP

  (無)

  服務器僅返回“確認”。

  RSET

  (無)

  所有被標記爲刪除的信件復位,服務器返回“確認”。

  QUIT

  (無)

  服務器刪除所有標記爲刪除的信件,然後釋放排它鎖,並返回這些操作的狀態碼。最後TCP連接被中斷。

  TOP msg n

  一個是未被標記爲刪除的信件數,另一個是非負數(必須提供)

  如果服務器返回“確認”,響應是多行的。在初始的+OK後,服務器發送信件頭,一個空行將信件頭和信件體分開,對於多行響應要注意字節填充終止符。

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

  UIDL [msg]

  信件數(可選)。

  如果給出了參數,且POP3服務器返回包括上述信息的“確認”,此行稱爲信息的“獨立-ID表”。

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

  APOP name digest

  指定郵箱的字串和MD5算法生成的密碼串。

  USER/PASS存在泄密的可能性。

  實現APOP命令的服務器包括一個標記確認的時間戳。例如:在UNIX上使用APOP命令的語法爲:process-ID.clock@hostname,其中進程-ID是進程的十進制的數,時鐘是系統時鐘的十進制表示,主機名與POP3服務器名一致。客戶記錄下此時間戳,然後以送APOP命令。

   

  例子:

  S: <等待連接到TCP端口110>

  C: <打開連接>

  S: +OK POP3 server ready <[email protected]>

  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: <服務器發送信件1>

  S: .

  C: DELE 1

  S: +OK message 1 deleted

  C: RETR 2

  S: +OK 200 octets

  S: <服務器發送信件2>

  S: .

  C: DELE 2

  S: +OK message 2 deleted

  C: QUIT

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

  C: <關閉連接>

   

  3.MIME(通用因特網郵件擴充協議)

  1993年制定了RFC1521,1522。後增加了RFC 2045,2046。

  MIME在原來 RFC 822定義的信頭的基礎上新增了一些信頭,用於讓接收方瞭解正文的結構。 RFC 2045描述了MIME,正文內容仍然可以使用ASCII文本行。另一方面,MIME爲非 ASCII報文定義了幾種編碼規則。以下所示爲一 MIME郵件的信頭,可以看出,除了原 RFC 822定義的信頭外,還含有MIME新增加的信頭:Mime Version、Content Type、Content Transfer En-coding、Content Disposition。

  Return Path:〈[email protected]

  Received:from i575.cs.ecnu.edu.cn by cs.ecnu.

  edu. cn(4. 1 / SMI 4. 1 )

  id AA0 6 1 1 5;Mon,1 7Aug981 6∶ 3 7∶ 1 1 CDT

  Message Id:〈3 5D7CEA8. 1 CB1 @ cs. ecnu. edu. cn〉

  Date:Mon,1 7Aug1 9981 5∶ 3 3∶ 1 2 +0 90 0

  From:ajfan〈ajfan@ cs. ecnu. edu. cn〉

  Reply To:ajfan@ cs. ecnu. edu. cn

  X Mailer:Mozilla 3 . 0 (Win95;I)

  Mime Version:1 . 0

  To:aifan@ cs. ecnu. edu. cn

  Subject:paper

  Content Type:application/ octet stream;name=″

  Email3 . doc″

  Content Transfer Encoding:base6 4

  Content Disposition:attachment;filename=″

  Email3 . doc“

   

  MIME把五個新的頭域增加入 Internet E-mail報文中,即MIME Version、Con-tent Type、Content Transfer Encoding、Content ID和 Content Descripton。MIME Version(MIME版本 )規定了代理所支持的 MIME版本。通過識別用於產生報文的 MIME版本,MIME Version域可以防止用戶使用不兼容的 MIME版本誤譯 MIME報文。

  Content Type規定了報文體的類型,RFC 2045定義了7種類型:Text,Applica-tion、Image、Audio、Video、Message和Multipart,其中Message和Multipart爲複合類型,其餘爲簡單類型,每種類型都有一個或多個子類型,類型與子類型中間以斜杆“/”分隔。 RFC 2046對各種類型作了詳細規定。此外,MIME還允許擴展定義新的內容類型。

  Content Transfer Encoding指出正文在傳輸過程中使用的編碼。NVT ASCII是 Internet E mail 報文的缺省格式。

  Content ID和Content Description頭域是可選的。用戶代理可用 Content ID值識別 MIME入口。

  Content Description允許用戶增加關於報文體內容的說明性信息。

  MIME定義了 7種主要報文類型:

  Text類型指一般普通文本。Text/ Richtext允許報文體中出現簡單基於 SGML的標誌語言。Image類型用於傳送靜態圖片 ,GIF和JPEG是兩種存儲格式不同的子類型。Audio和 Video類型用於傳送聲音和動態圖片。Video僅包含視頻信息而沒有聲音 ,如果要傳送一段包含聲音的視頻信息 ,則視頻信息和聲音要分開傳送。Application類型要求在顯示前獲得外部處理,用戶代理收到 Application/ Octet-stream類型的報文時先將其複製到一個文件中去 ,文件名可由用戶決定 ,然後作進一步處理。對 Postscript子類型的報文 ,接收方只要執行其中的附錄程序就可顯示到來報文。Message類型允許在一個報文中嵌入另一報文 ,常用於郵件轉交。

  MIME的編碼方案有Q方法和Base64方法。

  (1) Q方法

  可打印的內容傳輸編碼爲少量的8位數據作爲7位NVT ASCII傳輸提供了簡單而有效的編碼方法。要使用可打印編碼,以將任何具有第八位設置的字符當作一個三位字符串來傳輸。這三位字符串通常以等號開頭(=)。緊接着等號的是兩位數字的十六進制(表示兩個 ASCII字符),它表示被編碼字符的ASCII值。例如JAMSA中的字符可編碼如下:

  =4A=41 =4D=53=41

  “J”ASCII碼是0x4A。“A”的ASCII十六進制是0x41等等。可打印編碼把每個字符都轉換成ASCII字符。例如在字母 J(ASCII 0x4A)的情況下,編碼方案傳輸三個字節:一個等號(ASCII 0x3D),一個是數字4(ASCII 0x34),一個是字母A(ASCII 0x41)。可打印編碼儘管使用簡單,但編碼是原數據的3倍。因此,可打印編碼只對大量7位數據有益。

  (2) BASE64

  BASE64編碼僅增加三分之一的報文大小,這是一種64個ASCII字符的編碼方法,這64個字符分別是“A”~“Z”,“a”~“z”,“0”~“9”以及“+”和“/”。編碼時,把每個連續的三個字節(24位)數據組合表示爲四個六位數值(總共24位),每6位數值當作一個 ASCII字符來傳輸,其6位碼值對應0~63。當數據不包含三字節數據塊的整數倍時,這種編碼方案使用等號填充數據。

   

  4.其它

  CCITT制定了功能很強的MHS標準,即X.400,但未得到廣泛應用。另還有商家開發了自己獨立的郵件系統,如微軟的Exchange、NetWare的GroupWise等,這些系統可與Internet郵件系統交換信息,內部實現上各有特色。若需瞭解,可查閱相關資料。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章