天天看点

MIME笔记

我最近对互联网的一些技术细节很感兴趣,打算做一系列的笔记。

=================

mime笔记

1.

mime的全称是"multipurpose internet mail extensions",中译为"多用途互联网邮件扩展",指的是一系列的电子邮件技术规范,主要包括rfc 2045、rfc 2046、rfc 2047、rfc 4288、rfc 4289和rfc 2077。

顾名思义,mime是对传统电子邮件的一个扩展,现在已经成为电子邮件实际上的标准。

2.

传统的电子邮件是1982年定下技术规范的,文件是rfc 822。

它的一个重要特点,就是规定电子邮件只能使用ascii字符。这导致了三个结果:1)非英语字符都不能在电子邮件中使用;2)电子邮件中不能插入二进制文件(如图片);3)电子邮件不能有附件。

这实际上无法接受的,因此到了1992年,工程师们决定扩展电子邮件的技术规范,提出一系列补充规范,这就是mime的由来。

3.

下面是一封传统的电子邮件。

from: "tommy lee" <[email protected]> to: "jack zhang" <[email protected]> subject: test date: wed, 17 may 2000 19:08:29 -0400 message-id: <[email protected]> hello world.

从上面可以看出,这封信的发信人地址是[email protected],收信人地址是[email protected],邮件主题是test,发送时间是2000年5月17日,邮件内容是"hello world."。

在结构上,这封信分为三个部分:首先是信件头,然后是一个空行,最后是信件内容。收信人的客户端软件只会显示最后一部分,要查看全信,必须使用"查看原始邮件"功能。

4.

mime对传统电子邮件的扩展,表现在它在信件头部分添加了几条语句,主要有三条。

第一条是:

mime-version: 1.0

这条语句是必须的,而且1.0这个版本值是不变的,即使mime本身已经升级了好几次。

有了这条语句,收信端就知道这封信使用了mime规范。

5.

第二条语句是:

content-type: text/plain; charset="iso-8859-1"

这一行是极端重要的,它表明传递的信息类型和采用的编码。

content-type表明信息类型,缺省值为" text/plain"。它包含了主要类型(primary type)和次要类型(subtype)两个部分,两者之间用"/"分割。主要类型有9种,分别是application、audio、example、image、message、model、multipart、text、video。

每一种主要类型下面又有许多种次要类型,常见的有:

text/plain:纯文本,文件扩展名.txt text/html:html文本,文件扩展名.htm和.html image/jpeg:jpeg格式的图片,文件扩展名.jpg image/gif:gif格式的图片,文件扩展名.gif audio/x-wave:wave格式的音频,文件扩展名.wav audio/mpeg:mp3格式的音频,文件扩展名.mp3 video/mpeg:mpeg格式的视频,文件扩展名.mpg application/zip:pk-zip格式的压缩文件,文件扩展名.zip

如果信息的主要类型是"text",那么还必须指明编码类型"charset",缺省值是ascii,其他可能值有"iso-8859-1"、"utf-8"、"gb2312"等等。

整个content-type这一行,不仅使用在电子邮件,后来也被移植到了http协议中,所以现在只要是在网上传播的http信息,都带有content-type头,以表明信息类型。

6.

前面已经说过,电子邮件的传统格式不支持非ascii编码和二进制数据。因此mime规定了第三条语句:

content-transfer-encoding: base64

7.

下面是一封我收到的邮件的源码:

date: wed, 18 jun 2008 18:07:51 +0800 (cst) from: xxx <[email protected]> to: [email protected] message-id: <14410503.1073611213783671983.javamail.coremail@bj163app54.163.com> subject: =?gbk?b?xoo6ww==?= content-type: multipart/alternative; boundary="----=_part_287491_22998031.1213783671982" ------=_part_287491_22998031.1213783671982 content-type: text/plain; charset=gbk iaq4+b7dsr+209pqudi55raoo6yyu7xd1nq12le9ym66zs341b7jz7nsz+dtprxetqvo96osx+ve 49taxoo1xlkpv83w0aogiarw0ln6yr2x6tpvic0gyo7su7fltctn+mlnynxwvgoktcs12jey1cxn vmasyb6z/aost/hu8s7sw8fxt76/xoo1xm/gudju8mjooapqu9c7us/x96ohtmvnvmas1nq4vbz+ wo/d5g== content-type: text/html; charset=gbk content-transfer-encoding: quoted-printable <div> </div> <div>=b8=f9=be=dd=b2=bf=b6=d3=d3=d0=b9=d8=b9=e6=b6=a8=a3=ac=b2=bb=b5=c3=d4= =da=b5=d8=b7=bd=c8=ce=ba=ce=cd=f8=d5=be=c9=cf=b9=d2=cf=e0=d3=a6=b5=c4=b6=ab= =ce=f7=a3=ac=c7=eb=c4=e3=d4=da=c4=e3=b5=c4=b2=a9=bf=cd=d6=d0</div> <div>  ......

可以看到这封信的mime语句是:

boundary="----=_part_287491_22998031.1213783671982"

"content-type: multipart/alternative;"表明这封信的内容,是纯文本和html文本的混合。另两个可能的值是multipart/mixed和multipart/related,分别表示"信件内容中有二进制内容"和"信件带有附件"。

"boundary="----=_part_287491_22998031.1213783671982"

"表明不同信件内容的分割线是"----=_part_287491_22998031.1213783671982",它通常是一个很长的随机字符串。

信件内容部分又有两个子信件头:

它们表明,第一个部分是gbk编码的纯文本,编码转换格式是base64。第二个部分是gbk编码的html文本,编码转化格式是quoted-printable。

[延伸阅读]

(完)