MIME概述
電子郵件協議SMTP通過連接建立
、郵件傳送
、連接釋放
三個階段實現發送方和接收方之間的通信。
不過SMTP有很多的缺點:
- SMTP不能傳送可執行文件或其他的二進制對象。
- SMTP限於傳送7位的ASCLL碼很多非英語語言無法傳送。
- SMTP服務器會拒絕超過一定長度的郵件。
- 某些SMTP的實現並沒有完全按照SMTP的互聯網標準。如:
回車、換行的刪除和增加
超過76個字符會截斷或者自動換行
後面多餘的空格刪除
將製表符tab轉換爲若干個空格
提出了通用互聯網郵件擴充MIME
MIME繼續使用原來的郵件格式,增加了郵件主體的結構,定義了傳送非ASCALL碼的編碼規則。
MIME增加5個新的郵件首部
-
MIME-Version
表示使用的MIME的版本號,一般是1.0
-
Content-Type
說明郵件主體的數據類型和子類型
Content-Type都是“主類型/子類型”的形式。主類型有text, image,audio, video, application, multipart, message等,分別表示文本、圖片、音頻、視頻、應用、分段、消息等。 -
Content-Transfer-Encoding
在傳送郵件主體如何編碼的
Content-Transfer-Encoding共有Base64, Quoted-printable, 7bit, 8bit, Binary等幾種。
使用最廣泛的編碼方式:Base64, Quoted-Printable。 -
Content-Disposition
可讀字符串,說明此郵件主體是否是圖像、音頻或視頻
-
Content-ID
郵件的唯一標識符
瞭解了MIME基本概況,我們看看兩種使用最廣泛的編碼方式。
base64編碼
對於任意的二進制文件,都可用base64編碼。base64已經成爲網絡上常見的傳輸8Bit字節代碼的編碼方式之一。
基本原理
定義一個base62索引表,有字符"A-Z、a-z、0-9、+、/" 64個可打印字符。
6位二進制代碼共有64種不同的值,從0到63,下面是對應表
0 A 17 R 34 i 51 z
1 B 18 S 35 j 52 0
2 C 19 T 36 k 53 1
3 D 20 U 37 l 54 2
4 E 21 V 38 m 55 3
5 F 22 W 39 n 56 4
6 G 23 X 40 o 57 5
7 H 24 Y 41 p 58 6
8 I 25 Z 42 q 59 7
9 J 26 a 43 r 60 8
10 K 27 b 44 s 61 9
11 L 28 c 45 t 62 +
12 M 29 d 46 u 63 /
13 N 30 e 47 v
14 O 31 f 48 w
15 P 32 g 49 x
16 Q 33 h 50 y
具體步驟
- 把二進制代碼劃爲一個個24位長的單元,再把每一個24位單元劃分爲4個6位組。
- 在每組前面添加兩個0,每組由6個變爲8個二進制位,總共32個二進制位(四個字節)。
- 根據base64編碼對照表獲得對應的值。
例題
試將數據 11001100 10000001 00111000進行base64編碼,並得到最後傳輸的ASCII數據。
-
第一步:正好是24位長,分爲4個6位組
110011 001000 000100 111000
-
第二步:在每組前面添加兩個0
00110011 00001000 00000100 00111000
51 8 4 56 -
第三步:根據base64編碼對照表獲得對應的值。
00110011 00001000 00000100 00111000
51 8 4 56
z I E 4 -
第四步:找出對應的二進制值
z -> 122 -> 01111010
I -> 73 -> 01001001
E -> 69 -> 01000101
4 -> 52 -> 00110100
quoted-printable編碼
這種方法適用於所傳送的數據中只有少量的非ASCLL碼
ASCII編碼是7位編碼,一共可以組成128個不同的ASCII碼,其中可以打印的有95個(95箇中包括了空格),還有33個控制字符不可打印。
基本步驟
可以打印的ASCLL碼,不變
等號“=”和不可打印的ASCLL碼以及非ASCLL碼的數據編碼方式:
- 每個字節(8位)的二進制用兩個十六進制數字表示
- 在其前面加上一個等號“=”
例題
試將數據01001100 10011101 00111001進行quoted-printable編碼,並得出最後傳送的ASCII數據。這樣的數據用quoted-printable編碼後其編碼開銷有多大?
-
第一步:將二進制分爲8位一組,轉爲十六進制,超過5F不可打印(當然也可直接轉化爲十進制,超過95不可打印)
01001100 10011101 00111001
4C 9D 39 -
可打印:不用改變,不可打印:兩個十六進制數字前面加上“=”
01001100 10011101 00111001
4C 9D 39
4C =9D 39 -
可打印:不用改變,不可打印:將“=”和兩個十六進制數字分別轉化爲8位二進制(
=
:00111101)4C、39可以打印,9D不可以打印
=9D:00111101 00111001 01000100ASCII數據:
01001100 00111101 00111001 01000100 00111001
開銷:(5-3)/3=66.7%
ASCLL字符代碼表
圖片來自百度
參考文獻:
計算機網絡(第7版)-謝希仁