简介

无规矩不成方圆,无规范不成网络通信。正是在各种网络协议和规范的根底之上,才构建了咱们当初风行的互联网。明天给大家介绍的就是一个网络规范格局,叫做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:

阐明后缀类型
超文本标记语言文本.htmltext/html
xml文档.xmltext/xml
XHTML文档.xhtmlapplication/xhtml+xml
一般文本.txttext/plain
RTF文本.rtfapplication/rtf
PDF文档.pdfapplication/pdf
Microsoft Word文件.wordapplication/msword
PNG图像.pngimage/png
GIF图形.gifimage/gif
JPEG图形.jpeg,.jpgimage/jpeg
au声音文件.auaudio/basic
MIDI音乐文件mid,.midiaudio/midi,audio/x-midi
RealAudio音乐文件.ra, .ramaudio/x-pn-realaudio
MPEG文件.mpg,.mpegvideo/mpeg
AVI文件.avivideo/x-msvideo
GZIP文件.gzapplication/x-gzip
TAR文件.tarapplication/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形式:

NameReference
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/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!