教你看懂邮件头信息<转载>
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==
教你看懂邮件头信息<转载>的更多相关文章
- 教你看懂Code128条形码
首 页 条码控件 条码技术 条码新闻 合作伙伴 联系我们 常见问题 电话:010-84827961 当前位置:条形码控件网 > 条形码控件技术文章 > >正文 教你看懂C ...
- 文科生也能看懂的iptables教程(转载)
据说还是个MM, 写得很通俗易懂, 还很诙谐, 原文:http://dallascao.com/cn/iptables-tutorial-for-newbies/ 对于斗胆开始玩vps的文科生来讲,i ...
- emmm 深入浅出教你看懂现代金融游戏
3303只信仰公平[网易陕西省西安网友]1 比特币是骗人的.你们都被“现代帼家纸币”概念茜脑了,而且茜的很彻底,所以你们看不透比特币的骗局.简单来说,现代纸币是“空气纸”,比特币是“空气币(空气数据) ...
- 教你看懂网上流传的60行JavaScript代码俄罗斯方块游戏
早就听说网上有人仅仅用60行JavaScript代码写出了一个俄罗斯方块游戏,最近看了看,今天在这篇文章里面我把我做的分析整理一下(主要是以注释的形式). 我用C写一个功能基本齐全的俄罗斯方块的话,大 ...
- 教你看懂C++类库函数定义之三---_stdcall
一切从一个C++ 类库头文件开始,现在在做一个C++的项目,期间用到一个开源的界面库DUILib(类似MFC),这个东西还不错能很容易的写出漂亮的界面,比如QQ的界面,可以去下载下来研究研究,地址:h ...
- 教你看懂C++类库函数定义之一---HRESULT 宏
一切从一个C++ 类库头文件开始,现在在做一个C++的项目,期间用到一个开源的界面库DUILib(类似MFC),这个东西还不错能很容易的写出漂亮的界面,比如QQ的界面,可以去下载下来研究研究,地址:h ...
- 手把手教你看懂并理解Arduino PID控制库——引子
介绍 本文主要依托于Brett Beauregard大神针对Arduino平台撰写的PID控制库Arduino PID Library及其对应的帮助博客Improving the Beginner’s ...
- 教你看懂Docker和K8S!
转载于 https://my.oschina.net/jamesview/blog/2994112 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫“dotCloud”的公司. 这家公司主要 ...
- 教你看懂 OpenStack 日志 - 每天5分钟玩转 OpenStack(29)
instance 从创建到删除的整个生命周期都是由 Nova 管理的. 后面各小节我们以 instance 生命周期中的不同操作场景为例,详细分析 Nova 不同组件如何协调工作,并通过日志分析加深大 ...
随机推荐
- PNG文件结构分析 ---Png解析
PNG文件结构分析 ---Png解析 为了实现更高级的应用,我们必须充分挖掘PNG的潜力. PNG的文件结构 根据PNG文件的定义来说,其文件头位置总是由位固定的字节来描述的: 十进制数 13 ...
- 【Mysql】初学命令行指南
MYSQL初学者使用指南与介绍 一.连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlbi ...
- 关于UT的一些总结
本文是个人对于UT的一些想法和总结,参考时建议请查阅官方资料. 转载请注明出处:http://www.cnblogs.com/sizzle/p/4476392.html 测试思想 编写UT测试代码,通 ...
- oracle 11g在安装过程中出现监听程序未启动或数据库服务未注册到该监听程序
15511477451 原文 oracle 11g在安装过程中出现监听程序未启动或数据库服务未注册到该监听程序? 环境:win7 64位系统.oracle11g数据库 问题描述:在win7 64位系统 ...
- 按钮点击WIN8 磁贴效果
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
- Tkinter教程之Canvas篇(2)
本文转载自:http://blog.csdn.net/jcodeer/article/details/1811888 '''Tkinter教程之Canvas篇(2)''''''9.创建item的tag ...
- 【转】Phonegap离线调用SQLite数据库文件
按:不可多得的好文章,转过来以免源丢失 文章来源:http://liuwei.co/index.php/default/The-quickest-way-to-execute-many-sql-for ...
- Android多媒体--MediaCodec的实例化方法
*由于作者水平限制,文中难免有错误和不恰当之处,望批评指正. *转载请注明出处:http://www.cnblogs.com/roger-yu/ MediaCodec的实例化方法主要有两种: 1.使用 ...
- Sqlserver作业-手把手带你体验
所谓Sql Server作业就是按照规定的时间执行指定的脚本,如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理-SQL Server代 ...
- [HIve - LanguageManual] Union
Union Syntax select_statement UNION ALL select_statement UNION ALL select_statement ... UNION is use ...