- 浏览: 148297 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
zcqshine:
学习了...正在想怎么用java解释邮件内容的
MIME编码介绍 -
zxz87:
douglas_lhs 写道
搞不懂啊,为什么要用GBK吗?
...
Struts2.0 中文乱码(我的解决方法) -
ember_319:
配置还算比较容易,看看官方文档就可以了。问题是使用起来,怎样来 ...
struts2.0.6 + tiles 使用配置过程 -
fr1202:
字段必须均为public,否则出错
动态调用 简单Java Bean 的get/set 方法 -
douglas_lhs:
搞不懂啊,为什么要用GBK吗?
UTF-8搞不定的吗?
Struts2.0 中文乱码(我的解决方法)
以下是抄袭过来的 抄袭网址http://www.cnblogs.com/upzone/archive/2007/04/09/705286.html
MIME的编码介绍(由网上资料和实践经验整合)
一、MIME: Multipurpose Internet Mail Extensions
英 国帝国大学计算机在线字典FOLDOC对MIME的解释为:“多部分(multi-part)、多媒体电子邮件和WWW超文本的一种编码标准,用于传送诸 如图形、声音和传真等非文本数据。MIME定义于RFC1341,用MIMENCODE的方法将二进制数据转换成为一种被称为BASE64的ASCII子 集的字符的组合。”
Internet上有专门讨论MIME的新闻组: comp.mail.mime。该新闻组的FAQ可以从下面的网点获得:
http://www.cis.ohio-state.edu/hypertext/faq/usenet/mail/mime-faq/mime0/faq.html
MIMENCODE 最早称为MMENCODE,提出用MIMENCODE代替UUENCODE,是因为UUENCODE使用了一些字符在一些邮件网关(特别是那些转换 ASCII和EBCDIC码的网关)中造成传输障碍,(还有一些软件不能对所有 UUENCODE 的算法进行正确解码而导致邮件的阅读困难),因此 MIME 被设计用于替代UUENCODE,但是结果是这些协议共存。
在MIME出台之前,使用RFC 822只能发送基本的ASCII码文本信息,邮件内容如果要包括二进制文件、声音和动画等,实现起来非常困难。
MIME提供了一种可以在邮件中附加多种不同编码文件的方法,弥补了原来的信息格式的不足。实际上不仅仅是邮件编码,现在MIME经成为HTTP协议标准的一个部分。
二、MIME编码方式简介
对邮件进行编码最初的原因是因为 Internet 上的很多网关不能正确传输8bit内码的字符,比如汉字等。编码的原理就是把8bit的内容转换成7bit的形式以能正确传输,在接收方收到之后,再将其还原成8bit的内容。
在MIME 协议之前,邮件的编码曾经有过UUENCODE等编码方式 ,但是由于MIME协议算法简单,并且易于扩展,现在已经成为邮件编码方式的主流,不仅是用来传输8bit的字符,也可以用来传送二进制的文件,如邮件附 件中的图像、音频等信息,而且扩展了很多基于MIME 的应用。从编码方式来说,MIME定义了两种编码方法Base64与QP(Quote-Printable)。
1.Base64编码
Base64是一种通用的方法,其原理很简单,就是把三个Byte的数据用4个Byte表示。在这四个Byte中,实际用到的都只有前面6bit,这样就不存在只能传输7bit的字符的问题了。Base64的缩写一般是“B”。
Base64将输入的字符串或一段数据编码成只含有{'A'-'Z', 'a'-'z', '0'-'9', '+', '/'}这64个字符的串,'='用于填充。
其编码的方法是,将输入数据流每次取6bit,用此6bit的值(0-63)作为索引去查表,输出相应字符。
这样,每3个字节将编码为4个字符(3×8 → 4×6);不满4个字符的以'='填充。
有的场合,以“=?charset?B?xxxxxxxx?=”表示xxxxxxxx是Base64编码,且原文的字符集是charset。在段体内则直接编码,适当时机换行,MIME建议每行最多76个字符。
Base64的算法很简单,它将字符流顺序放入一个24位的缓冲区,缺字符的地方补零。
然后将缓冲区截断成为4个部分,高位在先,每个部分6位,用64个字符重新表示。如果输入只有一个或两个字节,那么输出将用等号“=”补足。这可以隔断附加的信息造成编码的混乱。
2.QP编码
另 一种方法是QP(Quote-Printable) 方法,通常缩写为“Q”方法,其原理是把一个8bit的字符用两个16进制数值表示,然后在前面加“=”。所以我们看到经过QP编码后的文件通常是这个样 子:=B3=C2=BF=A1=C7=E5=A3= AC=C4=FA=BA=C3=A3=A1。
Quoted -printable根据输入的字符串或字节范围进行编码,若是不需编码的字符,直接输出。若需要编码,则先输出'=',后面跟着以2个字符表示的十六进 制字节值。有的场合,以“=?charset?Q?xxxxxxxx?=”表示xxxxxxxx是Quoted-printable编码,且原文的字符集 是charset。在段体内则直接编码,适当时机换行,换行前额外输出一个'='。
三、MIME的头信息
邮件头
在邮件头中,有很多从RFC 822沿用的域名,MIME也增加了一些。常见的标准域名和含义如下:
域名 含义 添加者
Received 传输路径 各级邮件服务器
Return-Path 回复地址 目标邮件服务器
Delivered-To 发送地址 目标邮件服务器
Reply-To 回复地址 邮件的创建者
From 发件人地址 邮件的创建者
To 收件人地址 邮件的创建者
Cc 抄送地址 邮件的创建者
Bcc 暗送地址 邮件的创建者
Date 日期和时间 邮件的创建者
Subject 主题 邮件的创建者
Message-ID 消息ID 邮件的创建者
MIME-Version MIME版本 邮件的创建者
Content-Type 内容的类型 邮件的创建者
Content-Transfer-Encoding 内容的传输编码方式 邮件的创建者
非标准的、自定义域名都以X-开头,例如X-Mailer, X-MSMail-Priority等,通常在接收和发送邮件的是同一程序时才能理解它们的意义。
段头
在段头中,大致有如下一些域:
域名 含义
Content-Type 段体的类型
Content-Transfer-Encoding 段体的传输编码方式
Content-Disposition 段体的安排方式
Content-ID 段体的ID
Content-Location 段体的位置(路径)
Content-Base 段体的基位置
有的域除了值之外,还带有参数。值与参数、参数与参数之间以“;”分隔。参数名与参数值之间以“=”分隔。
1.MIME-Version
表示使用的MIME的版本号,一般是1.0;
如:
MIME-Version: 1.0
2.Content-Type
Content-Type定义了正文的类型,我们实际上是通过这个标识来知道正文内是什么类型的文件。比如:text/plain 表示的是无格式的文本正文,text/html 表示的 Html 文档,image/gif 表示的是 gif 格式的图片等等。Content-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里有很多补充规定,有的允许带几个参数,较为常见的有:
主类型 参数名 含义
text charset 字符集
image name 名称
application name 名称
multipart boundary 边界
multipart类型
邮件中常用到的复合类型:multipart。
multipart类型表示正文是由多个部分组成的,后面的子类型说明的是这些部分之间的关系。
邮件中用到的三个类型有:
(1).multipart/alternative:表示正文由两个部分组成,可以选择其中的任意一个。主要作用是在征文同时有text格式和html 格式时,可以在两个正文中选择一个来显示,支持 html 格式的邮件客户端软件一般会显示其 HTML 正文,而不支持的则会显示其Text正文;
(2).multipart/mixed:表示文档的多个部分是混合的,指正文与附件的关系。如果邮件的MIME类型是multipart/mixed,即表示邮件带有附件。
(3).multipart/related:表示文档的多个部分是相关的,一般用来描述 Html 正文与其相关的图片。
multipart类型,是MIME邮件的精髓。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。它们之间的层次关系可归纳为下图所示:
+------------------------- multipart/mixed ----------------------------+
| |
| +----------------- multipart/related ------------------+ |
| | | |
| | +----- multipart/alternative ------+ +----------+ | +------+ |
| | | | | 内嵌资源 | | | 附件 | |
| | | +------------+ +------------+ | +----------+ | +------+ |
| | | | 纯文本正文 | | 超文本正文 | | | |
| | | +------------+ +------------+ | +----------+ | +------+ |
| | | | | 内嵌资源 | | | 附件 | |
| | +----------------------------------+ +----------+ | +------+ |
| | | |
| +------------------------------------------------------+ |
| |
+----------------------------------------------------------------------+
可以看出,如果在邮件中要添加附件,必须定义multipart/mixed段;如果存在内嵌资源,至少要定义multipart/related段;如 果纯文本与超文本共存,至少要定义multipart/alternative段。什么是“至少”?举个例子说,如果只有纯文本与超文本正文,那么在邮件 头中将类型扩大化,定义为multipart/related,甚至multipart/mixed,都是允许的。
multipart诸类型的共同特征是,在段头指定“boundary”参数字符串,段体内的每个子段以此串定界。所有的子段都以“--”+ boundary行开始,父段则以“--”+boundary+“--”行结束。段与段之间也以空行分隔。在邮件体是multipart类型的情况下,邮 件体的开始部分(第一个“--” +boundary行之前)可以有一些附加的文本行,相当于注释,解码时应忽略。段间也可以有一些附加的文本行,不会显示出来。
这些复合类型又是可以嵌套使用的,比如说一个带有附件的邮件,同时有html与text两种格式的正文,则邮件的结构是:
Content-Type: multipart/mixed
部分一:
Content Type : multipart/alternative:
Text 正文;
Html 格式的正文
部分二:
附件
邮件结束符;
由于复合类型由多个部分组成,因此,需要一个分隔符来分隔这多个部分,这就是上面的邮件源文件中的boundary所描述的,对于每一个Contect type :multipart/* 的内容,都会有这么一个说明,表示多个部分之间的分隔。
含 有 MIME/BASE64编码的邮件,你查看它的源码时一般都含有:“This is a multi-part message in MIME format.”这样的句子。也可以被绝大多数的email程序进行解码,包括Netscape、MS Mail、Eudora等。这些程序可以正确识别邮件的正文,恢 MIME/BASE64 编码的部分为正确的文字或夹带的二进制文件。
3.Content-Transfer-Encoding
它表示了这个部分文档的编码方式。只有识别了这个说明,才能用正确的解码方式实现对其解码。
Content-Transfer-Encoding共有Base64, Quoted-printable, 7bit, 8bit, Binary等几种。
其中7bit是缺省的编码方式。电子邮件源码最初设计为全部是可打印的ASCII码的形式。
非ASCII码的文本或数据要编码成要求的格式。
Base64, Quoted-Printable是在非英语国家使用最广使的编码方式。
Binary方式只具有象征意义,而没有任何实用价值。
4.boundary
这 个分隔符是正文中不可能出现的一串古字符的组合,在文档中,以"--"加上这个boundary 来表示一个部分的开始,在文档的结束,以"--"加boundary再在最后加上"--"来表示文档的结束。由于复合类型是可以嵌套使用的,因此,邮件中 可能会多个boundary。
发表评论
-
视频分辨率与视频相应的码率、网络要求之间的关系
2016-01-13 14:02 1097转自: http://blog.youshunedu.com ... -
SVN:多版本库环境的搭建
2013-03-25 10:48 668转载: http://blog.csdn.net/sub ... -
UML
2012-11-06 10:51 956UML中有九种建模的图标,即: http://www.u ... -
软件版本
2012-11-02 11:16 652引文来源 http://blog.csdn.net/jack ... -
网站常识
2011-05-27 15:01 751网站的一些常识: 1.工业和信息化部ICP备案(ICP备)网 ... -
ActiveX控件如何标记控件为安全(摘抄)
2010-12-01 15:42 2204原文:http://blog.csdn.net/xiaoqia ... -
对开发的程序(制作CAB)进行签名,并允许网站中使用
2010-08-22 15:26 950摘抄子: http://www.cppblog.com/fw ... -
文件加密
2010-08-19 10:22 1259如今,人们的生活与电脑已经息息相关了。我们存放在电 ... -
注册自己的协议
2010-08-16 15:32 1286from:http://phpor.net/blog/rea ... -
音频编解码格式
2009-02-27 17:56 2303音频编解码格式 *MPEG Audio Layer 1/2 * ... -
视频格式分类介绍
2009-02-24 14:13 1637目前,视频格式可以分 ... -
MTU 是什么..
2007-08-23 11:56 2222什么是MTU? MTU是Maximum Transmissio ... -
xml文件中的文档类型定义(DTD)的部分语法解释
2007-06-06 13:28 1302以下是一些在网上摘抄的(由于没有全部摘抄就没有写出出处) 1. ... -
ant svn
2007-05-25 10:42 4763原文出处:[url]http://www.wangchao.n ...
相关推荐
### MIME编码介绍 #### 一、MIME:Multipurpose Internet Mail Extensions MIME,全称为Multipurpose Internet Mail Extensions,即“多用途互联网邮件扩展”,是一种用于处理非纯文本信息的标准编码方式。它允许...
MIME64是MIME编码的一种,主要用于将二进制数据转换为ASCII文本,以便在电子邮件或其他网络协议中传输。在某些情况下,特别是涉及到特定软件如Foxmail时,可能会遇到一些编码问题,比如对某些小于0x7f的ASCII字符...
《运用设计模式设计MIME编码类》是一篇关于在编程中如何使用设计模式来构建一个MIME(Multipurpose Internet Mail Extensions)编码类的文章。MIME是互联网标准,用于定义非ASCII字符的邮件传输和格式,它扩展了电子...
C# 类库来实现MIME的编码和解码 MimeMessage mail new MimeMessage ; mail SetDate ; mail Setversion ; mail SetFrom "sender@local com" null ; mail SetTo "recipient1@server1 com Nick Name...
MIME邮件头是MIME标准的关键元素,它提供了关于邮件内容类型、编码方式和边界信息等必要数据。例如,一个标准的MIME邮件头可能包括以下部分: 1. **Mime-Version**: 这个字段指示MIME协议的版本,例如`Mime-Version...
2. **编码方式**:MIME还定义了如何对数据进行编码以便于传输,如Base64编码用于将二进制数据转换为ASCII文本,而Quoted-printable则用于处理包含非ASCII字符的文本。 3. **MIME头部**:每个MIME部分都有自己的头部...
9. **编码MIME编码**:虽然Go的`mime`包本身不提供MIME编码,但`mime/multipart`和`mime/quotedprintable`包提供了编码功能,可以根据需要进行使用。 通过以上知识点,我们可以看出Go的`mime`包在处理网络数据、...
1. **编码方式**:MIME支持多种编码方式,如Base64(用于包含二进制数据),Quoted-Printable(用于可打印字符的编码)和Binary(用于原始二进制数据)。 2. **头部信息**:MIME邮件的头部包含诸如`From`、`To`、`...
1. MIME编码:MIME定义了多种编码方式,如Base64、Quoted-Printable和Binary。Base64常用于将二进制数据转换为ASCII文本,以便在网络上传输;Quoted-Printable则用于保持文本格式,避免特殊字符被误解;Binary则用于...
通过上述介绍可以看出,MIME类型对于确保网络数据的正确传输至关重要。自定义MIME类型不仅能够解决现有标准无法覆盖的需求,还能提高应用程序的灵活性和功能性。理解并合理使用MIME类型对于开发人员来说是一项非常...
- **传输编码**:MIME规定了不同的编码机制,如Base64、Quoted-Printable等,确保二进制文件能在邮件系统中安全、准确地传递。 2. **一封简单MIME邮件的结构** - **邮件头**:邮件头包括发件人、回信地址、收件人...
在MIME协议中,有两类常见的编码方式:Quoted-Printable(引号可打印)和Base64,这两种编码主要用于处理包含特殊字符的数据,确保它们能够在电子邮件或其他文本传输系统中正确地编码和解码。 **Quoted-Printable...
Quoted-printable编码作为MIME的一部分,是一个实现邮件内容传输编码的方式。 Quoted-printable编码的基本规则如下: 1. 每个字节的值可以编码为三个字符,即一个等号“=”后跟两个十六进制数字(0-9或A-F),这...
- 处理MIME数据时,要注意数据编码和字符集的问题,以避免乱码。 - 遵循HTTP规范,合理设置Content-Type和Content-Disposition头信息。 总之,httpmime-4.3.jar是Java开发者处理HTTP协议下MIME类型数据的得力助手...
而MIME引入了新的头部信息和编码方式,使得电子邮件能够包含更丰富的内容。 3. **MIME电子邮件结构** 一封MIME邮件通常包含三个部分:邮件头部、一个空行和邮件内容。头部信息中,MIME添加了`MIME-Version`、`...
.NET POP3 MIME Client 是一个基于.NET框架的邮件客户端开发库,它主要用于实现POP3协议来检索电子邮件,并且处理MIME编码的邮件内容。这个库可能是由一个国外的开发者或团队创建,供其他开发者在自己的应用程序中...
例如,一个 MIME 邮件可能包含纯文本正文中的一段介绍,以及一个作为附件的 PDF 文件。 **MIME 主要特点:** 1. **多部分编码**:MIME 邮件允许包含多个部分,每个部分都有独立的数据类型和编码方式,通过边界字符...
在IT行业中,MimeType(MIME类型)是一种标准,用于标识互联网上的文件类型和编码方式。MimeType文件校验是网络服务中常见的操作,特别是在处理用户上传的文件时,它能确保服务器正确地解析和处理文件。本示例"Mime...
通过以上对常见MIME类型的详细介绍,我们可以看到MIME类型在互联网数据传输中的重要性。它们不仅定义了数据的格式,还指导着接收端如何正确解析和展示这些数据,从而保证了互联网上的信息交流既高效又准确。理解并...