一、概述
要想各種郵件處理程序能識別我們所寫的電子郵件,能從我們所書寫的電子郵件中分析和提取出發件人,收件人,郵件主題和郵件內容以及附件等信息,那麼我們所寫的電子郵件必須要遵循一定的格式要求,正如博客《TCP/IP協議族》:POP3協議、《TCP/IP協議族》:SMTP協議 。
二、RFC822 郵件格式
英文參考文檔如下:https://tools.ietf.org/html/rfc822
RFC822 文檔中定義的文件格式包括兩個部分:郵件頭和郵件體。
《TCP/IP協議族》:郵件協議概述 文章中郵件接收內容如下圖紅色框所顯示:
這上面顯示的不全,我這裏將其內容整理出來,並在每行左邊加上標號:
|
上面便是 RFC822 所定義的郵件格式,從第 1 行到第 30 行都是郵件頭,第 31 行是郵件體(經過base64加密過了,有興趣的大家可以解碼看看)。而郵件頭和郵件體之間以一個空行間隔 (SMTP手動發送過程中有說到),郵件頭部分是由多個頭字段和字段內容組成,分別表示收件人,發件人,發件時間,主題等信息。還有一些信息是對應的SMTP服務器在郵件傳遞過程中所加上的,我們知道現實生活中的郵局在處理郵件時,通常都會在信封上加上郵戳,表示這封郵件在什麼時候經過了哪個郵局哪個部門處理,我們上個例子是QQ郵箱發給163郵箱的。而SMTP服務器按從下往上的方式添加信息,即先添加的字段位於後添加字段的後面。所以qq的SMTP服務器會先添加頭字段,但是添加的字段會在163的SMTP服務器添加字段的下面,另外 POP3服務器也會自己添加一些字段。
每一個郵件頭以“字段名:字段值”的格式出現,即每一行郵件頭的內容依次由字段名、冒號、空格、字段值、回車換行符組成。RFC822文檔中定義了多個標準的郵件頭字段,每一個郵件頭字段表示一種特定的信息。郵件頭中也可以包含自定義的頭字段,這種自定義的頭字段通常是某個組織或機構內部專用的。下面是對一些主要的郵件頭字段的解釋:
我們從上可以知道,RFC822文檔存在兩個問題:
①、定義了郵件內容的主體結構和各種郵件頭字段的詳細細節,但是,它沒有定義郵件體的格式,RFC822文檔定義的郵件體部分通常都只能用於表述一段普通的文本,而無法表達出圖片、聲音等二進制數據。
②、SMTP服務器在接收郵件內容時,當接收到只有一個“.”字符的單獨行時,就會認爲郵件內容已經結束,如果一封郵件正文中正好有內容僅爲一個“.”字符的單獨行,SMTP服務器就會丟棄掉該行後面的內容,從而導致信息丟失。
上面兩個問題是致命的,當今的電子郵件,人們希望在電子郵件中嵌入圖片、聲音、動畫和附件。但是,由於圖片和聲音等內容是非ASCII碼的二進制數據,而RFC822郵件格式只適合用來表達純文本的郵件內容,所以,要使用RFC822郵件格式發送這些非ASCII碼的二進制數據時,必須先採用某種編碼方式將它們“編碼”成可打印的ASCII字符後再作爲RFC822郵件格式的內容。郵件閱讀程序在讀取到這種經過編碼處理的郵件後,再按照相應的解碼方式解碼出原始的二進制數據,這樣就可以藉助RFC822郵件格式來傳遞多媒體數據了。
這種做法需要解決一下兩個技術問題:
一、郵件閱讀程序如何知道郵件中嵌入的原始二進制數據所採用的編碼方式;
二、郵件閱讀程序如何知道每個嵌入的圖像或其他資源在整個郵件內容中的起止位置。
爲了解決上面兩個問題,人們後來專門爲此定義了MIME(Multipurpose Internet Mail Extension,多用途Internet郵件擴展)協議。
三、 MIME協議
MIME協議用於定義複雜郵件體的格式,它可以表達多段平行的文本內容和非文本的郵件內容,例如,在郵件體中內嵌的圖像數據和郵件附件等。另外,MIME協議的數據格式也可以避免郵件內容在傳輸過程中發生信息丟失。MIME協議不是對RFC822郵件格式的升級和替代,而是基於RFC822郵件格式的擴展應用。一言以蔽之,RFC822定義了郵件內容的格式和郵件頭字段的詳細細節,MIME協議則是定義瞭如何在郵件體部分表達出的豐富多樣的數據內容。
一個採用了MIME協議的電子郵件就叫做MIME郵件,MIME郵件在RFC822文檔中定義的郵件頭字段的基礎上,擴充了一些自己專用的郵件頭字段,例如,使用MIME-Version頭字段指定MIME協議的版本,使用Content-Type頭字段指定郵件體的MIME類型,使用Content-Transfer-Encoding頭字段指定編碼方法,如下所示:
MIME-Version:1.0 Content-Type:multipart/mixed;boundary="----=_NextPart_000_0050_01C"
其中,“multipart/mixed”部分說明郵件體中包含有多段數據,每段數據之間使用boundary屬性中指定的字符文本作爲分隔標識符。另外,MIME郵件也擴展了RFC822文檔中已經定義了的郵件頭字段的內涵,例如,定義了subject頭字段中的值內容的格式,以便通過編碼的方式讓郵件主題中也可以使用非ASCII碼的字符。subject頭字段中的值嵌套在一對“=?”和“?=”標記符之間,標記符之間的內容由三部分組成:郵件主題的原始內容的字符集、當前採用的編碼方式、編碼後的結果,這三部分之間使用“?”進行分隔。
MIME協議定義了5種頭部
1. MIME-Version:MIME版本
2. Content-Type:內容類型
3. Content-Tansfer-Encoding:內容傳輸編碼
4. Content-ID:內容標識
5. Content-Description:內容描述
MIME郵件報文格式: