MIME协议在邮件中的应用详解
1.定义
全称是多用途互联网邮件扩展(MIME,Multipurpose Internet Mail Extensions),在MIME出台之前,使用RFC 822只能发送基本的ASCII码文本信息,邮件内容如果要包括二进制文件、声音和动画等,实现起来非常困难,最为麻烦的是多家邮件服务器商间邮件的互发,如果没有一种统一的格式定义,想要互发需要投入巨大的人力物力。MIME提供了一种可以在邮件中附加多种不同编码文件的方法,弥补了原来的信息格式的不足。实际上不仅仅是邮件编码,现在MIME经成为HTTP协议标准的一个部分。
2.组成
总体来说,MIME消息由消息头和消息体两大部分组成。现在我们关注的是MIME邮件,因此在以下的讨论中姑且称“消息”为“邮件”。
1.邮件头
MIME格式的邮件头包含了发件人、收件人、主题、时间、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 | 内容的传输编码方式 | 邮件的创建者 |
1.1.邮件类型(Content-Type)
content-type用来说明下面的邮件正文类型,一般以下面的形式出现。Content-Type: [type]/[subtype]; parameter。
type有以下几种可选:
- Text:用于标准化地表示的文本信息,文本消息可以是多种字符集和或者多种格式的;
- Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
- Application:用于传输应用程序数据或者二进制数据;
- Message:用于包装一个E-mail消息;
- Image:用于传输静态图片数据;
- Audio:用于传输音频或者音声数据;
- Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。
subtype用于指定type的详细形式。content-type/subtype配对的集合和与此相关的参数,将随着时间而增长。为了确保这些值在一个有序而且公开的状态下开发,MIME使用Internet Assigned Numbers Authority (IANA)作为中心的注册机制来管理这些值。常用的subtype值如下所示:
- text/plain(纯文本)
- text/html(HTML文档)
- application/xhtml+xml(XHTML文档)
- image/gif(GIF图像)
- image/jpeg(JPEG图像)【PHP中为:image/pjpeg】
- image/png(PNG图像)【PHP中为:image/x-png】
- video/mpeg(MPEG动画)
- application/octet-stream(任意的二进制数据)
- application/pdf(PDF文档)
- application/msword(Microsoft Word文件)
- message/rfc822(RFC 822形式)
- multipart/alternative(HTML邮件的HTML形式和纯文本形式,相同内容使用不同形式表示)
- application/x-www-form-urlencoded(使用HTTP的POST方法提交的表单)
- multipart/form-data(同上,但主要用于表单提交时伴随文件上传的场合)
此外,尚未被接受为正式数据类型的subtype,可以使用x-开始的独立名称(例如application/x-gzip)。vnd-开始的固有名称也可以使用(例:application/vnd.ms-excel)。
parameter可以用来指定附加的信息,更多情况下是用于指定text/plain和text/htm等的文字编码方式的charset参数。MIME根据type制定了默认的subtype,当客户端不能确定消息的subtype的情况下,消息被看作默认的subtype进行处理。Text默认是text/plain,Application默认是application/octet-stream而Multipart默认情况下被看作multipart/mixed。
1.2内容传输编码(Content-Transfer-Encoding),
这个区域使指定ASCII以外的字符编码方式成为可能。形式如下:Content-Transfer-Encoding: [mechanism]
其中,mechanism的值可以指定为“7bit”,“8bit”,“binary”,“quoted-printable”,“base64”。
7bit这里指的是7位的ASCII编码方式。
8位元ASCII码。
binary,quoted-printable,因为欧洲的一些文字和ASCII字符集中的某些字符有部分相同。如果邮件消息使用的是这些语言的话,于ASCII重叠的那些字符可以原样使用,ASCII字符集中不存在的字符采用形如“=??”的方法编码。这里“??”需要用将字符编码后的16进制数字来指定。采用quoted-printable编码的消息,长度不会变得太长,而且大部分都是ASCII中的字符,即使不通过解码也大致可以读懂消息的内容。
base64是一种将二进制的01序列转化成ASCII字符的编码方法。编码后的文本或者二进制消息,就可以运用SMTP等只支持ASCII字符的协议传送了。Base64一般被认为会平均增加33%的报文长度,而且,经过编码的消息对于人类来说是不可读的。
x-encodingname这个值是预留的扩展。
2.邮件体
邮件内容有各种各样的(既纯文本,超文本,内嵌资源(比如内嵌在超文本中的图片),附件的组合),服务器如何知道该邮件是哪些的混合呢?通过第一个content-type,如果是纯文本该头为:
Content-Type: text/plain; charset=GBK 如果包含了其他内容,邮件体被分为多个段,段中可包含段,每个段又包含段头和段体两部分。content-type为multipart类型。multipart类型分为三种,这三种的关系如下:
可以看出,如果在邮件中要添加附件,必须定义multipart/mixed段;如果存在内嵌资源,至少要定义multipart/related段;如果纯文本与超文本共存,至少要定义multipart/alternative段。什么是“至少”?举个例子说,如果只有纯文本与超文本正文,那么在邮件头中将类型扩大化,定义为multipart/related,甚至multipart/mixed,都是允许的。
multipart诸类型的共同特征是,在段头指定“boundary”参数字符串,段体内的每个子段以此串定界。所有的子段都以“--”+boundary行开始,父段则以“--”+boundary+“--”行结束。段与段之间也以空行分隔。在邮件体是multipart类型的情况下,邮件体的开始部分(第一个“--”+boundary行之前)可以有一些附加的文本行,相当于注释,解码时应忽略。
3.实例
下面通过各种类型的邮件原文来说明上面的内容。以163邮箱发送的邮件为例。
1.最简单的纯文本邮件
Received: from 15616xxxxx$163.com ( [122.207.54.20] ) by
ajax-webmail-wmsvr14 (Coremail) ; Fri, 19 May 2017 19:40:51 +0800 (CST)
X-Originating-IP: [122.207.54.20]
Date: Fri, 19 May 2017 19:40:51 +0800 (CST)
From: 15572483149 <15616xxxxxx@163.com>
To: 272xxxxx5@qq.com
Subject: ss
X-Priority: 3
X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build
20160729(86883.8884) Copyright (c) 2002-2017 www.mailtech.cn 163com
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=GBK
MIME-Version: 1.0
Message-ID: <c756733.d8f8.15c2082a579.Coremail.1561610xxxx@163.com>
X-Coremail-Locale: zh_CN ss
上面的邮件只包含一个文本(ss),所以第11,12行说明了正文格式和编码,下面的就是数据内容(段头和段体隔一行如16行)
2.包含一个文本和一个超文本(正常发送的邮件一般至少有一个正文一个超文本,除非特别指定为纯文本)
Received: from 15616104472$163.com ( [122.207.54.20] ) by
ajax-webmail-wmsvr14 (Coremail) ; Fri, 19 May 2017 19:51:31 +0800 (CST)
X-Originating-IP: [122.207.54.20]
Date: Fri, 19 May 2017 19:51:31 +0800 (CST)
From: 15572483149 <1561610xxxx2@163.com>
To: 272xxxxx5@qq.com
Subject: ss
X-Priority: 3
X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build
20160729(86883.8884) Copyright (c) 2002-2017 www.mailtech.cn 163com
X-CM-CTRLDATA: hN4rXGZvb3Rlcl9odG09ODU6NDI1
Content-Type: multipart/alternative;
boundary="----=_Part_214835_1240140699.1495194691872"
MIME-Version: 1.0
Message-ID: <10858dc0.d9be.15c208c6920.Coremail.15616xxxx2@163.com>
X-Coremail-Locale: zh_CN ------=_Part_214835_1240140699.1495194691872
Content-Type: text/plain; charset=GBK
Content-Transfer-Encoding: base64 c3Nz
------=_Part_214835_1240140699.1495194691872
Content-Type: text/html; charset=GBK
Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6MS43O2NvbG9yOiMwMDAwMDA7Zm9udC1zaXplOjE0cHg7
Zm9udC1mYW1pbHk6QXJpYWwiPnNzczwvZGl2Pjxicj48YnI+PHNwYW4gdGl0bGU9Im5ldGVhc2Vm
b290ZXIiPjxkaXYgaWQ9Im5ldGVhc2VfbWFpbF9mb290ZXIiPjxkaXYgc3R5bGU9ImJvcmRlci10
b3A6I0NDQyAxcHggc29saWQ7cGFkZGluZzoxMHB4IDVweDtmb250LXNpemU6MTVweDtjb2xvcjoj
Nzc3O2xpbmUtaGVpZ2h0OjIycHgiPjxhIGhyZWY9Imh0dHA6Ly95b3UuMTYzLmNvbS9pdGVtL2xp
c3Q/Y2F0ZWdvcnlJZD0xMDEwMDAwJnN1YkNhdGVnb3J5SWQ9MTAxNTAwMSZmcm9tPXdlYl9nZ19t
YWlsX2ppYW9iaWFvXzgiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iY29sb3I6IzMzNjZGRjt0ZXh0
LWRlY29yYXRpb246bm9uZSI+ob7P3sqxob9NVUpJoaLArbfywM3C17XI1sbU7MnM1rG5qdDCv+60
us/EVND0vfYz1du826Ohz97KsTQ51KrG8KOswu3Jz8fAJmd0OyZndDsgJm5ic3A7PC9hPgogJm5i
c3A7ICZuYnNwOzwvZGl2PjwvZGl2Pjwvc3Bhbj4=
------=_Part_214835_1240140699.1495194691872--
上面的包含一个文本和一个超文本,故12行Content-Type: multipart/alternative;接着为boundary参数。下面为两个元素,每个元素以“--”+boundary开头,然后是content-type。。。如18,19,20行。注意:上一个元素的数据和下一个元素的头之间无需空行。段以“--”+boundary+“--”结束,如37行。
4.文本,超文本,附件
Received: from 15616104472$163.com ( [122.207.54.20] ) by
ajax-webmail-wmsvr14 (Coremail) ; Fri, 19 May 2017 20:24:26 +0800 (CST)
X-Originating-IP: [122.207.54.20]
Date: Fri, 19 May 2017 20:24:26 +0800 (CST)
From: 15572483149 <@163.com>
To: 2728474645@qq.com
Subject: ss
X-Priority: 3
X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build
20160729(86883.8884) Copyright (c) 2002-2017 www.mailtech.cn 163com
X-CM-CTRLDATA: pQoIAGZvb3Rlcl9odG09ODY6NDI1
Content-Type: multipart/mixed;
boundary="----=_Part_217443_152692695.1495196666093"
MIME-Version: 1.0
Message-ID: <60b56d3.dc89.15c20aa88ed.Coremail.15616104472@163.com>
X-Coremail-Locale: zh_CN ------=_Part_217443_152692695.1495196666093
Content-Type: multipart/alternative;
boundary="----=_Part_217445_839318381.1495196666093" ------=_Part_217445_839318381.1495196666093
Content-Type: text/plain; charset=GBK
Content-Transfer-Encoding: base64 c2RmYQ==
------=_Part_217445_839318381.1495196666093
Content-Type: text/html; charset=GBK
Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6MS43O2NvbG9yOiMwMDAwMDA7Zm9udC1zaXplOjE0cHg7
Zm9udC1mYW1pbHk6QXJpYWwiPnNkZmE8L2Rpdj48YnI+PGJyPjxzcGFuIHRpdGxlPSJuZXRlYXNl
Zm9vdGVyIj48ZGl2IGlkPSJuZXRlYXNlX21haWxfZm9vdGVyIj48ZGl2IHN0eWxlPSJib3JkZXIt
dG9wOiNDQ0MgMXB4IHNvbGlkO3BhZGRpbmc6MTBweCA1cHg7Zm9udC1zaXplOjE1cHg7Y29sb3I6
Izc3NztsaW5lLWhlaWdodDoyMnB4Ij48YSBocmVmPSJodHRwOi8veW91LjE2My5jb20vaXRlbS9s
aXN0P2NhdGVnb3J5SWQ9MTAxMDAwMCZzdWJDYXRlZ29yeUlkPTEwMTUwMDEmZnJvbT13ZWJfZ2df
bWFpbF9qaWFvYmlhb184IiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9ImNvbG9yOiMzMzY2RkY7dGV4
dC1kZWNvcmF0aW9uOm5vbmUiPqG+z97KsaG/TVVKSaGiwK238sDNwte1yNbG1OzJzNaxuanQwr/u
tLrPxFTQ9L32M9XbvNujoc/eyrE0OdSqxvCjrMLtyc/HwCZndDsmZ3Q7ICZuYnNwOzwvYT4KICZu
YnNwOyAmbmJzcDs8L2Rpdj48L2Rpdj48L3NwYW4+
------=_Part_217445_839318381.1495196666093-- ------=_Part_217443_152692695.1495196666093
Content-Type: text/plain; name="first.txt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="first.txt" MTIzNA==
------=_Part_217443_152692695.1495196666093
Content-Type: text/plain; name="first.txt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="first.txt" MTIzNA==
------=_Part_217443_152692695.1495196666093--
上面的邮件体包含了一个文本,一个超文本和两个文本附件。注意看12行的content-type和boundary参数和19行,19行是12行的子元素的同时也是一个嵌套的段所以也有一个独有的boundary参数,和上面的multipart参数的关系一样,可是是一层层的嵌套关系。
5.包含所有的东西
Received: from 15616104472$163.com ( [122.207.54.20] ) by
ajax-webmail-wmsvr14 (Coremail) ; Fri, 19 May 2017 20:37:12 +0800 (CST)
X-Originating-IP: [122.207.54.20]
Date: Fri, 19 May 2017 20:37:12 +0800 (CST)
From: 15572483149 <1561xxxxxx@163.com>
To: 1561xxxxxx@163.com
Subject: ss
X-Priority: 3
X-Mailer: Coremail Webmail Server Version SP_ntes V3.5 build
20160729(86883.8884) Copyright (c) 2002-2017 www.mailtech.cn 163com
X-CM-CTRLDATA: WqpW62Zvb3Rlcl9odG09MjUzOjM5Mg==
Content-Type: multipart/mixed;
boundary="----=_Part_218429_202270086.1495197432753"
MIME-Version: 1.0
Message-ID: <6b289d2b.dd97.15c20b63bb1.Coremail.15616xxxx2@163.com>
X-Coremail-Locale: zh_CN ------=_Part_218429_202270086.1495197432753
Content-Type: multipart/related;
boundary="----=_Part_218430_777936326.1495197432753" ------=_Part_218430_777936326.1495197432753
Content-Type: multipart/alternative;
boundary="----=_Part_218431_95247708.1495197432753" ------=_Part_218431_95247708.1495197432753
Content-Type: text/plain; charset=GBK
Content-Transfer-Encoding: base64 c2Rm
------=_Part_218431_95247708.1495197432753
Content-Type: text/html; charset=GBK
Content-Transfer-Encoding: base64 PGRpdiBzdHlsZT0ibGluZS1oZWlnaHQ6MS43O2NvbG9yOiMwMDAwMDA7Zm9udC1zaXplOjE0cHg7
Zm9udC1mYW1pbHk6QXJpYWwiPjxkaXY+c2RmPC9kaXY+PGRpdj48aW1nIHNyYz0iY2lkOjQyZWE3
NDczJDIkMTVjMjBiNjNiYjEkQ29yZW1haWwkMTU2MTYxMDQ0NzIkMTYzLmNvbSIgb3Jnd2lkdGg9
IjQ4IiBvcmdoZWlnaHQ9IjQ4IiBkYXRhLWltYWdlPSIxIiBzdHlsZT0id2lkdGg6IDQ4cHg7IGhl
aWdodDogNDhweDsiPjwvZGl2PjwvZGl2Pjxicj48YnI+PHNwYW4gdGl0bGU9Im5ldGVhc2Vmb290
ZXIiPjxkaXYgaWQ9Im5ldGVhc2VfbWFpbF9mb290ZXIiPjxkaXYgc3R5bGU9ImJvcmRlci10b3A6
I0NDQyAxcHggc29saWQ7cGFkZGluZzoxMHB4IDVweDtmb250LXNpemU6MTZweDtjb2xvcjojNzc3
O2xpbmUtaGVpZ2h0OjIycHgiPjxhIGhyZWY9Imh0dHA6Ly95b3UuMTYzLmNvbS9pdGVtL21hbnVm
YWN0dXJlcj90YWdJZD0xMDAxMDAwJmZyb209d2ViX2FkX2ppYW9iaWFvMSIgdGFyZ2V0PSJfYmxh
bmsiIHN0eWxlPSJjb2xvcjojMzM2NkZGO3RleHQtZGVjb3JhdGlvbjpub25lIj6hvs340tfX1NOq
fDMwzOzO3tPHzcu79aG/zt7TocG8xrfWxtTsyczWsbmpu/m0obTytddU0PS1yLrDzu+jrM/eyrEy
OdSqxvAmZ3Q7Jmd0OzwvYT4KICZuYnNwOyAmbmJzcDs8L2Rpdj48L2Rpdj48L3NwYW4+
------=_Part_218431_95247708.1495197432753-- ------=_Part_218430_777936326.1495197432753
Content-Type: image/png; name="circle.png"
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="circle.png"
Content-ID: <42ea7473$2$15c20b63bb1$Coremail$15616104472$163.com> iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAQAAAD9CzEMAAAABGdBTUEAALGPC/xhBQAAACBjSFJN
AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElN
RQfaBBoAAAC1VYTSAAAEGElEQVRYw63Ye4hUZRjH8c/Mjpu6XtbcSjTZki1dK2VBCtPRIJSU2oyi
gsrAzL/CEC9kaPiHVBJBBaYUSYgRlRGZFV2MaPKKmhfU1Kxlt7y73lZXXXe2P86c2XGd3XXd8/wz
c2be5/d9n987c97nPTFtRvLKyy7iYtIuS+d+nGpDIXYN4l0MMNhQtytRqFC9Ov/aZ5cDzrYHibUj
fptxJiiXcNxBh51DQol++uuuxhrf2qGhdUSsDfE7PW+SAmutsdURZ13ODuruRkOM8aB+1lpqQ2Ba
qn1ARr7YFNPUWWGVqlzHU1euS7EHvKjcSu84mA8Ryys/zELDfGiZQ615nIMp8ohZzptr7dUjY3mS
JnjLIfNtaHv5WqzVa0ZZ4DPpKzMKrhr8hPf86iV7A/FqbUW1aqVwyk96mOOsPyjNySpoIf+Qd31h
rlPtzT0XUgoN1rnsFcfsyEUUtPB+qV+86vy1y+fUkbZFkRl2qmpGxHIAfSxXYLLjHRFvYXF37xvs
STWhRjxnxFSDzXP8OrRlKz5vgS5mSoSuxLPsoaZabGvHzMkTVRZ5zNjwMqwgZoojVnROPpO52ibT
dc8CkjBEpWVOdGbqWUS9JSqMDpTDCiqd8V2n7Qljve2eDn6hAaC3ib53NAr5TA1fut9tJMWTUG6g
H6KYejZ+w8jmCu5V68+I7AlUauw2KgTEVNijNtIKGmx0lx4BoEiZXVfushHEHiVuDgDFequKWJ5q
hUoCQE9dr/f+kz9SUKshBHSVaO4OIosLzukdLnKji5EDaBILAGkJPSKXT7hBfQCo16DXVV1cZ6On
bk4EgDPq9YtSOwn9pR0LALUOuyNyi8qcCQEX7TZMYcSAEf5xMrwXbTDIrVGtQhL6qrBRYwjYJO2+
SOdf4abg/xZPQbVNHtUlMvmYSf6ym7CCRp8bYXgUJiWhzDgr1ZESz9w5UvaboqCziEz2c85bHbwN
9+Q6i403JhKDKjxruf+CqTc3Xj9KmatvZ2rI9HZzHPRJ+Fk88AeXLHKLGddvUyZrqrHeaG4gMs1v
KRx3zGxnWjbgHZJ/2Js+8JEmGYUMINOC75Uw21E7O4pIhi+L/W6+C83bV/Z8UK2UJlsUm+m0HZpK
rxmSkR9viX1ediJ3d8w54VQrpdE63czWyzYXrqWOZFB7oSnettn04CjYnJXvjJYw2Tz7LbQ27DVS
eaWzUWaWSsstcrLl6NaOsSMtcLeVltmZD5IjPsBTXlDvdatcbvcYm5PcxzOm6e1nX9nsaJ6+qady
E1Xq6lMfq8lfa95HCdn5DVTpcWVO2mmb/Y6pk9ZVsYGGu8cAB33ja3+3bmSrD0OykB6GGq3CIMXS
LkmLizvrgO3W2x02PB18GHKV0wlFSvRSqMklp9Wq0xh+2VbL9j9IHjTiA2DrdAAAACV0RVh0ZGF0
ZTpjcmVhdGUAMjAxNi0wOS0xN1QxNToyMjo1NiswODowMJ6pg4wAAAAldEVYdGRhdGU6bW9kaWZ5
ADIwMTAtMDQtMjZUMDA6MDA6MDArMDg6MDCgVTtdAAAATXRFWHRzb2Z0d2FyZQBJbWFnZU1hZ2lj
ayA3LjAuMS02IFExNiB4ODZfNjQgMjAxNi0wOS0xNyBodHRwOi8vd3d3LmltYWdlbWFnaWNrLm9y
Z93ZpU4AAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJ
bWFnZTo6SGVpZ2h0ADEyOEN8QYAAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAMTI40I0R3QAA
ABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAx
MjcyMjExMjAwCSkN7wAAABJ0RVh0VGh1bWI6OlNpemUAMi4zMktCSJ1SyQAAAFt0RVh0VGh1bWI6
OlVSSQBmaWxlOi8vL2hvbWUvd3d3cm9vdC9zaXRlL3d3dy5lYXN5aWNvbi5uZXQvY2RuLWltZy5l
YXN5aWNvbi5jbi9zcmMvMjk3LzI5NzEyLnBuZ5u0pR4AAAAASUVORK5CYII=
------=_Part_218430_777936326.1495197432753-- ------=_Part_218429_202270086.1495197432753
Content-Type: text/plain; name="first.txt"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="first.txt" MTIzNA==
------=_Part_218429_202270086.1495197432753--
如有问题,欢迎在评论区交流。。
MIME协议在邮件中的应用详解的更多相关文章
- Android中Intent组件详解
Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件.Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的(Goal)或期望(Expectation),叙 ...
- springcloud中Feign配置详解
Spring Cloud中Feign配置详解 到目前为止,小伙伴们对Feign的使用已经掌握的差不多了,我们在前文也提到Feign是对Ribbon和Hystrix的整合,那么在Feign中,我们要如何 ...
- 【转】linux中inittab文件详解
原文网址:http://www.2cto.com/os/201108/98426.html linux中inittab文件详解 init的进程号是1(ps -aux | less),从这一点就能看出, ...
- (转)python标准库中socket模块详解
python标准库中socket模块详解 socket模块简介 原文:http://www.lybbn.cn/data/datas.php?yw=71 网络上的两个程序通过一个双向的通信连接实现数据的 ...
- [翻译]Unity中的AssetBundle详解(三)
构建AssetBundles 在AssetBundle工作流程的文档中,我们有一个示例代码,它将三个参数传递给BuildPipeline.BuildAssetBundles函数.让我们更深入地了解我们 ...
- 「翻译」Unity中的AssetBundle详解(二)
为AssetBundles准备资源 使用AssetBundles时,您可以随意将任何Asset分配给所需的任何Bundle.但是,在设置Bundles时,需要考虑一些策略.这些分组策略可以使用到任何你 ...
- 「翻译」Unity中的AssetBundle详解(一)
AssetBundles AssetBundle是一个存档文件,其中包含平台在运行时加载的特定资产(模型,纹理,预制,音频剪辑,甚至整个场景).AssetBundles可以表示彼此之间的依赖关系;例如 ...
- MyBatis中@MapKey使用详解
MyBatis中@MapKey使用详解我们在上一篇文章中讲到在Select返回类型中是返回Map时,是对方法中是否存在注解@MapKey,这个注解我也是第一次看到,当时我也以为是纯粹的返回单个数据对象 ...
- 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类
第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一. 引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...
随机推荐
- 老李回答:JAVA程序的性能测试方法
Java 1.5以上都在虚拟机里内建了程序性能跟踪的功能,并提供了Java Profiling API,简称JPA,你可以搜索'java profiling'.Java也提供了简单的性能性能跟踪工具J ...
- 第一个python爬虫程序
1.安装Python环境 官网https://www.python.org/下载与操作系统匹配的安装程序,安装并配置环境变量 2.IntelliJ Idea安装Python插件 我用的idea,在工具 ...
- python+robot framework实现测报告定制化和邮件发送
前面已经介绍了python+robot framework自动化框架和基本原理的实现,详情请看 python+robot framework接口自动化测试 本章主要讲解报告已经产生那如何以自动化的方式 ...
- Myeclipse8.5开发-安装一:Myeclipse8.5注册码生成程序
环境:Myeclipces8.5 1.安装Myeclipces8.5. 2.打开Myeclipces新建任意项目. 3.新建MyEclipseKeyGen.java类.点击运行,控制台输入您的注册名, ...
- Android 开发之开发插件使用:Eclipse 插件 SQLiteManger eclipse中查看数据内容--翻译
最近研究了一段时间Android开发后发现,google自带的ADT工具,缺失一些开发常用的东西,希望可以构建一个类似使用JAVA EE开发体系一样开发的工具包集合,包括前台开发,调试,到后台数据库的 ...
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试
日常啰嗦 承接前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例>,已经讲解了dao层和service层的单元测试,还有控制器这层也不能 ...
- Xcode8.3 添加iOS10.3以下旧版本模拟器
问题起源 由于手边项目需要适配到iOS7, 但是手边的测试机都被更新到最新版本,所以有些潜在的bug,更不发现不了.最近就是有个用户提出一个bug,而且是致命的,app直接闪退.app闪退,最常见的无 ...
- 浅谈访问控制列表(ACL)
1.ACL简介2.前期准备3.ACL的基本操作:添加和修改4.ACL的其他功能:删除和覆盖5.目录的默认ACL6.备份和恢复ACL7.结束语 1.ACL简介 用户权限管理始终是Linux系统管理中最重 ...
- 一个简单的jquery左右列表内容切换应用
选中左边某个选项点击添加,即可将选中项添加到右边文本框中,点击选中全部即可将全部选项移到右边,移除按钮功能相同. html代码: <div id="main"> < ...
- C# 事务之SqlTransaction
private static void Execute(string connectionString) { using (SqlConnection connection = new SqlConn ...