MIME协议(一) -- RFC822邮件格式
MIME协议(一) -- RFC822邮件格式 .
如同其他各种电子文档一样,电子邮件内容也必须遵循一定的格式要求,各种邮件处理程序才能从中分析和提取出发件人、收件人、主题和附件等信息。邮件内容的基本格式和具体细节分别由RFC822文档和MIME协议定义。
1 RFC822邮件格式
邮件内容的格式在RFC822文档中定义,它包括两个主要的组成部分:邮件头和邮件体。在第2章的SMTP协议的实验中,it315_test @sohu.com邮箱中接收到的it315_test@sina.com发送来的邮件的最终内容如例程3-1所示,其中的行号不属于邮件内容,是作者为了便于讲解而加上的。
例程1 test.eml
1.Return-Path: <it315_test@sina.com>
2.Delivered-To: it315_test@mx72.mail.sohu.com
3.Received: from smtp.sina.com.cn (unknown [202.108.3.177])
4. by sohumx139.sohu.com (Postfix) with SMTP id E4F9802C1249
5. for <it315_test@sohu.com>; Thu, 10 Nov 2005 16:39:50 +0800 (CST)
6.Received: (qmail 49221 invoked from network); 10 Nov 2005 08:39: 33 -0000
7.Received: from unknown (HELO it315?test) (218.246.5.151)
8. by smtp.sina.com.cn with SMTP; 10 Nov 2005 08:39:33 -0000
9. From: it315_test@sina.com
10.To: it315_test@sohu.com
11.subject:test
12.Message-Id: <20051110083950.E4F9802C1249@sohumx139.sohu.com>
13.Date: Thu, 10 Nov 2005 16:39:50 +0800 (CST)
14.Status: RO
15.X-UIDL: 1131611863.21509_77.mx72
16.
17.test!!!
例程1中的第1~15行是邮件的邮件头,第17行是邮件的邮件体,邮件头和邮件体之间以一个空行进行分隔。这封邮件的邮件体内容非常少,只有一行“test!!!”文本。邮件头部分由多个头字段和字段内容组成,各种头字段分别用于表示邮件的发件人、收件人、发件时间和主题等信息。细心的读者可能已经看到,例程1中的邮件头部分比在第2章的SMTP协议的实验中实际发送的邮件头多出了一些头字段,这些头字段是各个SMTP服务器在传递邮件的过程加上的。SMTP服务器在传递邮件时,会把一些相关信息增加到邮件的邮件头中,这种情况有点类似于现实生活中的邮局在处理邮件时,通常都会在信封上加盖邮戳一样,表示这封邮件在什么时候经过了哪个邮局和由哪个工作人员经手处理。SMTP服务器按从下往上的方式添加各个字段,即先添加的字段位于后添加的字段的下面,例如,例程1中的邮件是由sina发送给sohu的,它首先经过sina的SMTP服务器,然后经过sohu的SMTP服务器,所以,sohu的SMTP服务器添加的头字段(1~5行)位于sina的SMTP服务器添加的头字段(6~8行)的上面。另外,POP3服务器也会在邮件头中增加一些头字段,例如,例程1中的12~15行。
每一个邮件头以“字段名:字段值”的格式出现,即每一行邮件头的内容依次由字段名、冒号、空格、字段值、回车换行符组成。RFC822文档中定义了多个标准的邮件头字段,每一个邮件头字段表示一种特定的信息。邮件头中也可以包含自定义的头字段,这种自定义的头字段通常是某个组织或机构内部专用的。下面是对例程1中出现的一些主要的邮件头字段的解释:
— Return-Path 该字段代表邮件的回复地址,该字段内容由接收邮件的SMTP服务器填写,接收邮件的SMTP服务器从邮件发送程序发出的mail form命令中获得该字段内容。
— Received 该字段的基本格式为Received from A by B for C,其中A为发送方,B为接收方,C为收件人的邮箱地址。该字段的内容由接收邮件的SMTP服务器填写,常常被用来追踪邮件传输的路线和分析邮件的来源,例如,从例程1中的各个Received字段中,可以知道这封邮件的传输路径:从IP地址为【218.246.5.151】的机器上发出→【smtp.sina.com.cn】→【sohumx139.sohu.com】→【it315_test@sohu.com】。例程1中的第6行的“Received: (qmail 49221 invoked from network)”是sina的SMTP服务器内部调用的一个邮件发送模块添加的,它说明sina的SMTP服务器接收到邮件后再通过这个邮件发送模块将邮件转发出去。显然,通过分析一封邮件的源内容,是可以知道发件人的IP地址的。
— From 该字段用于指定的发件人地址,邮件阅读程序显示的发件人地址就来源于这个字段。From字段中指定的发件人地址可以随意乱写,甚至不写,所以,邮件阅读程序显示的发件人地址不一定是真实的,这通常可以通过查看邮件头中的Return-Path字段来判断发件人的真实性。注意,SMTP协议中mail from命令中指定的发件人地址也可以伪造,所以,邮件头中的Return-Path字段也不是可以完全信赖的,对于比较重要的邮件,最好还是通过电话确认一下。
— to 该字段用于指定收件人地址。
— subject 该字段用于指定邮件的主题,如果主题内容中包含有ASCII码以外的字符,通常要对其内容进行编码。
— date 该字段用于指定邮件的发送时间。
邮件头中除了包含上面的这些字段外,还有另外两个比较常用的字段:
— cc 该字段用于指定邮件的抄送地址。
— bcc 该字段用于指定邮件的暗送地址。
抄送地址和暗送地址的区别在于,邮件阅读程序通常都不显示暗送地址,而会显示抄送地址。
邮件阅读程序在显示邮件信息时,所显示出来的发件人、收件人和主题等信息就是从相应的邮件头字段中提取出来的.
MIME协议(一) -- RFC822邮件格式的更多相关文章
- MIME协议(二)
MIME协议 RFC822文档定义了邮件内容的主体结构和各种邮件头字段的详细细节,但是,它没有定义邮件体的格式,RFC822文档定义的邮件体部分通常都只能用于表述一段普通的文本,而无法表达出图片.声音 ...
- MIME协议(三) -- MIME邮件的组织结构
一封MIME邮件可以由多个不同类型的MIME消息组合而成,一个MIME消息表示邮件中的一个基本MIME资源或若干基本MIME消息的组合体.每个MIME消息的数据格式与RFC822数据格式相似,也包括头 ...
- MIME协议生成邮件
MIME协议生成一封复杂的邮件 MIME协议是对RFC822文档的升级和补充,用MIME协议能生成一封有文字.图片和附件的复杂邮件.首先要导入activation.jar和mail.jar.Mail. ...
- MIME协议(五) -- MIME邮件的编码方式
5 MIME邮件的编码方式 由于每个ASCII码字符只占用一个字节(8个bit位),且最高bit位总为0,即ASCII码字符中的有真正意义的信息只是后面的7个低bit位,而传统的SMTP协议又是基于 ...
- 杂项:MIME(多用途互联网邮件扩展类型)百科
ylbtech-杂项:MIME(多用途互联网邮件扩展类型)百科 MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型.是设定某种扩展名的文件用 ...
- MIME协议
转:http://blog.csdn.net/flfna/article/details/5048290 MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候 ...
- MIME协议(六) -- MIME实例分析
MIME实例分析 了解MIME协议的基本组织结构后,下面用Outlook Express撰写出一封显示效果如图4所示的电子邮件,然后分析该邮件的源文件,以便读者更加深入地了解MIME协议. 1. 启动 ...
- MIME协议(四) -- MIME消息的头字段
MIME消息的头字段 4.1 Content-Type 对于表示某个具体资源的MIME消息,它的消息头中需要指定资源的数据类型:对于MIME组合消息,它的消息头中需要指定组合关系.具体资源的数据类型 ...
- 使用java语言基于SMTP协议手写邮件客户端
使用java语言基于SMTP协议手写邮件客户端 1. 说明 电子邮件是互联网上常见的应用,他是互联网早期的产品,直至今日依然受到广大用户的喜爱(在中国可能因为文化背景不同,电子邮件只在办公的时候常用) ...
随机推荐
- Java基础之IO和NIO补完
Java Stream,File,IO 关于NIO和IO的比较,参考:Java NIO系列教程(十二) Java NIO与IO java包之java.io 参考材料:菜鸟教材 NIO 由于下面的系列教 ...
- 计算机概论 64bit和32bit的CPU的不同
32位(WOW32).64位(WOW64,x64)指的是两种不同的CPU架构. 32位的CPU能够在每个时钟周期传输32位数据,而64位的CPU能够在每个时钟周期传输64位数据. 32位系统可以访问2 ...
- 怎样获取所有的embed节点对象
<embed>是H5中新增的标签, 可以通过: document.embeds 和 document.plugins 获取所有的 embed 节点 document.embeds === ...
- 使用X.509数字证书加密解密实务(二)-- 使用RSA证书加密敏感数据
一. 使用RSA证书加.解密敏感数据 X.509证书标准支持三种不对称加密算法:RSA, DSA, Diffie-Hellman algorithms.最常用的是RSA算法.所以本文就以前面章节使用 ...
- Django rest-framework框架-认证组件的简单实例
第一版 : 自己写函数实现用户认证 #models from django.db import models #用户表 class UserInfo(models.Model): user_type_ ...
- js中数组方法及分类
数组的方法有很多,这里简单整理下常用的21种方法,并且根据它们的作用分了类,便于记忆和理解. 根据是否改变原数组,可以分为两大类,两大类又根据不同功能分为几个小类 一.操作使原数组改变 1.数组的 ...
- 基于create-react-app脚手架,按需加载antd组件以及less样式
摘要 为了更好的书写css样式,在react中引入less,在网上查询了许多关于react引入less样式文件的资料,大多数都是需要在react项目中npm run eject暴露出底层文件,然后在底 ...
- VUE实现微博发布效果
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 80C51串行口
串行通信是指 使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度 单工.半双工.全双工 单工数据传输只支持数据在一个方向上传输 半双工数据传输允许数据在两个方向上传输,但是,在 ...
- Python学习记录3-函数参数详解
参数详解 参数分类 普通参数 默认参数 关键字参数 收集参数 普通参数 定义时直接定义变量名 调用的时候直接把变量或者值放入指定位置 def 函数名 (参数1, 参数2, ....): 函数体 # 调 ...