搜索
您的当前位置:首页MIME协议的内容分析及解析说明

MIME协议的内容分析及解析说明

来源:小侦探旅游网


MIME协议的内容分析及解析说明

作者:李鹏博 时间:2016/06

一、MIME协议说明

MIME, 全称为“Multipurpose Internet Mail Extensions”, 比较确切的中文名称为“多用途互联网邮件扩展”。它是当前一种电子邮件技术规范。

MIME不是一种传输协议,而是一种编写规范,常常建立在SMTP协议、HTTP协议等之上。

二、MIME协议的使用场景

MIME协议可以在SMTP基础上,使得邮件可以传输任意二进制文件,广泛用在邮件源码的编写规范上。

除此之外,MIME协议可以在HTTP协议基础上通过POST方法上传附件,有很多站点是使用该协议完成,如SOHU邮箱、263邮箱、QQ邮箱(部分)等。

三、MIME协议包头内容说明及解析

以下,将统一名词为:boundary(节)、Content-Type(内容类型)。

1.建立在SMTP协议上的邮件编码

关于SMTP协议的说明请参见《简析SMTP协议》 ,此处主要说明客户端向服务器请求发送DATA之后,整个DATA包体(或一封邮件本身的编码)。邮件源码查看方式如下,在邮件客户端右击选择“更多操作”->“查看邮件源码”即可。

以上,是一封简单邮件的包头信息,其中关键字说明如下:

关于出现汉字,上述示例邮件并未出现汉字,如果出现汉字,就会出现对其编码的现象,比如,

这种情况就需要将=?GB2312?B?与?=之间的内容拿出来进行BASE64解码。这种情况出现在主题、文件名等位置。

关于Content-Type,Content-Type也是个很重要的关键字,他是该包体内容类型的说明。可能出现的有很多,常用的有:multipart/related;multipart/mixed; multipart/alternative;等。其中,multipart/alternative出现说明邮件中无附件且只有文字信息;multipart/related出现则说明无附件有文字信息和图片信息;multipart/mixed出现这说明邮件存在附件。这个参数是对一封邮件解析的一个关键参数。

关于boundary,boundary是分割一封邮件不同部分的节,这也是解析MIME还原文件的根本所在。拿下面的boundary举例。

boundary=\"----=_001_NextPart735470588356_=----\"

引号之间的是boundary关键字,该关键字一定会出现在邮件包体之中,该部分的解析在包体解析中说明。

2.建立在HTTP协议上的附件上传编码

HTTP上传附件有很多种方式,除了QQ、163的webmail会自行定义一些上传的协议之外,最常用和通用的是建立在HTTP上的MIME协议附件上传。

举例如下:

HTTP协议所包含的HOST等关键信息有: HOST:邮件上传的主机地址 Content-length:包体的大小

Content-Type:内容类型,MIME协议的附件上传都是form-data,

application/octet-stream类型的都是其他定义的上传协议,需要特殊分析,如QQ的/ftn_handler/等。

出了HTTP协议包含的这些关键字外,还有一些我们需要重点关注的。 关于boundary,首先我们从包头的Content-Type可以拿到boundary关键字,这是用来解析报文的关键信息。具体包体解析与SMTP协议类似,在下节包体解析中详细说明。

四、MIME协议包体说明及解析

该节不区分SMTP协议和HTTP协议,以SMTP协议的邮件源码为例,讲述MIME包体解析。HTTP协议的解析类似。

1. 包体格式示意图

2. 包体各节详细解析

以下所说的“第三节(文本节)”并不唯一,只是举例说明,是按照示例邮件进行区分讲述的。如果有多个附件,每个附件会占一个节。

Boundary目录

邮件源码包体一开始,是整个包体的boundary目录。格式如上所说。

上图中,先是第一节的关键字,及第二节的类型说明(可以看出第二节是图片);然后是第二节的关键字和第三节的类型(可以看出是文本)说明;接下来如果没有其他节,就是第三节的正式内容信息了。

第三节(文本节)

从上图可以看出,第三节是纯文本信息(Content-Type:text/plain),编码类型是base64,下面的文本拿出来进行base64解码即可拿到邮件的正文。如下。

上图是接下来的包体内容,除此之外还有一个第三节,这个第三节的类型是text/html,这部分内容是整个邮件的格式信息,不涉及内容信息。这部分决定了图片的出现的位置、字体的大小格式、缩进、颜色等等。一般做审计用不到该部分。

需要说明一点,该节结束的时候,有这样一个标志。

不止这里,所有的节的结束位置都会有这样一个标志,就是原来的boundary关键字加上“--”(原来有4个-,现在又6个-;HTTP协议上传原来没有,结束时有两个-)。

第二节(图片节)

下面是第二节的正式内容。

可以看出是个图片信息(content-type:image/jpeg),content-ID使用在上面说过的格式那一节的标志。如果需要解析出该图片,拿到下面的内容后,base64解码,然后以二进制写入文件即可还原。相同的,第二节结束也是用相同的方式标志结尾。

第一节(附件节)

最后是第一节,该节可以看出是附件节(Content-Type:

application/octet-stream),福建的名字在filename后面,只是需要注意的是,因为filename中存在汉字,所以被重新编码了,具体解码在头解析(上一节)讲过。

需要还原该部分就讲中间的内容base64解码写入文件即可。第一节的结尾标志也是一样的。

至此,邮件的整个包体源码解析完毕。

五、其他说明

操作建议

一般邮件中只会出现文本、图片、附件这三种形式。

文本只能有一份,也只占用一个节,要注意有个格式节和它是一样的节关键字。

图片可以有多个,每个图片占用一个节,循环处理即可。 附件也有多个节,每个附件占用一个节,循环处理即可。

注意事项

附件文件名存在中文时,邮件客户端会对其编码,解码后转换字符集即可,一般都是GB2312。但是,存在这种情况,有时会出现

(filename=\"=?UTT-8?...............\"),所以在base64解码后,需要根据字符类型进行

转换。

HTTP附件上传的特殊说明

附件上传的MIME解析比邮件源码简单多了,因为附件上传只是一个附件,不存在文本(格式)和图片的解析。只要找到节的开始和结束位置即可。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top