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 该字段用于指定邮件的暗送地址。
抄送地址和暗送地址的区别在于,邮件阅读程序通常都不显示暗送地址,而会显示抄送地址。
邮件阅读程序在显示邮件信息时,所显示出来的发件人、收件人和主题等信息就是从相应的邮件头字段中提取出来的.