1. 程式人生 > >應用層之電子郵件系統

應用層之電子郵件系統

1.電子郵件系統的組成部分

  1.使用者代理(user  agent)

  2.郵件伺服器(mail server)

  3.簡單郵件傳輸協議(simple mail transfer protocol,SMTP)

  

    郵件伺服器形成了電子郵件系統的核心。

    郵箱(mailbox)是郵件伺服器為使用者單獨開闢的一個空間。

    郵件傳送過程可以描述為:

      報文從傳送方的使用者代理開始,傳輸到到傳送方的郵件伺服器。再由傳送方的郵件伺服器傳輸到接受方的郵件伺服器。最後由接受方的郵件伺服器分發到接受方的郵箱(mailbox)中。

    報文佇列:如果接受方的郵件伺服器故障,那麼傳送方的郵件伺服器會將要傳送的報文儲存在一個報文佇列(massage queue)中,並在以後嘗試傳送。通常每30分鐘左右就進行一次嘗試。如果幾天後仍然不能成功,伺服器就刪除該報文並以電子郵件的形式通知傳送方。

    smtp:在一個郵件伺服器上同時執行著smtp的客戶端和smtp的服務端。傳送郵件時,smtp客戶端起作用,接受郵件時smtp起作用。

2.SMTP

  1.smtp的一個小的歷史缺憾:

  smtp限制所有郵件報文的體部分(不只是其首部)只能採用簡單的7位元ASCII表示。在20世紀80年代早期,這種限制是明智的,因為當時傳輸能力不足,沒有人會通過電子郵件傳送大的附件或是大的圖片、聲音或者視訊檔案。然而,在今天的多媒體時代,7位ASCII的限制的確有點痛苦,即在用SMTP傳送郵件之前,需要將二進位制多媒體資料編碼為ASCII碼,並且在使用SMTP傳輸後要求將相應的ASCII碼郵件解碼還原為多媒體資料。

  使用HTTP傳送就不需要將多媒體資料編碼為ASCII碼。

  2.郵件傳送(ASCII報文)

  假設Alice想給Bob傳送一封簡單的ASCII報文:

  • Alice呼叫她的郵件代理程式並提供Bob的郵件地址(例如[email protected]),撰寫報文,然後指示使用者代理髮送該報文。
  • Alice的使用者代理把報文發給她的郵件伺服器,在那裡該報文被放在報文佇列中。
  • 執行在Alice的郵件伺服器上的SMTP客戶端發現了報文佇列中的這個報文,它就建立一個到執行在Bob的郵件伺服器上的SMTP伺服器的TCP連線。
  • 在經過一些初始SMTP握手後,SMTP客戶通過該TCP連線傳送Alice的報文。
  • 在Bob的郵件伺服器上,SMTP的伺服器端接收該報文。Bob的郵件伺服器然後將該報文放入Bob的郵箱中。
  • 在Bob方便的時候,他呼叫使用者代理閱讀該報文。

  

  

    SMTP一般不使用中間郵件伺服器傳送郵件。即傳送方郵件伺服器和接收方郵件伺服器是直接連線的(TCP 25埠)。

    

  • 在經過一些初始SMTP握手後,SMTP客戶通過該TCP連線傳送Alice的報文。
  • 在Bob的郵件伺服器上,SMTP的伺服器端接收該報文。Bob的郵件伺服器然後將該報文放入Bob的郵箱中。
  • 在Bob方便的時候,他呼叫使用者代理閱讀該報文。

  一旦建立了TCP連線,就開始瞭如下過程:

  

    s:220 hamburger.edu     //表示連線郵件伺服器成功

    C:HELO crepes.fr     //驗證伺服器 向伺服器問好

    C:MAIL FROM:<[email protected]>    //驗證發件人郵箱地址

    C:RCPT TO:<[email protected]>  //驗證接收人地址

    C:DATA                          //開始寫郵件了

    C:Do you like ketchup?  //郵件內容

    C: How about pickles?   //郵件內容

    C:.                               //CRLF.CRLF  表示報文結束 。CR和LF分別表示回車和換行。第一個CRLF是上一行末尾的回車和換行。

    C: QUIT                     //斷開連線

3.SMTP與HTTP對比

  相同:

  1.兩個協議都是用於一臺主機箱另一臺主機傳送檔案。http是在web伺服器向web客戶(通常是一個瀏覽器)傳送檔案,smtp是在兩個郵件伺服器之間傳送檔案。

  2.smtp和持續的http都是持續連線(長連線)。

  區別:

  1.http是一個拉協議(pull protocol),即使用者使用http從伺服器拉去這些資訊。smtp是一個推協議(push protocol),即傳送郵件伺服器將檔案推向接收郵件伺服器。特別是,這個TCP連線是由要傳送該檔案的機器發起的。

  2.smtp要求每個報文(包括他們的體)使用7位元ASCII碼格式。如某報文包含了非7位元ASCII字元或二進位制資料(如圖形檔案),則該報文必須按照7位元ASCII碼進行編碼。而http資料則不受這種限制。

  3.對於如何處理既包含文字圖形的文件。http把每個物件(多個檔案物件)封裝到它自己的http響應報文中,而smtp則把所有報文物件(多個報文)放在一個報文之中。

4.郵件報文格式和MIME

  MIME協議( Multipurpose Internet Mail Extensions ),通用因特網郵件擴充協議 ,作為SMTP的一種輔助協議,其引入是為了克服SMTP的如下不足:

        1.SMTP只能傳送使用NVT( 虛擬網路終端 ) 7位ASCII碼格式的報文,它不能使用NVT 7位ASCII碼不支援的語言(如漢語,日語,德語等)。

        2.SMTP不能傳送可執行檔案或其他二進位制物件(如影象檔案,這裡的不能傳送應該指的是接受方並不能確定接受資料的準確性和完整性)。

        3.SMTP不支援音訊或視訊檔案。

        4.SMTP傳送的郵件的長度受到限制。

        為了克服以上的不足,便引入了MIME協議,MIME協議是一種擴充套件協議性的輔助協議,“擴充”指的是隻是對原來協議的擴充套件,而不是取代。它允許非ASCII碼資料能夠通過電子郵件傳送。MIME在傳送方把非ASCII碼資料轉換為NVT ASCII資料,之後的工作再交給SMTP完成,在接收方再將NVT ASCII資料還原成原來的資料。MIME的體系結構如下:

  •   MIME定義了5種首部,用來加在原始的電子郵件部分以定義引數的轉換,這五種首部分別是: MIME-Version(MIME版本 )、 Constent-Type ( 內容型別 )、 Content-Transfer-Encoding ( 內容-傳送-編碼 )、 Content-Id ( 內容-標識 )和 Content-Description ( 內容描述 )。

        MIME版本 :定義了MIME使用的版本。

       內容-型別 :定義報文主體使用的資料型別和子型別,用<資料型別/子型別>表示。

   內容-傳送-編碼 :定義了郵件的主體在傳送時是如何編碼的。

       內容-標識 :在多報文的環境中唯一地標識報文。

        內容描述 :定義了主體是否為影象、音訊或視訊。

  •   一個簡單的MIME格式報文如下(應該就是smtp命令DATA後面的內容了): 

    1Date: Thu, 18 Apr 2002 09:32:45 +0800      //首部行

    2From: <[email protected]>            //首部

    3 To:<[email protected]>           //首部  

    4Subject: Test                  //首部  

    5 Mime-Version: 1.0                //首部

    6 Content-Type: text/plain;charset="iso-8859-1"    //首部

    7                         //空行

    8 Thisis a simple mail.               //報文體

  • pop3

  pop3是一個極為簡單的郵件訪問協議(pull protocol),由RFC1939進行定義。使用者代理(客戶)開啟一個到郵件伺服器埠110上的tcp連線。

  pop3按照三個階段:

  特許(authorization)-->使用者代理以明文形式傳送使用者名稱和密碼以鑑別使用者。

      client: telnet mailserver 110    //與郵件伺服器110埠建立tcp連線

      server: +OK server ready             //郵件伺服器響應

      client: user bob        //使用者名稱 bob

      server: +OK

      client: pass password     //密碼

      server:+OK user successfully logged on

  事務處理

    此階段,使用者代理從郵件伺服器取回郵件報文(此階段使用者代理還能對郵件報文做刪除標記和取消刪除標記,以及獲取郵件的統計資訊)

    c:list

    s: 1 498    //報文1長度

    s:2 912    //報文2長度

    c:retr 1

    s: (bla bla bla..............)  //報文1

    c: dele 2        //對報文2進行刪除標記

    c:quit

    s:+OK POP3 server singing off //退出後,郵件伺服器會刪除郵件報文2

  結束:

    quit命令後,結束該pop3會話。

  • IMAP

pop3協議沒有給使用者提供任何建立遠端資料夾併為報文指派資料夾的方法。這會給那些移動使用者帶來不方便。

IMAP解決了此問題。IMAP伺服器把每個報文與一個資料夾聯絡起來;報文第一次到達伺服器時,它與收件人的inbox資料夾相關聯。

IMAP的另一個重要特性時它具有允許使用者代理獲取報文元件的命令。例如,一個使用者代理可以只讀取一個報文的報文首部,或者只是一個多部分報文的一部分。當使用低寬頻連線時,使用者可能並不想取回他郵箱中的所有郵件,尤其要避免可能包含如音訊或視訊片段的大郵件。

  • 基於Web的電子郵件

今天越來越多的使用者使用web瀏覽器收發電子郵件。使用者代理(不管時傳送方還是接受方)與郵件伺服器之間都是通過http進行通訊,但是郵件伺服器之間傳送和收發郵件時仍然使用的時SMTP。