邮件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消息由消息頭和消息體兩大部分組成。這里,分別稱為為郵件頭、郵件體。
郵件頭
郵件頭包含了發(fā)件人、收件人、主題、時 間、MIME版本、郵件內容的類型等重要信息。每條信息稱為一個域,由域名后加“: ”和信息內容構成,可以是一行,較長的也可以占用多行。域的首行必須“頂頭”寫,即左邊不能有空白字符(空格和制表符);續(xù)行則必須以空白字符打頭,且第 一個空白字符不是信息本身固有的,解碼時要過濾掉。
郵件頭中不允許出現(xiàn)空行。有一些郵件不能被郵件客戶端軟件識別,顯示的是原始碼,就是因為首行是空行。
例如:
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
?
郵件體
在郵件體中,大致有如下一些域:
有的域除了值之外,還帶有參數(shù)。值與參數(shù)、參數(shù)與參數(shù)之間以“;”分隔。參數(shù)名與參數(shù)值之間以“=”分隔。
郵件體包含郵件的內容,它的類型由郵件頭的“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上的很多網(wǎng)關不能正確傳輸8bit內碼的字符,比如漢字等。編碼的原理就是把8bit的內容轉換成7bit的形式以能正確傳輸,在接收方收到之后,再將其還原成8bit的內容。???
?? ? MIME是“多用途網(wǎng)際郵件擴充協(xié)議”的縮寫,在MIME協(xié)議之前,郵件的編碼曾經有過UUENCODE等編碼方式,但是由于MIME協(xié)議算法簡單,并且易于擴展,現(xiàn)在已經成為郵件編碼方式的主流,不僅是用來傳輸8 bit的字符,也可以用來傳送二進制的文件,如郵件附件中的圖像、音頻等信息,而且擴展了很多基于MIME的應用。
?
從編碼方式來說,MIME 定義了兩種編碼方法Base64與QP(Quote-Printable):
Base64
?????? Base64是一種通用的方法,其原理很簡單,就是把三個Byte的數(shù)據(jù)用4個Byte表示,這樣,這四個Byte中,實際用到的都只有前面6 bit,這樣就不存在只能傳輸7bit的字符的問題了。Base64的縮寫一般是“B”。
Base64將輸入的字符串或一段數(shù)據(jù)編碼成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}這64個字符的串,'='用于填充。其編碼的方法是,將輸入數(shù)據(jù)流每次取6bit,用此6bit的值(0-63)作為索引去查表,輸出相應字符。這樣,每3個字節(jié)將編碼為4個字符(3×8 → 4×6);不滿4個字符的以'='填充。 Base64的算法很簡單,它將字符流順序放入一個24位的緩沖區(qū),缺字符的地方補零。?? 然后將緩沖區(qū)截斷成為4個部分,高位在先,每個部分6位,用64個字符重新表示。如果輸入只有一個或兩個字節(jié),那么輸出將用等號“=”補足。這可以隔斷附加的信息造成編碼的混亂。
QP
另一種方法是QP(Quote-Printable)方法,通常縮寫為“Q”方法,其原理是把一個8 bit?? 的字符用兩個16進制數(shù)值表示,然后在前面加“=”。所以我們看到經過QP編碼后的文件通常是這個樣子:=B3=C2=BF=A1=C7=E5=A3=AC=C4=FA=BA=C3=A3=A1。
QP編碼要求編碼后每行不能超過76個字符。當超過這個限制時,將使用軟換行,用”=”表示編碼行的斷行,后接CRLF。(76的限制包括”=”)。
“=” 等號被編碼為”=3D”。
tab和空格出現(xiàn)在行尾時,需要被編碼為”=09”(tab)? “=20”(space)
編碼格式:encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
編碼信息有"=?"和"?="括起來,"=?"后是字符集名稱,再一個"?"后是編碼方式,再一個"?"后是編碼后的字符串。字符集和編碼方式都不區(qū)分大小寫。
字符集可以是任意系統(tǒng)支持的字符集(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的關系
?
從上圖可以看出發(fā)件人、收件人地址都出現(xiàn)了兩次,一次在smtp命令中(SMTP email address),一次在郵件正文中(MIME email address)。需要注意的是:
?
?
?
?
本文參考了以下資源:
http://blog.donews.com/Shan/archive/2006/01/04/682534.aspx
轉載于:https://www.cnblogs.com/onelikeone/p/7865596.html
總結
以上是生活随笔為你收集整理的邮件MIME格式分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]资深CTO:关于技术团队打造与管理
- 下一篇: GDB调试器用法