MIME对于邮件系统的扩展是巨大的,因为在MIME出现以前,信件内容如果要包括声音和动画,就必须把它变为ASCII码或把二进制的信息变成可以传送的编码标准,而接收方必须经过解码才可以获得声音和图画信息。MIME提供了一种可以在邮件中附加多种不同编码文件的方法。
一封邮件主要由邮件头和邮件体组成.邮件头包含了发件人、收件人、主题、时间、MIME版本、邮件内容的类型等重要信息。每条信息称为一个域,由域名后加“: ”和信息内容构成,可以是一行,较长的也可以占用多行。域的首行必须“顶头”写,即左边不能有空白字符(空格和制表符);续行则必须以空白字符打头,且第一个空白字符不是信息本身固有的。
邮件体包含邮件的内容,它的类型由邮件头的“Content-Type”域定义。最常见的类型有text/plain(纯文本)和text/html(超文本)。邮件体被分为多个段,每个段又包含段头和段体两部分,这两部分之间也以空行分隔。常见的multipart类型有三种: multipart/mixed, multipart/related和multipart/alternative。
1.multipart/alternative类型
MIME邮件可以传送超文本内容,但出于兼容性的考虑,一般在发送超文本格式内容的同时会同时发送一个纯文本内容的副本,如果邮件中同时存在纯文本和超文本内容,则邮件需要在Content-Type域中定义multipart/alternative类型,邮件通过其boundary中的分段标识将纯文本、超文本和邮件的其它内容分成不同的段。基本格式如下: Content-Type: multipart/alternative; boundary=”{分段标识}”
2.multipart/mixed类型
如果一封邮件中含有附件,那邮件的Content-Type域中必须定义multipart/mixed类型,邮件通过multipart/mixed类型中定义的boundary标识将附件内容同邮件其它内容分成不同的段。基本格式如下: Content-Type: multipart/mixed; boundary=”{分段标识}”
3.multipart/related类型
MIME邮件中除了可以携带各种附件外,还可以将其它内容以内嵌资源的方式存储在邮件中。比如我们在发送html格式的邮件内容时,可能使用图像作为 html的背景,html文本会被存储在alternative段中,而作为背景的图像则会存储在multipart/related类型定义的段中。基本格式如下: Content-Type: multipart/related; type=”multipart/alternative”; boundary=”{分段标识}”
说明:内嵌资源也是MIME的一个发光点,它能使邮件内容变得生动活泼、丰富多彩。可在邮件的multipart/related框架内定义一些与正文关联的图片、动画、声音甚至CSS样式和脚本的段。通常在HTML正文内,使用超级链接与内嵌资源相联系。
4.multipart类型的boundary属性
multipart的子类型中都定义了各自的boundary属性,邮件使用这些boundary中定义的字符串作为标识,将邮件内容分成不同的段,段体内的每个子段以“–”+boundary行开始,父段则以“–”+boundary+“–”行结束,不同段之间用空行分隔。
5.MIME 编码方式
对邮件进行编码最初的原因是因为 Internet 上的很多邮件服务器不能正确传输8 bit 内码的字符,比如汉字等。编码的原理就是把 8 bit 的内容转换成 7 bit 的形式以能正确传输,在接收方收到之后,再将其还原成 8 bit 的内容.
MIME 协议算法简单,并且易于扩展,现在已经成为邮件编码方式的主流,不仅是用来传输 8 bit 的字符,也可以用来传送二进制的文件 ,如邮件附件中的图像、音频等信息,而且扩展了很多基于MIME 的应用。从编码方式来说,MIME 定义了两种编码方法Base64与QP(Quote-Printable) :
(1)Base 64
Base 64 是一种通用的方法,其原理很简单,就是把三个Byte的数据用 4 个Byte表示,这样,这四个Byte 中,实际用到的都只有前面6 bit,这样就不存在只能传输 7bit 的字符的问题了。Base 64的缩写一般是“B”.如Subject: =?GBK?B?ztLKx8nx?= 就是用base 64编码.这不是一段完整的编码,只有部分是编码了的,这个部分用 =? ?= 两 个标记括起来,=? 后面说明的是这段文字的字符集是GBK,然后一个 ? 后面的一个 B 表示的是用的 Base64
(2)QP(Quote-Printable)
通常缩写为“Q”方法,其原理是把一个8 bit 的字符用两个16进制数值表示,然后在前面加“=”。所以我们看到经过QP编码 后的文件通常是这个样子:=B3=C2=BF=A1=C7=E5=A3=AC=C4=FA=BA=C3=A3=A1。在 PHP 里,系统有两个函数可以很方便地实现解码:base64_decode()与quoted_printable_decode(),前者可用于base64 编码的解码,后者是用于 QP 编码方法的解码。
在了解了上面的知识点后,介绍实例讲解如下这封邮件,从test123@163.com邮箱发到test8888@mail21.cn4e.com邮箱,
查看邮件头信息如下: Return-Path: <test123@163.com> #指出邮件无法投递时退回的地址,目标邮件服务器添加 Delivered-To: test8888@mail21.cn4e.com #邮件的投递目的地址
Received: from mail21.cn4e.com (localhost.localdomain [127.0.0.1]) #邮件路由信息,从下往上邮件的传送. by mail.mail21.cn4e.com (Postfix) with SMTP id C06584014A for <test8888@mail21.cn4e.com>; Mon, 15 Nov 2010 22:23:31 +0800 (CST) Received: from m13-67.163.com([220.181.13.67]) by mail21.cn4e.com(35.COM Anti-Spam & Anti-Virus SMTP Gateway System. v 2.2.0) with ESMTP id 17509.37.1289831008.336743; Mon, 15 Nov 2010 22:23:28 +0800 (CST)
Received: from test123 ( [124.160.132.80] ) by ajax-webmail-wmsvr67 (Coremail) ; Mon, 15 Nov 2010 22:21:55 +0800 (CST)
Date: Mon, 15 Nov 2010 22:21:55 +0800 (CST) #发件人计算机上的计算机时钟所确定的发送此电子邮件的日期和时间。
From: test123 <test123@163.com> #发件人地址,邮件的创建者 To: test8888@mail21.cn4e.com #收件人地址,邮件的创建者 Cc: test123@126.com #抄送地址,另密件抄送方式发送的邮件的收件人不显示在邮件头中。
Message-ID: <1432814.855f.12c4fe9dc52.Coremail.test123@163.com> #消息ID,唯一的ID进行标识. Subject: =?GBK?B?ztLKx8nx?= #邮件主题,用Base 64编码 MIME-Version: 1.0 #MIME版本 Content-Type: multipart/alternative; #内容的类型,这里代表同时支持text格式和html 格式 boundary=”—-=_Part_88954_31193075.1289830915153″ #定义的字符串作为标识 X-Originating-IP: [124.160.132.80] #非标准的、自定义都以X-开头,这个是163自定义的,为发信人的ip地址,如下都是163自定义的 X-Priority: 3 X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build 101029(12229.3533.3507) Copyright (c) 2002-2010 www.mailtech.cn 163com X-CM-CTRLDATA: ni2Vs2Zvb3Rlcl9odG09MzU6MjAy X-CM-TRANSID:Q8GowLBblwEEQuFMcosDAA–.1802W X-CM-SenderInfo: 5m0itiatrqimqv6rljoofrz/1tbiSR6Kv0iZc3xH+AABsC X-Coremail-Antispam: 1U5529EdanIXcx71UUUUU7vcSsGvfC2KfnxnUU==