郵件MIME格式分析


http://www.cnblogs.com/crystalray/articles/3302427.html

 

 

郵件mime格式

參考:

rfc4021,Registration of Mail and MIME Header Fields,

 http://www.apps.ietf.org/rfc/rfc4021.html,

總體來說,MIME消息由消息頭和消息體兩大部分組成。這里,分別稱為為郵件頭、郵件體。

郵件頭

郵件頭包含了發件人、收件人、主題、時 間、MIME版本、郵件內容的類型等重要信息。每條信息稱為一個域,由域名后加“: ”和信息內容構成,可以是一行,較長的也可以占用多行。域的首行必須“頂頭”寫,即左邊不能有空白字符(空格和制表符);續行則必須以空白字符打頭,且第 一個空白字符不是信息本身固有的,解碼時要過濾掉。

郵件頭中不允許出現空行。有一些郵件不能被郵件客戶端軟件識別,顯示的是原始碼,就是因為首行是空行。

例如:

Date: Mon, 29 Jun 2009 18:39:03 +0800

From: "=?gb2312?B?26zQocHB?=" <gaoxl@legendsec.com>

To: "moreorless" <moreorless@live.cn>

Cc: "gxl0620" <gxl0620@163.com>

BCC: "=?gb2312?B?26zQocHB?=" <venus.oso@gmail.com>

Subject: attach

Message-ID: <200906291839032504254@legendsec.com>

X-mailer: Foxmail 6, 15, 201, 21 [cn]

Mime-Version: 1.0

 

郵件體

在郵件體中,大致有如下一些域:

有的域除了值之外,還帶有參數。值與參數、參數與參數之間以“;”分隔。參數名與參數值之間以“=”分隔。

郵件體包含郵件的內容,它的類型由郵件頭的“Content-Type”域指出。常見的簡單類型有text/plain(純文本)和text/html(超文本)。

multipart類型,是MIME郵件的精髓。郵件體被分為多個段,每個段又包含段頭和段體兩部分,這兩部分之間也以空行分隔。常見的multipart類型有三種:multipart/mixed, multipart/related和multipart/alternative。從它們的名稱,不難推知這些類型各自的含義和用處。它們之間的層次關系可歸納為下圖所示:

 

可以看出,如果在郵件中要添加附件,必須定義multipart/mixed段;如果存在內嵌資源,至少要定義multipart/related段;如果純文本與超文本共存,至少要定義multipart/alternative段。

 

示例:

 

MIME編碼

參考rfc2047,MIME Part Three:Message Header Extensions for Non-ASCII Text

 http://tools.ietf.org/html/rfc2047

 

 MIME編碼的兩種方法:

     對郵件進行編碼最初的原因是因為Internet上的很多網關不能正確傳輸8bit內碼的字符,比如漢字等。編碼的原理就是把8bit的內容轉換成7bit的形式以能正確傳輸,在接收方收到之后,再將其還原成8bit的內容。   

     MIME是“多用途網際郵件擴充協議”的縮寫,在MIME協議之前,郵件的編碼曾經有過UUENCODE等編碼方式,但是由於MIME協議算法簡單,並且易於擴展,現在已經成為郵件編碼方式的主流,不僅是用來傳輸8 bit的字符,也可以用來傳送二進制的文件,如郵件附件中的圖像、音頻等信息,而且擴展了很多基於MIME的應用。

 

從編碼方式來說,MIME 定義了兩種編碼方法Base64與QP(Quote-Printable):

Base64

       Base64是一種通用的方法,其原理很簡單,就是把三個Byte的數據用4個Byte表示,這樣,這四個Byte中,實際用到的都只有前面6 bit,這樣就不存在只能傳輸7bit的字符的問題了。Base64的縮寫一般是“B”。

Base64將輸入的字符串或一段數據編碼成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}這64個字符的串,'='用於填充。其編碼的方法是,將輸入數據流每次取6bit,用此6bit的值(0-63)作為索引去查表,輸出相應字符。這樣,每3個字節將編碼為4個字符(3×8 → 4×6);不滿4個字符的以'='填充。 Base64的算法很簡單,它將字符流順序放入一個24位的緩沖區,缺字符的地方補零。   然后將緩沖區截斷成為4個部分,高位在先,每個部分6位,用64個字符重新表示。如果輸入只有一個或兩個字節,那么輸出將用等號“=”補足。這可以隔斷附加的信息造成編碼的混亂。

QP

另一種方法是QP(Quote-Printable)方法,通常縮寫為“Q”方法,其原理是把一個8 bit   的字符用兩個16進制數值表示,然后在前面加“=”。所以我們看到經過QP編碼后的文件通常是這個樣子:=B3=C2=BF=A1=C7=E5=A3=AC=C4=FA=BA=C3=A3=A1。

QP編碼要求編碼后每行不能超過76個字符。當超過這個限制時,將使用軟換行,用”=”表示編碼行的斷行,后接CRLF。(76的限制包括”=”)。

“=” 等號被編碼為”=3D”。

tab和空格出現在行尾時,需要被編碼為”=09”(tab)  “=20”(space)

編碼格式:encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

編碼信息有"=?"和"?="括起來,"=?"后是字符集名稱,再一個"?"后是編碼方式,再一個"?"后是編碼后的字符串。字符集和編碼方式都不區分大小寫。

字符集可以是任意系統支持的字符集(iso-8859-1、utf-8、gb2312、gbk、gb18030....)

 

編碼方式有兩種:"B"或"b"代表base64編碼;"Q"或"q"代表QP編碼。

Generally, an "encoded-word" is a sequence of printable ASCII characters that begins with "=?", ends with "?=", and has two "?"s in between. It specifies a character set and an encoding method, and also includes the original text encoded as graphic ASCII characters, according to the rules for that encoding method.

 

SMTP與MIME的關系

 

從上圖可以看出發件人、收件人地址都出現了兩次,一次在smtp命令中(SMTP email address),一次在郵件正文中(MIME email address)。需要注意的是:

    1. 郵件正文中可以包含發件人、收件人的別名,smtp命令中不可以
    2. 密送人的地址不一定會出現在郵件正文中。不同客戶端實現不同。

 

 

 

 

本文參考了以下資源:

http://blog.donews.com/Shan/archive/2006/01/04/682534.aspx


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM