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解析比邮件源码简单多了,因为附件上传只是一个附件,不存在文本(格式)和图片的解析。只要找到节的开始和结束位置即可。
因篇幅问题不能全部显示,请点此查看更多更全内容