写点什么

网络标准之: 永远是 1.0 版本的 MIME

作者:程序那些事
  • 2022 年 2 月 25 日
  • 本文字数:2257 字

    阅读完需:约 7 分钟

网络标准之:永远是1.0版本的MIME

简介

无规矩不成方圆,无标准不成网络通信。正是在各种网络协议和标准的基础之上,才构建了我们现在流行的互联网。今天给大家介绍的就是一个网络标准格式,叫做 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:


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 方式:



具体 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=frontier
This is a message with multiple parts in MIME format.--frontierContent-Type: text/plain
This is the body of the message.--frontierContent-Type: application/octet-streamContent-Transfer-Encoding: base64
PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==--frontier--
复制代码

总结

以上就是 MIME 的基本介绍,在其中,我们提到了几种 transfer encodings 方法,敬请期待后续文章。


本文已收录于 http://www.flydean.com/12-mime/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

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

发布于: 刚刚阅读数: 2
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
网络标准之:永远是1.0版本的MIME