邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的,解码时要过滤掉。如例2的7-8行,例3的4-5行,13-14行,分别属于一个域。
邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域指出。常见的简单类型有text/plain(纯文本)和text/html(超文本)。
例2和例3中出现的multipart类型,是MIME邮件的精髓。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种:multipart/mixed, multipart/related和multipart/alternative。从它们的名称,不难推知这些类型各自的含义和用处。它们之间的层次关系可归纳为下图所示:
+------------------------- multipart/mixed ----------------------------+ | | | +----------------- multipart/related ------------------+ | | | | | | | +----- multipart/alternative ------+ +----------+ | +------+ | | | | | | 内嵌资源 | | | 附件 | | | | | +------------+ +------------+ | +----------+ | +------+ | | | | | 纯文本正文 | | 超文本正文 | | | | | | | +------------+ +------------+ | +----------+ | +------+ | | | | | | 内嵌资源 | | | 附件 | | | | +----------------------------------+ +----------+ | +------+ | | | | | | +------------------------------------------------------+ | | | +----------------------------------------------------------------------+
可以看出,如果在邮件中要添加附件,必须定义multipart/mixed段;如果存在内嵌资源,至少要定义multipart/related段;如果纯文本与超文本共存,至少要定义multipart/alternative段。什么是“至少”?举个例子说,如果只有纯文本与超文本正文,那么在邮件头中将类型扩大化,定义为multipart/related,甚至multipart/mixed,都是允许的。
multipart诸类型的共同特征是,在段头指定“boundary”参数字符串,段体内的每个子段以此串定界。所有的子段都以“--”+boundary行开始,父段则以“--”+boundary+“--”行结束。段与段之间也以空行分隔。在邮件体是multipart类型的情况下,邮件体的开始部分(第一个“--”+boundary行之前)可以有一些附加的文本行,相当于注释,解码时应忽略。段间也可以有一些附加的文本行,不会显示出来,如果有兴趣,不妨验证一下。
结合boundary定界和multipart层次关系图,我们分析一下例2和例3的邮件体层次与段嵌套关系。
在例2中,10-12行是附加文本行,13-82行是multipart/alternative型的段,包含两个子段:13-30行是纯文本正文,32-79行是超文本正文。
在例3中,20-21行是附加文本行,22-3127行是multipart/mixed型的段,包含3个子段:22-171行是multipart/related段,173-1688行与1690-3125行是两个附件。multipart/related段又包含两个子段:27-61行是multipart/alternative段,63-169行是一个内嵌资源(图片)。multipart/alternative段又包含两个子段:31-48行是纯文本正文,40-59行是超文本正文。
例1只有纯文本正文,实际上属于multipart层次关系图中的一个特殊情况。如果非要避简就繁,写成下面的形式,也是完全符合MIME精神的。
Date: Thu, 18 Apr 2002 09:32:45 +0800
From: <[email protected]>
To: <[email protected]>
Subject: Test
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary="{[(^_^)]}"
--{[(^_^)]}
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
This is a simple mail.
--{[(^_^)]}--