MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)是一个互联网标准,它扩展了电子邮件标准,使其能够支持:非ASCII字符文本、非文本格式附件(二进制、声音、图像等)、由多部分(multiple parts)组成的消息体、包含非ASCII字符的头信息(Header information)。
这个标准被定义在RFC 2045、RFC 2046、RFC 2047、RFC 2048、RFC 2049等RFC中。MIME改善了由RFC 822转变而来的RFC 2822,这些旧标准规定电子邮件标准并不允许在邮件消息中使用7位ASCII字符集以外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息原本都不能在电子邮件中传输(MIME可以)。MIME规定了用于表示各种各样的数据类型的符号化方法。此外,在万维网中使用的HTTP协议中也使用了MIME的框架,标准被扩展为互联网媒体类型。
1.MIME headers
一个普通的文本邮件的信息包含一个头部分(To:, From:,Subject:,等等)和一个体部分(Hello Mr.,等等)。在一个符合MIME的信息中,也包含一个信息头,称之为MIME headers。MIME是通过标准化电子邮件报文的头部的附加域(fields)而实现的,这些头部的附加域,用以描述新的报文类型的内容和组织形式,主要包含以下几个部分:
MIME版本(MIME Version)
用来指明消息遵从的MIME规范的版本,目前版本是1.0,表示形式如下:
MIME-Version: 1.0
内容类型(Content-Type)
用于指定消息的类型,表示形式如下:
Content-Type: [type]/[subtype]; parameter
type表示媒体类型,常用的有:
Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
Application:用于传输应用程序数据或者二进制数据;
Message:用于包装一个E-mail消息;
Image:用于传输静态图片数据;
Audio:用于传输音频或者音声数据;
Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。
subtype指定type的详细形式,常用的有:
text/plain(纯文本)
text/html(HTML文档)
application/xhtml+xml(XHTML文档)
image/gif(GIF图像)
image/jpeg(JPEG图像)【PHP中为:image/pjpeg】
image/png(PNG图像)【PHP中为:image/x-png】
video/mpeg(MPEG动画)
application/octet-stream(任意的二进制数据)
application/pdf(PDF文档)
application/msword(Microsoft Word文件)
application/vnd.wap.xhtml+xml (wap1.0+)
application/xhtml+xml (wap2.0+)
message/rfc822(RFC 822形式)
multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
application/x-www-form-urlencoded(使用HTTP的POST方法提交的表单)
multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)
此外,尚未被接受为正式数据类型的subtype,可以使用x-开始的独立名称(例如application/x-gzip)。
parameter可以用来指定附加的信息,更多情况下是用于指定text/plain和text/html等的文字编码方式的charset参数。
MIME根据type制定了默认的subtype,当客户端不能确定消息的subtype的情况下,消息被看作默认的subtype进行处理。Text默认是text/plain,Application默认是application/octet-stream而Multipart默认情况下被看作multipart/mixed。
内容传输编码(Content-Transfer-Encoding)
这是信息头中最重要的一个,因为它说明了对数据所执行的编码方式,客户端(MUA) 将用它对附件进行解码;也正是该部分,使得电子邮件能够支持ASCII以外的字符编码方式。表示形式如下:
Content-Transfer-Encoding: [mechanism]
其中,mechanism的值可选“7bit”,“8bit”,“binary”,“quoted-printable”,“base64”。
注意,任何非ASCII数据必须选用以上一种模式进行编码,转换为ASCII字符,这样它就可以通过Internet邮件网关。
2.HTTP中的应用
MIME最早应用于电子邮件系统,后来被HTTP协议支持,它的意义变得更为显著。它使得HTTP传输的不仅仅是普通的文本,而变得丰富多彩。
最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML 文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。
服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME Type,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪种插件读取相关文件。
浏览器接收到文件后,会进入插件系统进行查找,查找出哪种插件可以识别读取接收到的文件。如果浏览器不清楚调用哪种插件系统,它可能会告诉用户缺少某插件,或者直接选择某现有插件来试图读取接收到的文件,或者可能会导致系统的崩溃。传输的信息中缺少MIME标识可能导致的情况很难估计,因为某些计算机系统可能不会出现什么故障,但某些计算机可能就会因此而崩溃。
在HTTP中,将电子邮件MIME header中的Content-Type那一行移植过来了,被服务器用来标识所发送多媒体数据的类型。如:Content-Type: text/HTML。
参考文献
[1] https://zh.wikipedia.org/wiki/MIME
[2] https://baike.baidu.com/item/MIME/2900607?fr=aladdin#4
[3] https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types
[4] http://www.dreamdu.com/xhtml/mime_type/
[5] http://www.cnblogs.com/jsean/articles/1610265.html
[6] http://www.ruanyifeng.com/blog/2008/06/mime.html
[7] http://www.maixj.net/ict/mime-type-16897
以上为本文的全部参考文献,对原作者表示感谢。