MENU

聊聊 MIME

June 14, 2018 • Code

前言:学习 MIME 标准及细节。

MIME介绍

来自维基:

多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions)是一个互联网标准,它扩展了电子邮件标准,使其能够支援:

非ASCII字符文本;
非文本格式附件(二进制、声音、图像等);
由多部分(multiple parts)组成的消息体;
包含非ASCII字符的头信息(Header information)。这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。

简单来说,MIME 是对传统电子邮件标准的扩展,目的是为了克服传统电子邮件标准的缺点。目前 MIME 已是电子邮件事实上的标准。

在传统电子邮件标准中,邮件包括三个部分,消息的「信封」、邮件标头及邮件内容。其中「信封」为加密所用;标头则包含邮件的基本信息,如发信人等;邮件内容即为邮件正文。最开始邮件用纯 ASCII 字符传输,导致传输一些非英语字符消息和二进制文件极为困难。

MIME 的增强

MIME 在传统电子邮件标准的基础上进行扩展,使一些非英语字符消息和二进制文件,图像,声音等非文字消息可以在电子邮件中传输。

因为 MIME 制定了一套有效的二进制数据符号化方法,这套方法在网页传输方面同样有效,故 HTTP 协议中也使用了 MIME 的框架,标准被扩展为互联网媒体类型。

电子邮件可分为邮件头及邮件内容,中间用一个空格分隔,MIME 实质上是通过规范电子邮件头的域来实现扩展,定义新的域描述报文类型的内容和组织形式。

最主要的域有如下几个:

1. MIME-Version: 1.0

表明该邮件使用 MIME 标准。

2. Content-Type: text/html; charset="gb18030"

2.1 Content-Type

Content-Type 定义该邮件部分的类型,常见的简单类型有 text/plain(纯文本)和 text/html(超文本),更多可查看 MIME 类型 。类型中需要重点理解 multipart 类型

multipart 类型一般包含 multipart/mixed, multipart/related 和 multipart/alternative。这种类型中包含不同的,每一段中又有自己的 Content-Type 和 编码传输方式,因此不同段可包含不同编码类型的文档

三种类型包含结构图:

multipart 类型的包含关系可扩大。举个栗子:如果只包含纯文本及超文本,类型可用 multipart/related 或 multipart/alternative,即扩大化

multipart 类型后面往往会跟随着 boundary 属性,值通常为一串随机字符串,如 ----=_NextPart_5B1FEAD0_0BE96190_6CA8E856,在 multipart 类型最后的会用 boundary 值加 -- 作为结束标志。

2.2 charset

该属性指明该段所用字符编码。

关于字符编码的内容更多可参考 计算机中的字符编码

3. Content-Transfer-Encoding: base64

该属性指明该段使用的传输编码。主要包括以下几种:

  • 7 bit:7位元ASCII码

  • 8 bit:8位元ASCII码。

  • binary:基本不用。

  • quoted-printable:用 = + 二个十六进制数的形式表示一个 8 位字节,ASCII 字符原样输出,适用于有大量 ASCII 字符 + 少量二进制数据或非 ASCII 字符的文档。

  • base64:将二进制数据用一个包括 64 个可打印符的集合表示,适用于传输包含大量二制数据或非 ASCII 字符的文档,编码成本均衡。

其中最常用的是 quoted-printable 和 base64 编码,关于这两种编码的更多内容可参考 理解 Base64 及 Quoted-printable 编码

栗子

[email protected] 发送邮件给 [email protected] 为栗子。

Gamil 查看邮件完整信息可参考 通过完整标头追踪电子邮件

邮件正文如下:

...
...
From: kbrx93 <[email protected]>
To: kbrx93 <[email protected]>
Subject: Hello World
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="----=_NextPart_5B1FEAD0_0BE96190_6CA8E856"
Content-Transfer-Encoding: 8Bit
...
...

------=_NextPart_5B1FEAD0_0BE96190_6CA8E856
Content-Type: multipart/alternative; boundary="----=_NextPart_5B1FEAD0_0BE96190_1323E941";

------=_NextPart_5B1FEAD0_0BE96190_1323E941
Content-Type: text/plain; charset="gb18030"
Content-Transfer-Encoding: base64

tL/OxLG+DQoNCg0KvNO01s7Esb4NCg0KDQoNCgg=
------=_NextPart_5B1FEAD0_0BE96190_1323E941
Content-Type: text/html; charset="gb18030"
Content-Transfer-Encoding: base64

PGRpdj60v87Esb48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjxiPrzTtNbOxLG+PC9iPjwvZGl2
PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGltZyBzcmM9ImNpZDozRDVFMzI5MEBBMzFFM0Q3RS5EMEVB
MUY1Qi5qcGciPjwvZGl2PjxkaXY+PGI+CDwvYj48L2Rpdj48ZGl2PjxiPjxicj48L2I+PC9kaXY+

------=_NextPart_5B1FEAD0_0BE96190_1323E941--
------=_NextPart_5B1FEAD0_0BE96190_6CA8E856
Content-Type: image/jpeg; name="[email protected]"
Content-Transfer-Encoding: base64
Content-ID: <[email protected]>


------=_NextPart_5B1FEAD0_0BE96190_6CA8E856
Content-Type: application/octet-stream; charset="gb18030"; name="kbrx93_2.jpg"
Content-Disposition: attachment; filename="kbrx93_2.jpg"
Content-Transfer-Encoding: base64


------=_NextPart_5B1FEAD0_0BE96190_6CA8E856--

参考

Last Modified: July 5, 2018
Archives QR Code
QR Code for this page
Tipping QR Code