电子邮件普遍遵循的邮件技术规范。
MIME邮件由邮件头和邮件体两部分组成。
邮件头包括:标题,送信人,收信人,创建日期,邮件体内容类型和邮件体编码方式等内容。
邮件体包括:正文,超文本,内嵌数据和附件等内容。

MIME技术规范的完整内容由RFC 2045-2049定义,包括了信息格式、媒体类型、编码方式等各方面的内容,本文只介绍其中的一些关键的格式和规范。
1.域
MIME邮件中的重要信息都记录在邮件内的各个域中。
域的基本格式是 {域名}:{内容}。
一个域占一行或多行,域的首行左侧不能有空白字符,占多行的域其后续行必须以空白字符开头。
域的信息内容中还可以包含属性,属性之间以“;”分隔,属性格式是{属性名}="{属性值}"。
域的内容的编码格式是"=?"+编码名称+"?"+B/Q+"?"+编码后的字符序列+"?="。(B代表base64的编码方式,Q代表quoted-printable的编码方式)

2.Content-Type域
Content-Type域定义了邮件中各种内容的形式及属性。
Content-Type域的基本格式是 Content-Type:{主类型}/{子类型}。
Content-Type的主类型分text,image,audio,video和application五种离散类型以及multiple和message两种复合类型。
text类型有plain和html两种常用的子类型。
multiple类型有mixed,alternative和related三种常用的子类型。

3.multiple类型
·multiple类型基本格式
multiple类型基本格式是 Content-Type: multipart/{子类型};boundary="{分段标识}"
三种子类型的对比:
------------------------------------------------------------------
|类型名              |邮件种类  |boundary作用                    |
------------------------------------------------------------------
|multiple/mixed      |有附件    |分隔各附件内容和邮件其他内容    |
------------------------------------------------------------------
|multiple/alternative|有超文本  |分隔纯文本,超文本和邮件其他内容|
------------------------------------------------------------------
|multiple/related    |有内嵌资源|分隔各内嵌资源和邮件其他内容    |
------------------------------------------------------------------
·boundary属性
multiple子类型中都定义了各自的boundary属性,邮件中使用boundary中定义的字符串作为标识,将邮件内容分成不同的段,段内每个字段以"--"+boundary中定义的字符串开始,父段则以"--"+boundary中定义的字符串+"--"结束,不同段之间用空行分隔。
·multiple类型的层次关系
------------------------------
|multiple/mixed              |
------------------------------
| |multiple/related        | |
------------------------------
| | |multiple/alternative| | |
------------------------------
| | |纯文本正文          | | |
------------------------------
| | |超文本正文          | | |
------------------------------
| |内嵌资源                | |
------------------------------
|附件                        |
------------------------------

4.Content-Transfer-Encoding域
Content-Transfer-Encoding域定义段内文字的编码方式,不同段可以有不同的编码方式。
MIME邮件中的数据编码普遍采用base64和quoted-printable两种编码。
·base64编码的算法
编码的原则是将输入数据全部转换成由{'A'-'Z','a'-'z','0'-'9','+','/'}64个ASCII字符组成的字符序列。
编码时将需要转换的数据每次取出6bit,然后转换成十进制数字,查询64个ASCII字符组成的字典表,输出对应位置的ASCII码字符。每3个字节的数据内容会被转换成4个字典中的ASCII码字符。当转换后的数据不是4的整倍数时,用"="来填充。
·quoted-printable编码的算法
编码的原则是将输入的数据转换成可打印的ASCII码字符。
编码时根据读入内容来决定是否进行编码,如果读入的字节处于33-60,62-126范围内,属可直接打印的ASCII字符,则直接输出,否则将该字节分为两个4bit,每个用一个十六进制数来表示,然后再前面加上"=",每个需要编码的字节被转换成三个字符来表示。

转载于:http://hankundev.blog.sohu.com/104046669.html

EML文件(MIME邮件)格式分析的更多相关文章

  1. MIME邮件格式

    转自:http://kptu.iteye.com/blog/890180 排版做了调整. Q.什么是MIME?什么是MIME邮件? A. MIME, 全称为"Multipurpose Int ...

  2. after effects的xml格式工程文件aepx的格式分析(一)

    表面上看,AE的工程文件可以另存为xml格式,我们可以通过直接编辑XML来做一些事情. 很可惜,通过aepx文件修改AE工程,能做到的非常有限.理由是: 1.重要的属性都放在了标签的bdata这个属性 ...

  3. PDF格式分析

    系列文章是csdn作者'秋风之刀'写的,我只是把目录列出来而已,感谢作者辛苦付出. PDF格式分析(一)简介 PDF格式分析(二)语法之对象 PDF格式分析(三)语法之Filter PDF格式分析(四 ...

  4. 邮件MIME格式分析

    http://www.cnblogs.com/crystalray/articles/3302427.html 邮件mime格式 参考: rfc4021,Registration of Mail an ...

  5. MIME协议(一) -- RFC822邮件格式

    MIME协议(一) -- RFC822邮件格式 .   如同其他各种电子文档一样,电子邮件内容也必须遵循一定的格式要求,各种邮件处理程序才能从中分析和提取出发件人.收件人.主题和附件等信息.邮件内容的 ...

  6. HTTP POST请求报文格式分析与Java实现文件上传

    时间 2014-12-11 12:41:43  CSDN博客 原文  http://blog.csdn.net/bboyfeiyu/article/details/41863951 主题 HTTPHt ...

  7. [PHP] MIME邮件协议的multipart类型

    邮件协议中的三种情况,对应下面的三种类型 multipart/mixed可以包含附件.multipart/related可以包含内嵌资源.multipart/alternative 纯文本与超文本共存 ...

  8. SharePoint 2013中的默认爬网文件扩展名和分析文件类型

    摘要:了解默认情况下 SharePoint 2013 爬网的文件扩展名及其解析的文件类型,可以借此了解搜索可以爬的文件和支持的功能. 如果“管理文件类型”页上的列表包含文件扩展名,爬网组件将仅爬网文件 ...

  9. MIME协议(三) -- MIME邮件的组织结构

    一封MIME邮件可以由多个不同类型的MIME消息组合而成,一个MIME消息表示邮件中的一个基本MIME资源或若干基本MIME消息的组合体.每个MIME消息的数据格式与RFC822数据格式相似,也包括头 ...

随机推荐

  1. java常用类与包装类--常用类字符串String类、StringBuffer类、Stringbuilder类

    1.String类 1.1String类的概念和储存结构: (1)字符串是一个比较特殊的对象,可以使用new,也可以不使用new来创建字符串对象 String s1 = new String(&quo ...

  2. 【NOIP2016提高A组模拟8.17】(雅礼联考day1)Binary

    题目 分析 首先每个数对\(2^i\)取模.也就是把每个数的第i位以后删去. 把它们放进树状数组里面. 那么当查询操作, 答案就位于区间\([2^i-x,2^{i-1}-1-x]\)中,直接查询就可以 ...

  3. 【leetcode】Valid Parenthesis String

    题目: Given a string containing only three types of characters: '(', ')' and '*', write a function to ...

  4. Linux下lazarus交叉编译 win32[win64]

    环境 vmvare + deepin Linux64 + lazarus2.0.6 参考:https://wiki.freepascal.org/Cross_compiling_for_Win32_u ...

  5. LOJ #539. 「LibreOJ NOIP Round #1」旅游路线 倍增floyd + 思维

    考试的时候是这么想的: 求出每一个点花掉 $i$ 的花费向其他点尽可能走的最长距离,然后二分这个花费,找到第一个大于 $d$ 的就输出$.$然而,我这个记忆化搜索 $TLE$ 的很惨$.$这里讲一下正 ...

  6. mac卸载jdk

    在本地gradle打包后,将war包部署到服务器,tomcat的localhost日志报这个错: 严重: Error configuring application listener of class ...

  7. BZOJ 4422 Cow Confinement (线段树、DP、扫描线、差分)

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=4422 我真服了..这题我能调一天半,最后还是对拍拍出来的...脑子还是有病啊 题解: ...

  8. R中rep函数的使用

    官方帮助文档如下写的: Usage rep(x, ...) rep.int(x, times) rep_len(x, length.out) Arguments x a vector (of any ...

  9. bootstrap editable 行内编辑

    除了那些bootstrap/bootstrap table的js , css之外,要额外添加editable的文件: <link href="../assets/css/bootstr ...

  10. 高级软件测试技术-任务进度-Day03

    任务进度11-15 使用工具 Jira 小组成员 华同学.郭同学.穆同学.沈同学.覃同学.刘同学 任务进度 经过了前两天的学习任务的安排,以下是大家的任务进度: 穆同学(任务1) 1.今天就接着昨天的 ...