邮件实现详解(三)------邮件的组织结构

  要想各种邮件处理程序能识别我们所写的电子邮件,能从我们所书写的电子邮件中分析和提取出发件人,收件人,邮件主题和邮件内容以及附件等信息,那么我们所写的电子邮件必须要遵循一定的格式要求,正如我们上一篇博客 手工体验smtp和pop3协议 ,我们在发送邮件时有固定的写法。而这种邮件内容的基本格式和具体细节分别是由 RFC822 文档和 MIME 协议定义的。

1、RFC822 邮件格式

  英文参考文档如下:https://tools.ietf.org/html/rfc822

  RFC822 文档中定义的文件格式包括两个部分:邮件头和邮件体。在上一篇博客,我们通过SMTP服务发送一封邮件,然后用POP3服务器接收。邮件接收内容如下图红色框所显示:

  这上面显示的不全,我这里将其内容整理出来,并在每行左边加上标号:

1 Received: from smtpbg5.qq.com (unknown [183.60.61.230])
        by mx6 (Coremail) with SMTP id OMCowACXv+ssf99ZD5FqAg--.5570S3;
        Thu, 12 Oct 2017 22:41:48 +0800 (CST)
2 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512;
        t=1507819308; bh=N2xK6iU/bt0tcntOdutSQ3tkYXbTtOi08RT+HjuXmBc=;
        h=From:To:Subject:Mime-Version:Content-Type:Content-Transfer-Encoding:Date:Message-ID;
        b=lzBtxAWw0+HB1bGLkkCqlUeU4bvVoMxDp3UZTKq3YCIJt5Ypu4FkE0m5rrrpcxF0D
         W0/PQajrQTughLTmpjoudI5aDWjfrfkOc1Z0+ltaAraoZfdE5HmNQ0hxQstNa+IbjC
         GMVEzCOMikVm5qklyCz/1Lwd5mBJ90YkknS3sL08=
3 X-QQ-FEAT: Gf8h89u9tNwRjwDYIPPhYegibbvTgUmwr4I/ntV6mwr6YOyFiWpUpVj+bCsJz
        tAz24NjMs/p1D8BXG7LYvZRCPMPQV7jdW3AKjTclrSS9xE29fxWsEjYk5QlD1cMIuhHF9Po
        1HMwWKIZX8q6smehIwr+t/du8sprvHVue4ty5KMPeWw967qaAZgta5hcnRtgajhZRcIumVx
        r+K4/nY7I+wwNenOTfHT4Ly4K1Ne+vD7VNJbLHH674HEJ2CsoSEEBW7X/LeeSq6M=
4 X-QQ-SSF: 0001000000000010000000000000007
5 X-HAS-ATTACH: no
6 X-QQ-BUSINESS-ORIGIN: 2
7 X-Originating-IP: 113.57.253.69
8 X-QQ-STYLE:
9 X-QQ-mid: webmail4t1507819307t4823829

10 From: "=?ISO-8859-1?B?MTEzMjgwMzk1MQ==?=" <1132803951@qq.com>
11 To: "=?ISO-8859-1?B?MTgyNzEyNjU3MzI=?=" <18271265732@163.com>
12 Subject: hello world
13 Mime-Version: 1.0
14 Content-Type: multipart/alternative;
        boundary="----=_NextPart_59DF7F2B_08CB07D0_339F08F2"
15 Content-Transfer-Encoding: 8Bit
16 Date: Thu, 12 Oct 2017 22:41:47 +0800
17 X-Priority: 3
18 Message-ID: <tencent_9EFED46440A5BAD43E6BC680FAC8A58E460A@qq.com>
19 X-QQ-MIME: TCMime 1.0 by Tencent
20 X-Mailer: QQMail 2.x
21 X-QQ-Mailer: QQMail 2.x
22 X-QQ-SENDSIZE: 520
23 Received: from qq.com (unknown [10.137.130.92])
        by smtp.qq.com (ESMTP) with SMTP
        id ; Thu, 12 Oct 2017 22:41:47 +0800 (CST)
24 Feedback-ID: webmail:qq.com:bgweb:bgweb4
25 X-CM-TRANSID:OMCowACXv+ssf99ZD5FqAg--.5570S3
26 Authentication-Results: mx6; spf=pass smtp.mail=1132803951@qq.com; dki
        m=pass header.i=@qq.com
27 X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73
        VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvj4RWLvtDUUUU

28 This is a multi-part message in MIME format.

29 Content-Type: text/plain;
        charset="ISO-8859-1"
30 Content-Transfer-Encoding: base64

31 PGRpdj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6ICdsdWNpZGEgR3JhbmRlJywgVmVyZGFu
YSwgJ01pY3Jvc29mdCBZYUhlaSc7IGxpbmUtaGVpZ2h0OiAyMy44cHg7Ij5UaGlzIGlzIHRo
ZSBmaXJzdCBlbWFpbCBzZW50IGJ5IGhhbmQgdXNpbmcgdGhlIFNNVFAgcHJvdG9jb2w8L3Nw
YW4+PC9kaXY+

  上面便是 RFC822 所定义的邮件格式,从第 1 行到第 30 行都是邮件头,第 31 行是邮件体(经过base64加密过了,有兴趣的大家可以解码看看)。而邮件头和邮件体之间以一个空行间隔,邮件头部分是由多个头字段和字段内容组成,分别表示收件人,发件人,发件时间,主题等信息。还有一些信息是对应的SMTP服务器在邮件传递过程中所加上的,我们知道现实生活中的邮局在处理邮件时,通常都会在信封上加上邮戳,表示这封邮件在什么时候经过了哪个邮局哪个部门处理,我们上个例子是QQ邮箱发给163邮箱的。而SMTP服务器按从下往上的方式添加信息,即先添加的字段位于后添加字段的后面。所以qq的SMTP服务器会先添加头字段,但是添加的字段会在163的SMTP服务器添加字段的下面,另外 POP3服务器也会自己添加一些字段。

  每一个邮件头以“字段名:字段值”的格式出现,即每一行邮件头的内容依次由字段名、冒号、空格、字段值、回车换行符组成。RFC822文档中定义了多个标准的邮件头字段,每一个邮件头字段表示一种特定的信息。邮件头中也可以包含自定义的头字段,这种自定义的头字段通常是某个组织或机构内部专用的。下面是对一些主要的邮件头字段的解释:

  我们从上可以知道,RFC822文档存在两个问题:

  ①、定义了邮件内容的主体结构和各种邮件头字段的详细细节,但是,它没有定义邮件体的格式,RFC822文档定义的邮件体部分通常都只能用于表述一段普通的文本,而无法表达出图片、声音等二进制数据。

  ②、SMTP服务器在接收邮件内容时,当接收到只有一个“.”字符的单独行时,就会认为邮件内容已经结束,如果一封邮件正文中正好有内容仅为一个“.”字符的单独行,SMTP服务器就会丢弃掉该行后面的内容,从而导致信息丢失。

  上面两个问题是致命的,当今的电子邮件,人们希望在电子邮件中嵌入图片、声音、动画和附件。但是,由于图片和声音等内容是非ASCII码的二进制数据,而RFC822邮件格式只适合用来表达纯文本的邮件内容,所以,要使用RFC822邮件格式发送这些非ASCII码的二进制数据时,必须先采用某种编码方式将它们“编码”成可打印的ASCII字符后再作为RFC822邮件格式的内容。邮件阅读程序在读取到这种经过编码处理的邮件后,再按照相应的解码方式解码出原始的二进制数据,这样就可以借助RFC822邮件格式来传递多媒体数据了。这种做法需要解决一下两个技术问题:

  一、邮件阅读程序如何知道邮件中嵌入的原始二进制数据所采用的编码方式;

  二、邮件阅读程序如何知道每个嵌入的图像或其他资源在整个邮件内容中的起止位置。

  为了解决上面两个问题,人们后来专门为此定义了MIME(Multipurpose Internet Mail Extension,多用途Internet邮件扩展)协议。

2、MIME协议

  MIME协议用于定义复杂邮件体的格式,它可以表达多段平行的文本内容和非文本的邮件内容,例如,在邮件体中内嵌的图像数据和邮件附件等。另外,MIME协议的数据格式也可以避免邮件内容在传输过程中发生信息丢失。MIME协议不是对RFC822邮件格式的升级和替代,而是基于RFC822邮件格式的扩展应用。一言以蔽之,RFC822定义了邮件内容的格式和邮件头字段的详细细节,MIME协议则是定义了如何在邮件体部分表达出的丰富多样的数据内容。

  一个采用了MIME协议的电子邮件就叫做MIME邮件,MIME邮件在RFC822文档中定义的邮件头字段的基础上,扩充了一些自己专用的邮件头字段,例如,使用MIME-Version头字段指定MIME协议的版本,使用Content-Type头字段指定邮件体的MIME类型,使用Content-Transfer-Encoding头字段指定编码方法,如下所示:    

MIME-Version:1.0

Content-Type:multipart/mixed;boundary="----=_NextPart_000_0050_01C"

  其中,“multipart/mixed”部分说明邮件体中包含有多段数据,每段数据之间使用boundary属性中指定的字符文本作为分隔标识符。另外,MIME邮件也扩展了RFC822文档中已经定义了的邮件头字段的内涵,例如,定义了subject头字段中的值内容的格式,以便通过编码的方式让邮件主题中也可以使用非ASCII码的字符。subject头字段中的值嵌套在一对“=?”和“?=”标记符之间,标记符之间的内容由三部分组成:邮件主题的原始内容的字符集、当前采用的编码方式、编码后的结果,这三部分之间使用“?”进行分隔。

3、总结

  这篇博客,带上前面两篇博客,我们就将邮件的收发基本原理讲了一下。那么有人会问,实际项目中我们也需要考虑邮件的底层实现协议吗?答案是不用的,比如 sun 公司(现在已经被orcal收购了)开发的JavaMail API 就是为方便Java开发人员在应用程序中实现邮件接收和发送功能而提供的一套标准开发包,屏蔽了底层的邮件实现协议,那么下一篇博客我们就来用JavaMail 实现邮件收发功能。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏散尽浮华

GlusterFS分布式存储数据的恢复机制(AFR)的说明

GlusterFSFS恢复数据都是基于副本卷来说的,GlusterFSFS复制卷是采用镜像的方式做的,并且是同步事务性操作。简单来说就是,某一个客户要写文件时,...

4595
来自专栏蘑菇先生的技术笔记

揭秘Windows10 UWP中的httpclient接口[2]

1944
来自专栏惨绿少年

磁盘管理之 raid 文件系统 分区

第1章 RAID 磁盘阵列 1.1 使用raid的目的 1)获得更大的容量 2)让数据更安全 3)读写速度更快 1.2 raid0、raid1、raid5、ra...

2430
来自专栏拂晓风起

jsp/servlet使用ajax动态加载dtree, dtree样式/图片修改 (java 生成dtree servlet json)

1042
来自专栏技术博客

Asp.Net MVC3.0网站统计登录认证的在线人数

  对于一个网站来说,统计在线人数是一个很重要的工作。平时也发现很多的网站论坛等都有在线人数的显示。对于一个网站如果在线人数很多,用户看到了这么个数字也是很了不...

692
来自专栏青枫的专栏

day46_Webservice学习笔记_02

开发步骤:   第一步:导入jar包   第二步:创建SEI接口,要在接口上加入注解:@WebService

311
来自专栏蘑菇先生的技术笔记

揭秘Windows10 UWP中的httpclient接口[2]

作为一个Universal Windows Platform (UWP)开发者,如果你尝试使用http与web服务或其他服务端通讯时,有多个API可以选择。 U...

1123
来自专栏企鹅号快讯

PWA 那些事儿

一、背景 文章 2017 前端大事件和趋势回顾,2018 何去何从?中提到了 2017 年前端值得关注的十大事件,其中就提到了 PWA。 大家都知道 Nativ...

2220
来自专栏技术博客

系统上线后WCF服务最近经常死掉的原因分析总结

  最近系统上线完修改完各种bug之后,功能上还算是比较稳定,由于最近用户数的增加,不知为何经常出现无法登录、页面出现错误等异常,后来发现是由于WCF服务时不时...

843
来自专栏jojo的技术小屋

原 web安全、XSS、CSRF、注入攻击

作者:汪娇娇 时间:2017年8月15日 当时也是看了一本书《白帽子讲web安全》,简单的摘录然后做了个技术分享,文章不是很详细,建议大家结合着这本书看哈。 w...

3807

扫码关注云+社区