zoukankan      html  css  js  c++  java
  • MIME格式解析

     本文介绍常见的MIME数据格式。


    在协议还原中,不可避免地,经常会在各类协议内容中碰到MIME格式,例如标准邮件协议、HTTP协议。


    那么,什么是MIME呢?


    MIME是英文Multipurpose Internet Mail Extensions的缩写,即多用途互联网邮件扩展。从名字就可以看出,它产生于对邮件内容编码的过程。它是一个一个互联网标准,在一系列RFC文档中进行了定义和更新,例如RFC6532、RFC8098、RFC2231、RFC6838、RFC4289、RFC2049等。


    这里需要指出的是,虽然MIME是邮件协议格式的扩展,但并不是所有邮件eml都是MIME格式,一封邮件的格式可能比MIME更简单,同时,MIME并不局限于在邮件中使用,在很多HTTP报文中,也会发现MIME的身影。


    了解了MIME格式,就可以从中提取所需的数据了。


    下面将以一封邮件为例子,来对MIME格式进行解析说明。



    01

    邮件例子


    一个MIME格式的邮件例子如下:

    Return-Path: <mlemos@acm.org>

    To: Manuel Lemos <mlemos@linux.local>

    Subject: Testing Manuel Lemos' MIME E-mail composing and sending PHP class: HTML message

    From: mlemos <mlemos@acm.org>

    Reply-To: mlemos <mlemos@acm.org>

    Sender: mlemos@acm.org

    X-Mailer: http://www.phpclasses.org/mimemessage $Revision: 1.63 $ (mail)

    MIME-Version: 1.0

    Content-Type: multipart/mixed; boundary="652b8c4dcb00cdcdda1e16af36781caf"

    Message-ID: <20050430192829.0489.mlemos@acm.org>

    Date: Sat, 30 Apr 2005 19:28:29 -0300


    --652b8c4dcb00cdcdda1e16af36781caf

    Content-Type: text/plain; charset=utf-8

    Content-Transfer-Encoding: base64


    aGVsbG8uIOWNj+iuruWIhuaekOS4jui/mOWOnw==


    --652b8c4dcb00cdcdda1e16af36781caf

    Content-Type: text/plain; name="attachment.txt"

    Content-Transfer-Encoding: base64

    Content-Disposition: attachment; filename="attachment.txt"


    VGhpcyBpcyBqdXN0IGEgcGxhaW4gdGV4dCBhdHRhY2htZW50IGZpbGUgbmFtZWQgYXR0YWNobWVu

    dC50eHQgLg==


    --652b8c4dcb00cdcdda1e16af36781caf--


    在这封邮件里,包含了三个MIME的语句:

    MIME-Version: 

    Content-Type: 

    Content-Transfer-Encoding: 

    Content-Disposition: 


    从这个MIME的典型应用中,可以看到,MIME的精髓是数据的分段分类描述,以及数据的可嵌套性和可编码性。


    02


    格式说明


    一个MIME消息由两部分组成,分别是消息头和消息体。


    在消息头中,语句“MIME-Version: 1.0”是必须的。


    而“Content-Type:”项,则是描述数据的类型和编码,默认为“text/plain”,“/”前后分别为主要类型和次要类型,常见的类型有:

    text/plain

    text/html

    image/jpeg

    audio/mpeg

    video/3gpp

    application/gzip

    application/rtf

    multipart/alternative


    详细的类型可参考http://www.iana.org/assignments/media-types/media-types.xhtml。


    对每个Content-Type:”,有不同的参数,如charset,name,boundary等。


    主类型“multipart”是MIME的精髓所在,它将多种数据编码在一起,常见的有“multipart/mixed“,” multipart/related“和”multipart/alternative”。


    当“Content-Type:”为“multipart/mixed”等时,表示数据为多种内容的混合,此时会有类似boundary="652b8c4dcb00cdcdda1e16af36781caf"的分隔线描述,分隔线会将数据内容分隔成各自独立的部分,在各部分中,分别有独立的数据内容描述。分隔线的前后,会有“--”,处理过程中过滤即可。


    Content-Transfer-Encoding: ”描述的是内容的编码转换格式。一般有“base64”和“quoted-printable”两种,即表示内容为BASE64编码和QP编码。


    Content-Disposition: ”描述的是数据的安排方式,如“attachment”表示为附件,“inline”表示为内嵌数据,这些有参数“filename”。


    消息体是消息头的各个描述及分隔线之外,在各个0x0d0x0a对之间的内容,一般是各种编码了的数据。


    虽然介绍了这么多,但在数据解析中用起来很简单,只需要找到各个数据段的描述,名称,内容,就可进行编码转换、形成结构化数据并保存了。

    640?wx_fmt=jpeg

    长按进行关注。





  • 相关阅读:
    js中属性节点的应用
    改变属性的值的方法
    获取所有节点的一些方法的属性(有待改善)
    JS中修改属性
    获取节点的几种小案例
    在页面上点击按钮,出现弹出框
    SelectionSort,选择排序
    BubbleSort冒泡排序
    混合app
    使用(Unicode字符)让inline水平元素换行
  • 原文地址:https://www.cnblogs.com/protosec/p/11673334.html
Copyright © 2011-2022 走看看