第1章. MIME概述
MIME, 全称为“Multipurpose Internet Mail Extensions”, 比较确切的中文名称为“多用途互联网邮件扩展”。它是当前广泛应用的一种电子邮件技术规范,基本内容定义于RFC 2045-2049(注意RFC1521和RFC1522是它的过时版本)。
MIME试图在不改变SMTP协议和RFC822(邮件格式标准)的基础上,使得邮件可以传送任意二进制文件。为此,它在这些协议之上,采取了一些措施,这就是我们下面所要重点讲述的内容。
第2章. MIME详解
2.1. 改进措施
一封邮件包括信封、邮件头和邮件体等三个部分。信封显然可以不含有二进制信息,而其它两部分则可能包含任意二进制序列,因此需要加以改进。MIME正是抓住了这两个地方来对他们加以改进。
1) 新增了一些邮件头信息,用来协商MIME的一些参数。
2) 定义了许多邮件内容的格式,对多媒体电子邮件的表示方法进行了标准化。
3) 定义了传送编码,从而可以传送任意二进制文件。
在这里,我还是要不厌其烦地强调指出,所有的改进措施都是建立在不改变原来的SMTP协议和RFC822的基础上的。事实上,我们可以把这些改进措施,看成是在用SMTP等发送邮件前所采取的预处理。
2.2. 一封简单邮件的源码
为了对MIME邮件有个直观的了解,先给出一封简单邮件的源码。源码中,行号和行号后的空格是为了分析方便而另外加的,“... ... ... ...”表示此处省略了大段编码。
1 From: "bhw98" <bhw98@sina.com>
2 Reply-To: bhw98@sina.com
3 To: <bluesky7810@163.com>
4 Subject: Re: help
5 X-Mailer: Foxmail 4.2 [cn]
6 Mime-Version: 1.0
7 Content-Type: multipart/alternative;
8 boundary="=====002_Dragon307572345230_====="
9
10
11 This is a multi-part message in MIME format.
12
13 --=====002_Dragon307572345230_=====
14 Content-Type: text/plain; charset="GB2312"
15 Content-Transfer-Encoding: quoted-printable
16
17 bluesky7810=A3=AC=C4=FA=BA=C3=A3=A1
18
19 =A1=A1=A1=A1=D4=DA=CF=C2=C6=AA=D7=EE=BA=F3=BF=C9=D2=D4=CF=C2=D4=D8=B0=A1=A3=AC=C4=E3
... ... ... ...
30 =A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A1=A12003-04-07
31
32 --=====002_Dragon307572345230_=====
33 Content-Type: text/html; charset="GB2312"
34 Content-Transfer-Encoding: quoted-printable
35
36 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
37 <HTML><HEAD>
38 <META content=3D"text/html; charset=3Dgb2312"=
39 http-equiv=3DContent-Type>
40 <META content=3D"MSHTML 5.00.2920.0" name=3DGENERATOR>
... ... ... ...
79 </HTML>
80
81 --=====002_Dragon307572345230_=====--
82
我们可以在用户代理中查看到这样的源码。例如可以利用用户代理来查看一封邮件的原始编码。例如在Foxmail中,选定邮件后,单击右键,选择“原始信息”项即可。至于源码的具体意思则正是后续内容所要讲的。
2.3. 邮件头
2.3.1. 邮件头的域
邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的,解码时要过滤掉。如例2的7-8行分别属于一个域。
表 1中给出了邮件头中常见的域,域的含义,和域值的添加者。
域名
|
含义
|
添加者
|
Received
|
传输路径
|
各级邮件服务器
|
Return-Path
|
回复地址
|
目标邮件服务器
|
Delivered-To
|
发送地址
|
目标邮件服务器
|
Reply-To
|
回复地址
|
邮件的创建者
|
From
|
发件人地址
|
邮件的创建者
|
To
|
收件人地址
|
邮件的创建者
|
Cc
|
抄送地址
|
邮件的创建者
|
Bcc
|
暗送地址
|
邮件的创建者
|
Date
|
日期和时间
|
邮件的创建者
|
Subject
|
主题
|
邮件的创建者
|
Message-ID
|
消息ID
|
邮件的创建者
|
MIME-Version
|
MIME版本
|
邮件的创建者
|
Content-Type
|
内容的类型
|
邮件的创建者
|
Content-Transfer-Encoding
|
内容的传输编码方式
|
邮件的创建者
|
表 1 邮件头中常见的域
非标准的、自定义域名都以X-开头,例如X-Mailer, X-MSMail-Priority等,通常在接收和发送邮件的是同一程序时才能理解它们的意义。除了后面两个域外,其他的域的意思很明了,所以下面只对后两个域做解释。
2.3.2. Content-Type域
Content-Type域,即内容类型域,它用来说明传输的内容的类型。Cotent-Type域又由“主类型/子类型”构成,主类型有text, image, audio, video, application, multipart, message等,分别表示文本、图片、音频、视频、应用、分段、消息等。每个主类型都可能有多个子类型,如text类型就包含plain, html, xml, css等子类型。以X-开头的主类型和子类型,同样表示自定义的类型,未向IANA正式注册,但大多已经约定成俗了。如application/x-zip-compressed是ZIP文件类型。在Windows中,注册表的“HKEY_CLASSES_ROOT\MIME\Database\Content Type”内列举了除multipart之外大部分已知的Content-Type。
各种各种类型一般都可以带参数。至于参数的形式,RFC里有很多补充规定,有的允许带几个参数,较为常见的如表 2所示
主类型
|
参数名
|
含义
|
text
|
charset
|
字符集
|
image
|
name
|
名称
|
application
|
name
|
名称
|
multipart
|
boundary
|
边界
|
表 2 常见类型的参数
2.3.3. Content-Transfer-Encoding域
Content-Transfer-Encoding域即传送编码域,它用来说明后面传输的内容的编码方式。
Content-Transfer-Encoding共有Base64, Quoted-printable, 7bit, 8bit, Binary等几种。其中7bit是缺省的编码方式。电子邮件源码最初设计为全部是可打印的ASCII码的形式。非ASCII码的文本或数据要编码成要求的格式,如上面的三个例子。Base64, Quoted-Printable是在非英语国家使用最广使的编码方式。Binary方式只具有象征意义,而没有任何实用价值。关于Base64编码和Quoted-Printable编码请参考RFC文档或另外一篇文章《SMTP协议分析》。
近年来,国内多数邮件服务器已经支持8bit方式,因此只在国内传输的邮件,特别是在邮件头中,可直接使用8bit编码,对汉字不做处理。如果邮件要出国,还是老老实实地按Base64或Quoted-printable编码才行
2.4. 邮件体
邮件体的类型由邮件头的“Content-Type”域指出。常见的简单类型有text/plain(纯文本)和text/html(超文本)。
源码中出现的multipart类型,是MIME邮件的精髓。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed, multipart/related和multipart/alternative。从它们的名称,不难推知这些类型各自的含义和用处。它们之间的层次关系可归纳为图 1所示
+------------------------- multipart/mixed ----------------------+ | +----------------- multipart/related -------------+ | | | | | | | | |
| | +----multipart/alternative ---+ +----------+ | +------+ | | | | | | 内嵌资源 | | | 附件 | | | | | +-----------+ +----------+ | +----------+ | +------+ |
| | | | 纯文本正文| |超文本正文| | | |
| | | +-----------+ +----------+ | +----------+ | +------+ |
| | | | | 内嵌资源 | | | 附件 | | | | +-----------------------------+ +----------+ | +------+ |
| | | | | +-------------------------------------------------+ | +-----------------------------------------------------------------+
图 1 邮件体的层次关系图
可以看出,如果在邮件中要添加附件,必须定义multipart/mixed段;如果存在内嵌资源,至少要定义multipart/related段;如果纯文本与超文本共存,至少要定义multipart/alternative段。什么是“至少”?举个例子说,如果只有纯文本与超文本正文,那么在邮件头中将类型扩大化,定义为multipart/related,甚至multipart/mixed,都是允许的。
multipart诸类型的共同特征是,在段头指定“boundary”参数字符串,段体内的每个子段以此串定界。所有的子段都以“--”+boundary行开始,父段则以“--”+boundary+“--”行结束。段与段之间也以空行分隔。在邮件体是multipart类型的情况下,邮件体的开始部分(第一个“--”+boundary行之前)可以有一些附加的文本行,相当于注释,解码时应忽略。段间也可以有一些附加的文本行,不会显示出来,如果有兴趣,不妨验证一下。
结合boundary定界和multipart层次关系图,我们分析一下源码中的邮件体层次与段嵌套关系。 在源码中,10-12行是附加文本行,13-82行是multipart/alternative型的段,包含两个子段:13-30行是纯文本正文,32-79行是超文本正文。
需要补充说明地是,构成邮件体的各段有自己的属性,这些属性由段头的域来说明。表 3给出了段头中常见的域。
域名
|
含义
|
Content-Type
|
段体的类型
|
Content-Transfer-Encoding
|
margin-top: 0cm; margin-right: 0cm; margin-bottom: 0pt; margin-left: 0cm; line-height: 21px; pad
分享到:
Global site tag (gtag.js) - Google Analytics
|
相关推荐
**MIME协议分析** MIME,全称“Multipurpose Internet Mail Extensions”,中文名为“多用途互联网邮件扩展”,是一种广泛应用于电子邮件系统的规范。该协议的基本内容最初定义于RFC 2045-2049,取代了较早的RFC ...
**MIME协议简介** MIME,全称Multipurpose Internet Mail Extensions,是一种标准,它扩展了互联网邮件协议(如SMTP),使得邮件系统能够处理多种类型的数据,包括文本、图像、音频、视频等。在传统的电子邮件系统...
通过协议分析软件,可以观察到客户端请求邮件服务器的数据包,包括获取邮箱信息、下载邮件内容等操作。 3. **CMailServer**:这是一款用于搭建邮件服务器的软件,它提供了创建和管理用户邮箱,以及处理SMTP和POP3...
在这个名为"Wireshark协议分析之SMTP.zip"的压缩文件中,包含了四个*.pcapng数据包,这些数据包记录了SMTP通信的不同阶段,特别是涉及跨域邮件传输和附件上传的场景。 首先,我们来看"mail_sender_client_1.pcapng...
1. **协议分析软件**:Sniffer Pro、Omnipeek和科来网络分析系统是常见的网络协议分析工具,用于捕获、解析和分析网络流量。它们可以帮助网络管理员监控网络活动,发现潜在的安全问题或异常行为。 2. **MSN协议分析...
MIME类型是互联网标准,用于标识通过网络传输的数据类型,比如在电子邮件、HTTP协议中,以及在上传或下载文件时都会用到。它是一个字符串,通常由两部分组成,第一部分是数据的大类别,如“text”、“image”或...
在信息技术领域,MIME(Multipurpose Internet Mail Extensions)是一种标准,用于定义非ASCII字符的数据类型,尤其在电子邮件、Web和其他Internet协议中广泛应用。MIME扩展了早期的纯文本邮件标准,使得我们可以...
* 具有元信息:HTTP 协议的头部信息类似 MIME。 Ethereal 分析 HTTP 协议 使用 Ethereal 分析 HTTP 协议的过程分为六个步骤: 1. 启动 Ethereal。 2. 对 Capture Options 各个选项设置。 3. 点击 Start 按钮开始...
6.4.5 MIME信件的语法分析 6.5 E-mail乱码 6.5.1 乱码的常见形式及形成原因 6.5.2 避免乱码的方法 6.6 E-mail程序开发 6.6.1 建立工程项目 6.6.2 关键代码分析 第7章 网络监控、流量统计与资源搜索 7.1 网络...
该压缩包包含三个文档,分别是SMTP协议详解,POP3协议详解,MIME规范详解,文档中详细介绍了一个邮件发送和接收的过程分析,协议本身的包含的命令和工作过程,为开发邮件代理的客户端提供技术基础。如下是部分SMTP...
【MSN协议分析】 MSN Messenger,曾经流行的即时通讯软件,依赖特定的协议进行通信。这个协议主要涉及客户端与三种服务器——dispatch服务器、notification服务器和tchboard服务器之间的交互。客户端通过端口1863与...
在信息技术日新月异的今天,电子邮件作为信息传输的重要工具,其背后的协议分析显得尤为重要。CMimeStream,作为一个专门处理邮件内容流的库,为开发者提供了高效且灵活的方式来解析和生成MIME格式的电子邮件。在...
在MIME协议中,有两类常见的编码方式:Quoted-Printable(引号可打印)和Base64,这两种编码主要用于处理包含特殊字符的数据,确保它们能够在电子邮件或其他文本传输系统中正确地编码和解码。 **Quoted-Printable...
通过分析这个类,开发者可以学习到如何在.NET 2.0环境中构建一个功能完备的邮件客户端,特别是处理MIME邮件的技巧。 总的来说,创建一个全面支持MIME的POP3邮件程序是一项技术性强且实用的任务,它涉及了邮件协议、...
3. 灵活性:HTTP协议允许传输任何类型的数据,通过Content-Type字段指定数据的MIME类型。这使得HTTP能适应各种数据格式,如HTML、JSON、图片、视频等。 4. 无连接:每次HTTP请求都建立一个新的TCP连接,请求完成后...
RTSP协议具有良好的可扩展性,允许轻易添加新方法和参数,并且其语法结构可被HTTP或MIME解析器解析。为了安全性,RTSP利用了网页安全机制。此外,RTSP独立于传输协议,可以使用UDP或TCP等不同类型的传输协议。它还...
MIME(Multipurpose Internet Mail Extensions)则是一种标准,用于定义在网络上传输的数据类型,最初是为了电子邮件系统,但现在广泛应用于各种互联网协议,包括Web内容和文件上传。 在"swing+mime测试文件类型...
【DNS协议分析】 DNS(Domain Name System)是互联网的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,允许用户通过更易记的域名来访问网站。 1. DNS工作过程: - 客户端发起DNS查询,询问服务器...
SDP不是传输协议,而是与多种协议(如SAP、SIP、RTSP、MIME等)结合使用的描述格式。它不处理媒体内容的协商,而是专注于描述媒体信息,而媒体协商通常由RTSP来完成。 SDP协议的结构非常简洁,由多个文本行组成,每...