简介
无规矩不成方圆,无规范不成网络通信。正是在各种网络协议和规范的根底之上,才构建了咱们当初风行的互联网。明天给大家介绍的就是一个网络规范格局,叫做MIME,它的全称是Multipurpose Internet Mail Extensions,翻译过去就是多用途Internet邮件扩大。
那么有小伙伴开始纳闷了,原来是一个邮件的扩大协定,那么它跟咱们应用的Internet网络有什么关系呢?
不急,咱们缓缓道来。
MIME详解
在很久很久以前,计算机的一种风行的利用就是发邮件,最开始的时候,计算机世界的编码方式就只有ASCII一种,然而随着工夫的推移和各种利用需要的激增,ASCII格局曾经不能满足咱们的需要了,格局多类型的同时也照成了相互通信之间的艰难,于是一个对立的音讯格局规范产生了,这个就是MIME。
MIME能够让邮件不仅反对ASCII,还能够反对其余的编码方式。同时反对图片、音频、视频和应用程序等多种附件。
音讯体还能够反对多个part的汇合,当这样的音讯邮件应用MIME格局编码之后,就能够通过规范的邮件协定,比方SMTP、POP、IMAP等进行发送了。
因为MIME是一个规范,所以只有合乎这种规范的邮件都可能被解析胜利。
很快,MIME就在邮件世界被广泛应用,然而互联网曾经倒退到应用风行的HTTP协定来拜访万维网的时候了,MIME中定义的各种content types很天然的也成了其余协定中应用的content规范。
这种content types是在MIME头中定义的,应用程序接管到content type之后,会依据类型中指定的音讯类型,来采纳对应的应用程序对音讯内容进行解析。
MIME头
MIME头很重要,是应用程序用来判断音讯格局的首要根据。MIME头能够蕴含上面的字段。
MIME-Version
如果存在这个音讯头,阐明这个音讯是遵循的是MIME格局。它的值通常是1.0。
MIME-Version: 1.0
有仔细的小伙伴能够能要问了,既然有1.0,那么有没有1.1或者2.0呢?
很道歉,答案是没有。因为依据MIME 独特创建者 Nathaniel Borenstein 的说法,尽管引入MIME版本号是为了在后续中对MIME进行批改和降级。然而因为MIME标准并没有为将来MIME版本的降级进行良好的设计,所以不同的人可能对MIME版本升级后的解决形式都是不一样的。从而导致在MIME广泛应用的明天,很难对MIME标准进行降级。
所以,就应用1.0吧。
Content-Type
如果属性HTTP协定的同学,对这个头应该很相熟了吧,这个头示意的是音讯体的类型,蕴含了类型和子类型,比方:
Content-Type: text/plain
咱们常说的MIME type就是指这个标签。
上面是罕用的MIME type:
阐明 | 后缀 | 类型 |
---|---|---|
超文本标记语言文本 | .html | text/html |
xml文档 | .xml | text/xml |
XHTML文档 | .xhtml | application/xhtml+xml |
一般文本 | .txt | text/plain |
RTF文本 | .rtf | application/rtf |
PDF文档 | application/pdf | |
Microsoft Word文件 | .word | application/msword |
PNG图像 | .png | image/png |
GIF图形 | .gif | image/gif |
JPEG图形 | .jpeg,.jpg | image/jpeg |
au声音文件 | .au | audio/basic |
MIDI音乐文件 | mid,.midi | audio/midi,audio/x-midi |
RealAudio音乐文件 | .ra, .ram | audio/x-pn-realaudio |
MPEG文件 | .mpg,.mpeg | video/mpeg |
AVI文件 | .avi | video/x-msvideo |
GZIP文件 | .gz | application/x-gzip |
TAR文件 | .tar | application/x-tar |
任意的二进制数据 | application/octet-stream |
Content-Disposition
Content-Disposition是在RFC 2183中增加的一个字段,示意的是音讯的展现款式。因为之前的音讯只是定义了它的音讯格局,并没有思考音讯是如何展现的问题,尤其是对于邮件来说。
比方邮件中插入了一个图片,那么这个图片是在咱们读音讯的时候内联展现呢?还是以附件的模式,必须要用户下载能力看到呢?
如果是在HTTP中,响应头字段Content-Disposition:attachment 通常用作提醒客户端将响应注释出现为可下载文件。通常,当收到这样的响应时,Web浏览器会提醒用户将其内容保留为文件,而不是将其显示为浏览器窗口中的页面。
Content-Transfer-Encoding
这个字段是做什么用的呢?
咱们晓得,随着数据格式越来越多,传统的ASCII曾经不能反对宏大的内容示意模式,所以呈现了超出ASCII范畴的内容示意模式如Unicode。
然而对于SMTP服务器来说,可能传输或者意识的编码是无限的,如果要传输二进制内容,则须要应用肯定的transfer encodings形式对二进制内容进行转换。这就是Content-Transfer-Encoding的意义。
依据RFC和IANA的定义,有上面几个transfer encodings形式:
Name | Reference |
---|---|
7bit | [RFC2045] |
8bit | [RFC2045] |
binary | [RFC2045] |
quoted-printable | [RFC2045] |
base64 | [RFC2045] |
具体transfer encodings的含意,能够参考我后续的文章,这里只做简略的介绍。
对于一般的SMTP服务器来说,能够反对7bit、quoted-printable和base64这三种编码方式。
对于8BITMIME SMTP extension的SMTP服务器来说,还反对8bit这种编码方式。
对于反对BINARYMIME SMTP extension的SMTP服务器来说,还反对binary这种编码方式。
Encoded-Word
依据RFC 2822,确认音讯头中的字段名和值必须应用ASCII字符。如果音讯中蕴含非ASCII字符,则须要进行编码。这个编码就是encoded-word 。
编码的格局如下:
"=?charset?encoding?encoded text?=".
charset示意的是原音讯的编码,encoding示意的是应用的编码方式,encoded text是编码后的音讯。
Multipart messages
最初,介绍一下Multipart messages,咱们晓得一个音讯是有对应的音讯类型:Content-Type的。
如果是简单的音讯,那么它外面的音讯类型可能不止一种。所以这时候就须要用到Multipart messages,也就是将音讯分为多个局部,每个局部都有一个Content-Type。
这种类型在邮件中比拟常见。上面是一个Multipart messages的例子,在Content-Type中指定了一个音讯的宰割标记boundary。
MIME-Version: 1.0Content-Type: multipart/mixed; boundary=frontierThis is a message with multiple parts in MIME format.--frontierContent-Type: text/plainThis is the body of the message.--frontierContent-Type: application/octet-streamContent-Transfer-Encoding: base64PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==--frontier--
总结
以上就是MIME的根本介绍,在其中,咱们提到了几种transfer encodings办法,敬请期待后续文章。
本文已收录于 http://www.flydean.com/12-mime/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」,懂技术,更懂你!