1、邮件服务器 李玉平 摘要:电子邮件是因特网上最为流行的应用之一。如同邮递员分发投递传统邮件一样,电子邮件也是异步的,也就是说人们是在方便的时候发送和阅读邮件的,无须预先与别人协同。与传统邮件不同的是,电子邮件既迅速,又易于分发,而且成本低廉。另外,现代的电子邮件消息可以包含超链接、 HTML 格式文本、图像、声音甚至视频数据。我们将在本文中查看处于因特网电子邮件核心地位的应用层协议。但在深入讨论这些协议之前,让我们先概览一下因特网邮件系统及其重要部件。 关键词:电子邮件 因特网 应用层 邮件服务器是一种 用来负责电子邮件收发管理的设备。它比网络上的免费邮箱更安全和高效,因此一直是企业公司的必备
2、设备。 1 引言 1 1 电子邮件介绍 电子邮件 (简称 E-mai1)又称电子信箱、电子邮政,它是 种用电子手段提供信息交换的通信方式。它是全球多种网络上使用最普遍的一项服务。这种非交互式的通信 ,加速了信息的交流及数据传送 ,它是 个简易、快速的方法。通过连接全世界的 Internet,实现各类信号的传送、接收、存贮等处理 ,将邮件送到世界的各个角落。到目前为止 ,可以说电子邮件是 Internet 资源使用最多的一种服务, E-mai1 不只局限于信件的传递 ,还可用来传递文件、声音及图形、图像等不同类型的信息。 电子邮件不是一种“终端到终端”的服务 ,是被称为“存贮转发式”服务。这正是
3、电子信箱系统的核心,利用存贮转发可进行非实时通信,属异步通信方式。即信件发送者可随时随地发送邮件,不要求接收者同时在场,即使对方现在不在,仍可将邮件立刻送到对方的信箱内 ,且存储在对方的电子邮箱中。接收者可在他认为方便的时候读取信件 ,不受时空限制。在这里 ,“发送”邮件意味着将邮件放到收件人的信箱中 ,而“接收”邮件则意味着从自己的信箱中读取信件 ,信箱实际上是 由文件管理系统支持的 个实体。因为电子邮件是通过邮件服务器 (mai1 server)来传递档的。通常 mail server 是执行多任务操作系统 UNIX 的计算机,它提供 24 小时的电子邮件服务 ,用户只要向 mail se
4、rver 管理人员申请 个信箱账号 ,就可使用这项快速的邮件服务。 电子邮件的工作原理: 1) 电子邮件系统是一种新型的信息系统 ,是通信技术和计算机技术结合的产物。 电子邮件的传输是通过电子邮件简单传输协议 (Simple Mail Transfer Protocol,简称 SMTP)这一系统软件来完 成的 ,它是 Internet 下的一种电子邮件通信协议。 2) 电子邮件的基本原理 ,是在通信网上设立“电子信箱系统”,它实际上是一个计算机系统。系统的硬件是一个高性能、大容量的计算机。硬盘作为信箱的存储介质 ,在硬盘上为用户分一定的存储空间作为用户的“信箱”,每位用户都有属于自己的 个电子
5、信箱。并确定 个用户名和用户可以自己随意修改的口令。存储空间包含存放所收信件、编辑信件以及信件存盘三部分空间 ,用户使用口令开启自己的信箱 ,并进行发信、读信、编辑、转发、存档等各种操作。系统功能主要由软件实现。 3) 电子邮件的 通信是在信箱之间进行的。用户首先开启自己的信箱,然后通过键入命令的方式将需要发送的邮件发到对方的信箱中。邮件在信箱之间进行传递和交换 ,也可以与另 个邮件系统进行传递和交换。收方在取信时,使用特定账号从信箱提取。 1 2 开发背景 当前流行的各大邮件客户端软件的除了最主要的收发信件之外,功能越来越复杂,但是人们平常真正用到的功能很少 ,很多功能尤其对于那些计算机知识
6、相对缺乏的人来说,更加显得太过于华丽而不太实用。有鉴于此,在了解 RFC 底层协议的基础上,我们开发了这个各种功能相对简单实用的邮件客户端程序,简化了 很多不必要的功能。 1 3 开发环境及运行环境 1 3 1 开发环境 AMD Athlon(TM), 512M 内存, 80G 硬盘 Microsoft Windows XP Professional Microsoft Visual Studio 2003(C Sharp) Microsoft Developer Network for Visual Studio.NET 2003 1 3 2 运行环境 Intel Pentium 2 及以上
7、处理器, 32M 以上内存, 4G以上硬盘 Microsoft Windows 9X/NT 操作系统 800*600 或以上的屏幕分辨率 确保机器上安装有 .Net FrameWork 1.0 或者以上版本 2 软件架构及系统用例图 2 1 系统架构 软件的总体架构如图 2.1: 图 2.1 软件架构图 2 2 系统总体用例 图 2.2 系统总体用例图 2 3 程序功能框图 用户 新建账号 发送邮件 接收邮件 纯文本邮件 带附件邮件 用户 主界面 主要功能选择 发送邮件类 接收邮件类 图 2.3 程序功能图 2 4 发送邮件类 是发送邮件的核心,类名为 SmtpMail,隶属于命名空间 Mai
8、lSend。封装了发送邮件的具体实现方法,也是具体的 RFC 用代码实现的过程。而用户通过具体的操作接口,接口与 SmtpMail 类通过交互操作来实现用户发送信件的操作。 2 5 附加小功能类 是获取一些诸如系统时间,当前用户名,以及本机 IP 之类的类,类名为AddExtra,隶属于命名空间 MailSend。 3 SMTP 协议的研究 由于要开发的是邮件客户端程序,就不得不用到 SMTP 协议和 POP 协议。而我 个人负责的是邮件发送功能的实现,因此就必然会涉及到 SMTP( Simple Mail Transfer Protocol)协议。 SMTP 被用来在因特网上发送邮件,该协议
9、规定了一客户端软件 电子邮件接收系统 电子邮件接收系统 附加功能 各种错误的提示 简单邮件接收 带有附件的邮件接收 简单邮件发送 带有附件的邮件发送 电子邮件编写 电子邮件的分类管理 通讯簿管理 些基本的命令和方法使客户端与服务器进行交互,以达到发送邮件的目的。 3 1 SMTP 协议简介及工作原理 3 1 1 介绍 简单邮件传输协议( SMTP)的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。 SMTP 的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了进程间通信环境( IPCE),此环境可以包括一个网络,几个网络或一个网络的子网。理解到传
10、送系统(或 IPCE)不是一对一的是很重要的。进程可能直接和其它进程通过已知的 IPCE 通信。邮件是一个应用程序或进程间通信。邮件可以通过连接在不同 IPCE 上的进程跨网络进行邮件传送。更特别的是,邮件可以通过不同网络上的主机接力式传送。 3 1 2 SMTP 模型 SMTP 设计基于以下通信模型:针对用户的邮件请求,发送 SMTP 建立与接收SMTP 之间建立一个双向传送通道。接收 SMTP 可以是最终接收者也可以是中间传送者。 SMTP 命令由发送 SMTP 发出, 由接收 SMTP 接收,而应答则反方面传送。 一旦传送通道建立, SMTP 发送者发送 MAIL 命令指明邮件发送者。如
11、果 SMTP接收者可以接收邮件则返回 OK 应答。 SMTP 发送者再发出 RCPT 命令确认邮件是否接收到。如果 SMTP 接收者接收,则返回 OK 应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回 OK 应答。 SMTP 提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到 接收方主机;或者,当两者不在同一个传送服务下时,通过中继 SMTP 服务器传送。为了能够对 SMTP 服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。 MA
12、IL 命令参数是回复路径,它指定邮件从何处来;而 RCPT 命令的参数是转发路径的,它指定邮件向何处去。向前路径是源路径,而回复路径是返回路径(它用于发生错误时返回邮件)。 当同一个消息要发往不同的接收者时, SMTP 遇到了向不同接收者发送同一份数据的复制品的问题,邮件命令和应答有一个比较奇怪的语法,应答也有一个数字代码。在下面,例子中可以看到哪些使用实际的命 令和应答。完整的命令和应答在第四节。 命令与应答对大小写不敏感,也就是说,命令和应答可以是大写,小写或两者的混合,但这一点对用户邮件名称却不一定是对的,因为有的主机对用户名大小写是敏感的。这样 SMTP 实现中就将用户邮箱名称保留成初
13、始时的样子,主机名称对大小写不敏感。 命令与应答由 ASCII 字母表组成,当传送服务提供 8 位字节传送通道,每 7位字符正确传送,而最高位被填充为 0。当指定一般的命令或应答格式后,参数会由一些类似于语言的字符串表示出来,如 “或 “,这里尖括号 表示这是一种类似于语言的变量。 3 2 SMTP 协议的命令和应答 3 2 1 SMTP 协议的命令 SMTP 命令定义了邮件传输或由用户定义的系统功能。它的命令是由 结束的字符串。而在带有参数的情况下,命令本身由 和参数分开,如果未带参数可以直接和 连接。邮箱的语法格式必须和接收站点的格式一致。下面讨论 SMTP 命令和应答。 发送邮件操作涉及
14、到不同的数据对象,它们由不同的参数相互连接。回复路径就是 MAIL 命令的参数,而转发路径则是 RCPT 命令的参数,邮件日期是 DATA命令的参数。这 些参数或者数据对象必须跟在命令后。这种模式也就要求有不同的缓冲区来存储这些对象,也就是说,有一个回复路径缓冲区,一个转发路径缓冲区,一个邮件内容缓冲区。特定的命令产生自己的缓冲区,或使一个或多个缓冲的内容被清除。 HELLO (HELO) 此命令用于向接收 SMTP 确认发送 SMTP。参数域包括发送 SMTP 的主机名。接收 SMTP 通过连接确认命令来向发送 SMTP 确认接收 SMTP。引命令和 OK 响应确认发送和接收 SMTP 进入
15、了初始状态,也就是说,没有操作正在执行,所有状态表和缓冲区已经被子清除。 MAIL (MAIL) 此命令用于开始将邮件发送到一个多个邮箱中。参数域包括回复路径。返回路径中包括了可选的主机和发送者邮箱列表。当有主机列表时,它是一个回复路径源,它说明此邮箱是由在表中的主机一一传递发送(第一个主机是最后一个接收到此邮件的主机)过来的。此表也有作向发送者返回非传递信号的源路径。因为每个传递主机地址都被加在此表起始处,它就必须使用发送 IPCE 而不是接收IPCE(如果它们不是一个 IPCE 的话)清楚的名称。一些出错信息的回复路径可能就是空的。 此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区
16、,并且将此命 令的回复路径信息插入到回复路径缓冲区中。 RECIPIENT (RCPT) 此命令用于确定邮件内容的唯一接收者;多个接收者将由多个此命令指定。转发路径中包括一个可选的主机和一个必须的目的邮箱。当出现主机列表时,这就是一个源路径,它指明邮件必须向列表中的上一个主机发送。如果接收 SMTP未实现邮件的传递发送,就会返回如未知本地用户( 550)的信息给用户。 当邮件被传递发送时,传递主机必须将自己的名称由转发路径的开始处移至回复路径的结束处。当邮件最终到达目的地时,接收 SMTP 将以它的主机邮件格式自己的名称插入 目标邮件中。例如,由传递主机 A接收的带有如下参数的邮件时, FRO
17、M: TO: 将会变成如下形式: FROM: TO:. 此命令导致它的转发路径参数加入转发路径缓冲区中。 DATA (DATA) 接收者将跟在命令后的行作为邮件内容。此命令导致此命令后的邮件 内容加入邮件内容缓冲区。邮件内容可以包括所有 128 个 ASCII 码字符。邮件内容由只包括一个句号的行结束,也就是如下的字符序列: “.“,它指示了邮件的结束。 邮件内容的结束指示要求接收者现在就处理保存的邮件内容。此过程将回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区的内容全部清空。如果操作成功,接收者必须返回 OK 应答;如果失败也必须返回失败应答。 当接收 SMTP 收到一条信息时,无论是用作转
18、发还是此邮件已经到达目的地,它都必须在邮件内容的开始处加上时间戳这一行,这一行指示了接收到邮件主机和发出此邮件主机的标识,以及接收到邮件内容的时间和日期。转发的信件将有多行这样的时间戳。当接收 SMTP 作最后一站的传送时,它将返回路径信息行插入邮件中。此行包括了发送命令中的 的信息。在这里,最后一站的传送的意思是邮件将被送到目的用户手中,但在一些情况下,邮件可能需要更进一步的加工并由另外的邮件系统传送。 可能在返回路径中的邮箱与实际发送的邮件不一致,这个情况可能发生在需要传送一个特定的错误处理信箱而不是信件发送者那里。上面所述说明了,最后的邮件内容由一个返回路径行,和在其后的一个 或多个时间
19、戳行构成。这些行后面是邮件内容的头和体信息。 当处理后面的邮件数据指示部分成功时就需要特定的说明。这种情况可能发生在发送 SMTP 发现当邮件需要传送给多个用户时,只能够成功地向其中的一部分发送信息这种情况下。在这种情况下,必须对 DATA 命令发送 OK 应答,而接收SMTP 组织并发送一个 “不可传递邮件 “信息到信息的发送者。在此信息中或者发送一个不成功接收者的列表,或者每次发送一个不成接收者,而发送多次。所有不可传递邮件信息由 MAIL 命令发送。 返回路径和接收时间戳例子 Return-Path: Received: from GHI.ARPA by JKL.ARPA ; 27 Oc
20、t 81 15:27:39 PST Received: from DEF.ARPA by GHI.ARPA ; 27 Oct 81 15:15:13 PST Received: from ABC.ARPA by DEF.ARPA ; 27 Oct 81 15:01:59 PST Date: 27 Oct 81 15:01:01 PST From: JOEABC.ARPA Subject: Improved Mailing System Installed To: SAMJKL.ARPA This is to inform you that . SEND (SEND) 此命令用于开始一个发送命令
21、,将邮件发送到一个或多个终端上。参数域包括了一个回复路径,此命令如果成功就将邮件发送到终端上了。 回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示这是一个传送路径,邮件就是经过这个 路径上的每个主机发送到这里的(列表上第一个主机是最后经手的主机)。此表用于返回非传递信号到发送者。因为每个传递主机地址都被加在此表起始处,它就必须使用发送 IPCE而不是接收 IPCE(如果它们不是一个 IPCE 的话)清楚的名称。一些出错信息的回复路径可能就是空的。 此命令清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。 SEND OR MA
22、IL (SOML) 此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,或者传送到邮箱中。对于每个接收者,如 果接收者终端打开,邮件内容将被传送到接收者的终端上,否则就送到接收者的邮箱中。参数域包括回复路径,如果成功地将信息送到终端或邮箱中此命令成功。 回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示这是一个传送路径,邮件就是经过这个路径上的每个主机发送到这里的(列表上第一个主机是最后经手的主机)。此表用于返回非传递信号到发送者。因为每个传递主机地址都被加在此表起始处,它就必须使用发送 IPCE而不是接收 IPCE(如果它们不是一个 IPCE 的话)清楚的名称。一些出错信息的回复路径可能就是空的。 此命令 清除回复路径缓冲区,转发路径缓冲区和邮件内容缓冲区,并且将此命令的回复路径信息插入到回复路径缓冲区中。 SEND AND MAIL (SAML) 此命令用于开始一个邮件操作将邮件内容传送到一个或多个终端上,并传送到邮箱中。如果接收者终端打开,邮件内容将被传送到接收者的终端上和接收者的邮箱中。参数域包括回复路径,如果成功地将信息送到邮箱中此命令成功。 回复路径包括一个可选的主机列表和发送者邮箱。当出现主机列表时,表示