Download presentation
Presentation is loading. Please wait.
1
TCP/IP基本原理 第八章 电子邮件
2
本章学习要求: 掌握:SMTP协议原理及工作过程 掌握:POP3工作原理 掌握:IMAP与POP3的区别 掌握:RFC 822 的主要内容 了解:MIME标准
3
8.1 概述 电子邮件服务作为Internet上应用最多和最广的服务项目得到了非常广泛的应用,在网络应用中也起到非常重要的作用。如同其他的网络服务,电子邮件系统也有其使用的传输协议,包括SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)、POP(Post Office Protocol,邮局协议)和IMAP(Internet Message Access Protocal,消息访问协议)等,这些协议应用于电子邮件的发送和接收。一些邮件处理软件如OutLook Express和FoxMail等就是按照SMTP和POP3 协议结合Windows Sockets套接字进行设计来收发邮件的。本文以SMTP协议为研究对象,在Visual C++ 6.0编程环境下按照SMTP协议通过套接字发送SMTP命令,接收并处理邮件服务器的反馈信息,从而实现对电子邮件的发送。
4
8.1.1 邮件传输协议SMTP 在Internet中,电于邮件的传送是依靠简单电子邮件传送协议SMTP进行的。本节将介绍电子邮件的传送过程以及SMTP协议的具体应用。 电子邮件的传递过程 电子邮件系统采用所谓“存储转发”(Store and forward)工作方式。一个电子邮件从发送端计算机发出,在网络传输的过程中,经过多台计算机的中转,最后到达目的计算机,送到收信人的电子信箱。在Internet上,电子邮件的这种传递过程有点像普遍邮政系统中常规信件的传递过程。 当用户写好一封信投入邮政信箱以后,信件将由当地邮局接收下来,通过分检和邮车运输,中途可能需要经过一个又一个邮局转发,最后到达收信人所在的邮局。再由邮递员交到收信人手里或者投入他的信箱中。类似地,在Internet上,一个电子邮件首先由发送方计算机(客户机)的邮件管理程序将邮件进行分拆并封装成传输层协议 (TCP) 下的一个或多个TCP邮包,而这些TCP邮包又按网络层协议(IP)包装成IP邮包,并在它上面附上目的计算机的地址(IP地址)。一旦客户机完成对电子邮件的这些编辑处理以后,客户机的软件便自动启动,根据目的计算机IP地址,确定与哪一台计算机进行联系。假如联系成功,便将IP邮包送上网络。
5
IP邮包在Internet的传递过程中,通过路由选择,经特定路线上的某些路由器的转发,最后到达邮件的目的计算机。在接收端,电子邮件程序会把IP邮包收集起来,取出其中的信息,按照正确的次序复原成初始的邮件,最后传送给收信人。如果在传输过程中发现IP邮包丢失,目的计算机便要求发送端重发。传输过程中,如果一个邮包在传输前后的“检验和”不一致,则表明传输有错,这种邮包必须舍弃重发。尽管电子邮件的具体传递比较复杂,但是TCP/IP软件采取了各种措施保证邮包的可靠传递。 一般来说,邮件总能从发送端计算机可靠地传递到目的计算机。如果目的计算机未开机或者机器本身暂时出现故障,电于邮件如何传递?在TCP/IP软件的电于邮件系统中,提供了一种所谓“延迟传递”(delayed delivery)机制,在远方的目的计算机暂时不能被访问的情况下,发送端的计算机会把邮件存储在缓冲储存区中,然后不断地进行试探发送。这种功能是由TCP/IP软件中一种称为Spooling的缓冲储存技术提供的,用户界面负责电子邮件的生成及处理,客户机和服务器相当于“电子化邮局”,负责电于邮件的传输;发送邮件缓冲储存区和接收邮件信箱相当于电于邮件库,在库里面为每一个用户设立一个电于信箱,用于存放用户邮件,直到用户登录对它进行处置。
6
用户首先利用用户界面生成邮件,然后把它交给发送邮件缓冲储存区,此后的发送过程均不需要用户参与。负责发送电于邮件的客户机是一个后台进程,当它检测到在缓仲储存区里有待发邮件时,便立刻将其取出,并把目的计算机的名字映射成IP地址,然后请求与对方服务器建立TCP连接(包括形成TCP邮包和IP邮包的一系列过程)。如果连接成功,便把IP邮包发送出去。经过一系列复杂的传递过程,IP邮包到达对方服务器以后,服务器便将收到的邮件存入接收邮件信箱。只有客户机确信邮件己顺利到达对方信箱以后,它才会将相应的邮件从缓冲储存区中删除。 如果对方计算机关机或者机器出现故障,连接不成功,那么客户机将会记下发送时间,客户机的后台进程将周期性地检测(缓冲储存区,每当它发现有未发邮件或者用户传来新邮件时,它便立即启动发送程序进行发送。当发现某一个邮件很长时间(一般为三天)都发送不出去时,客户机便把它退回发送者的信箱。 电子邮件的传递过程是十分可靠的,这是因为Internet是建立在TCP连接的基础上的。客户机在发送IP邮包之前,SMTP首先将调用TCP服务原语(包括客户机的连接请求、服务器的响应和确认等原语)与目的计算机上的服务器建立TCP连接,连接成功以后才能进行传输。如果客户机与服务器之间不能建立TCP连接,那么,电子邮件就无法发送到目地计算机的服务器上。在这种情况下,客户机是不会将待发的电子邮件从缓冲储存区中删除的。
7
SMTP协议通讯模型 SMTP协议是TCP/IP协议族中的一员,主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。SMTP协议的通信模型并不复杂,主要工作集中在发送SMTP和接收SMTP上:首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最终的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。通讯模型用下图表示:
8
SMTP协议的命令和应答 从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的 SMTP命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响。双方如此反复多次,直至邮件处理完毕。SMTP协议共包含10个SMTP命令,列表如下:
9
识别发送方到接收SMTP的一个HELLO命令 MAIL FROM:<reverse-path><CRLF>
命令说明 HELLO <domain> <CRLF> 识别发送方到接收SMTP的一个HELLO命令 MAIL FROM:<reverse-path><CRLF> <reverse-path>为发送者地址。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱 RCPT TO:<forward-path><CRLF> <forward-path>标识各个邮件接收者的地址 DATA <CRLF> 接收SMTP将把其后的行为看作邮件数据去处理,以<CRLF>.<CRLF>标识数据的结尾。 REST <CRLF> 退出/复位当前的邮件传输 NOOP <CRLF> 要求接收SMTP仅做OK应答。(用于测试) QUIT <CRLF> 要求接收SMTP返回一个OK应答并关闭传输。 VRFY <string> <CRLF> 验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。 EXPN <string> <CRLF> 验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。 HELP <CRLF> 查询服务器支持什么命令
10
SMTP协议的每一个命令都会返回一个应答码,应答码的每一个数字都是有特定含义的,如第一位数字为2时表示命令成功;为5表失败;3表没有完成。一些较复杂的邮件程序利用该特点,首先检查应答码的首数字,并根据其值来决定下一步的动作。下面将SMTP的应答码列表如下: 应答码 说明 501 参数格式错误 251 用户非本地,将转发向<forward-path> 502 命令不可实现 450 要求的邮件操作未完成,邮箱不可用 503 错误的命令序列 550 504 命令参数不可实现 451 放弃要求的操作;处理过程中出错 211 系统状态或系统帮助响应 551 用户非本地,请尝试<forward-path> 214 帮助信息 452 系统存储不足,要求的操作未执行 220 <domain>服务就绪 552 过量的存储分配,要求的操作未执行 221 <domain>服务关闭 553 邮箱名不可用,要求的操作未执行 421 <domain>服务未就绪,关闭传输信道 354 开始邮件输入,以"."结束 250 要求的邮件操作完成 554 操作失败
11
SMTP协议 在TCP/IP协议集中,提供了两个电子邮件传送协议:邮件传送协议MTP(Mail TransferProtocol)和简单邮件传送协议 SMTP(Simple MaiI Transfer Protocol)。在Internet中,电子邮件的传送都是依靠SMTP进行的,它的最大特点就是简单,因为它只规定了电子邮件如何在Internet中通过发送方和接收方的TCP协议连接传送。而对其他操作均不涉及。 在Internet中,前台与用户交互的工作是由其他程序来承担的。例如,在UNIX系统中,用户使用前台的mail和mailx等程序,间接地调用了在UNIX系统内配置的Sendmail程序,实现SMTP协议对电子邮件的传送。 我们知道,计算机通信需要涉及客户机和服务器程序之间的交互。电子邮件系统也采用客户机/服务器结构。在后台,SMTP协议就是按照客户机/服务器方式工作的。发信人的主机为客户方,收信人的邮件服务器成为服务器方,双方机器上的SMTP协议相互配合,将电子邮件从发信方的主机传送到收信方的信箱。在传送邮件的过程中,需要使用TCP协议进行连接。SMTP协议规定了发送方和接收方双方进行交互的动作。发送方的主机与接收方的邮件服务器直接相连,从而建立了从发送方主机到接收方的邮件服务器之间的直接通道,这就保证了邮件的传送十分可靠。 当然,在传送邮件的过程中,双方需要交换一些应答信息,而这是通过使用SMTP协议的一组命令来实现的。
12
8.2 POP3和Internet邮件管理协议IMAP
POP的全称是 Post Office Protocol,即邮局协议,用于电子邮件的接收,它使用TCP的110端口。现在常用的是第三版 ,所以简称为 POP3。POP3采用Client/Server工作模式。 在电子邮件软件的账号属性上设置一个POP服务器的URL(比如pop.163.com),以及邮箱的账号和密码。当我们按下电子邮件软件中的收取键后,电子邮件软件首先会调用DNS协议对POP服务器进行解析IP地址,当IP地址被解析出来后,邮件程序便开始使用TCP协议连接邮件服务器的110端口,因为POP服务器是比较忙的,所以在这个过程中我们相对要等比较长的时间。当邮件程序成功地连上POP服务器后,其先会使用USER命令将邮箱的账号传给POP服务器,然后再使用PASS命令将邮箱的账号传给服务器,当完成这一认证过程后,邮件程序使用STAT命令请求服务器返回邮箱的统计资料,比如邮件总数和邮件大小等,然后LIST便会列出服务器里邮件数量。然后邮件程序就会使用RETR命令接收邮件,接收一封后便使用DELE命令将邮件服务器中的邮件置为删除状态。当使用QUIT时,邮件服务器便会将置为删除标志的邮件给删了。
13
POP3协议的工作过程 工作过程大致可分为以下三步: 1. 授权过程:用户需要收发电子邮件时,通过拨号网络与ISP提供的服务器建立TCP连接,当连接成功时,服务器要求你输入用户名和密码以“验明正身”,如果被授权使用,POP3服务器会对你的邮箱建立一个“独占锁定”,以方便服务器能够“不受打扰”地工作,同时也是为了在意外时避免邮件被删除。 2. 传输过程:成功连接后,服务器便进入了传输过程:服务器首先启动“无响应自动退出计时器”,如果用户在规定的时限内没有和服务器进行通信,服务器便自动和用户断开TCP连接,等待下一次连接。用户每当成功地和服务器通信一次,“无响应自动退出计时器”自动清零。用户首先得到的是由服务器检索到的有关邮件的基本信息(比如邮件的份数),每当成功传输完一份邮件之后,服务器便对该邮件做上一个删除标记。如果整个传输过程一帆风顺,传输完之后便直接进入更新状态。否则,屏幕提示出错,服务器保留未传输的邮件,等待以后的存取。 3. 更新状态:当顺利传输完邮件之后,或是因为某种原因致使传输过程中断,服务器都将进入更新状态,在这个过程中,服务器将删除信箱中已做了删除标记的邮件,以免信箱被涨破。同时保留那些未能成功传送的电子邮件。
14
二、IMAP IMAP的全称是Internet Message Access Protocol,是指从邮件服务器上获取 的信息或直接收取邮件的协议。目前国内一些ICP已推出基于IMAP的免费电子邮件服务,供网民们选择和使用。这将改变我们传统的收信习惯,使我们有更大的自主权,收信更方便。 POP3和IMAP在使用上的区别 传统的POP3在收信时用户首先连接邮件服务器,验证完用户名和密码后,用户将得到有关所有邮件的信息(如邮件的数量和大小)。然后,就开始将服务器上存储的邮件下载到用户的硬盘上,每传完一份,服务器便对该邮件作一个删除记录,等待全部传输完毕后,存储在服务器上的所有邮件将被清空。也就是说在整个收信过程中,用户是无法知道那些信件的具体信息,只有照单全收入硬盘后,才能慢慢浏览和删除。使用POP3,用户几乎没有对邮件的控制决定权。一旦碰上邮箱被轰炸,一连收到上百封一模一样的信,用户就不可能第一时间作出判断,分析信的内容和来信地址,决定是否下载或删除。解决的办法只有借助“收件箱助理”等工具,在下次连接时再根据预定的条件进行删除,实在很麻烦。有时候一时反应不过来,大量的垃圾邮件已登录你的硬盘,堆积在“收件箱”里。
15
如果使用IMAP就轻松多了。它在连接后,可在下载前预览全部信件的主题和来源,即时判断是下载还是删除。IMAP还具备智能存储功能,可使邮件保存在服务器上,那么办公一族就可以将单位处理不完的邮件,在回家后继续通过IMAP来查看了。既然生杀大权掌握在我们自己手里,那么那些可恶的垃圾邮件,就不再费时费事地下载到硬盘中,占领我们宝贵的空间和浪费我们的网费了。只要根据主题判定哪些是广告和垃圾,就可以直接在服务器上删除。 IMAP新账号的设置 设置IMAP账号与设置POP3的过程是基本一样的,只是在“电子邮件服务名”的填写中将“接收的邮件服务器是POP3服务器”改成IMAP就行了。然后设置IMAP服务器的地址,比如21CN网站的IMAP地址是: 。其他方面的设置应该没多大的问题。设置完成后,与普通POP3账号不同的是,系统会为该账号自动建立一个文件夹。此时它会告诉你“是否愿意下载你刚刚创建的IMAP账号的文件列表?”,若已连上Internet就选“是”。
16
8.3 信文格式RFC822与邮件扩展标准MIME 一、信文格式RFC822
RFC 822消息格式于1982年通过,定义了Internet文本邮件的标准消息格式。随着电子邮件的发展,这种消息格式不再能满足用户的需要,它的缺点越来越明显,主要有以下几个方面: 只规定了文本消息格式,对于非文本消息如多媒体消息的格式没有规定。即使是文本消息,也只能处理ASCII字符集,对于非该字符集的字符不能处理。 RFC 822限制邮件消息内容为7位ASCII码短行,这就迫使用户把非文本数据转换成7位可打印的ASCII字符。 RFC 822的不足还表现在它与X400系统互通的情况下。X400消息可以包含非文本信体,而RFC822消息如上所述不包含非文本信体;X400消息内容为八比特流,RFC 822消息内容是7位ASCII码。因此,X400系统与RFC 822互通时,或者把非文本消息转换为ASCII格式,或者丢弃该消息并通知用户,这是用户不希望发生的情况。因为即使UA(用户代理)不能处理这些非文本消息,用户还可有一些外部机制,从UA中提取有用的信息。 由于RFC 822存在这些缺点,因此在发展多媒体电子邮件时,Internet用户希望能有一种更好的消息格式标准替代它,MIME就是这样一种标准。
17
二、邮件扩展标准MIME MIME的特点 MIME是一种新型邮件消息格式,它具有下列特点: 可以在一份消息中包含多个信体; 可以表示ASCII文本和非ASCII文本; 可以表示图像、话音以及二进制数据等非文本消息; 可以使用多语种和多字体表示消息; 可以扩展处理新出现的消息类型。 MIME标题字段 MIME是RFC 822的扩展。它描述了四种标题字段,用来表示各种信体类型,如文本、话音和图像等,并不会与现有的RFC822邮件发生冲突: 1.MIME版本号:用于声明消息是MIME消息,使UA能正确处理消息。 2.内容类型:用于描述消息信体中数据的类型和子类型,使接收方UA能选择适当的方法处理这些数据。MIME定义了七种内容类型和相应的子类型: ①"文本"内容类型,是默认的内容类型,可用多种字符集表示文本消息,可用标准方式表示格式化的文本。plain子类型,表明消息是未格式化的文本。此外还可用其它格式表示扩展文本。显示"文本"消息时不需要特殊的软件,但是要支持指定的字符集。
18
② "多部分"内容类型,用于在消息中包含多个不同数据类型的信体部分。两个相邻信体部分之间用定界符分隔。每一部分的数据可以单独编码。
当信体部分相互独立并且具有某种次序时,使用"混合"子类型。UA把不认识的"多部分"子类型作为"混合"类型处理。 "可选"子类型用多种格式表示同一数据,使接收方能根据自身环境选择最佳的消息表示格式。 "文摘"子类型中的每一个信体部分的默认类型是"消息RFC822",而不是"文本/plain",这样做提供了更多可读的文摘。 “并行”子类型指示消息中的所有信体部分需要同时显现。 ③ "应用"内容类型,用于传输应用数据或二进制数据,如基于邮件的文件传送、扩展表、基于邮件的日程安排系统的数据和"活动"邮件。这些数据在用户浏览之前必须由应用程序进行处理。"应用"内容类型定义了下列两种子类型: "八比特流",指示信体中包含的是二进制数据。当邮件阅读器遇到不能识别的内容类型值时,阅读器把该邮件作为"应用/八比特流"类型处理。 "PostScript",用于传送包含PostScript文档的信体。
19
④ "消息"内容类型,用于封装其它种类的邮件消息。其子类型主要用于被转发消息或被拒绝消息。
子类型“RFC 822"指示信体中包含的消息是被封装的RFC822消息。这里的RFC 822消息实际上是指MIME消息。 "部分"子类型允许大消息作为几个独立的邮件块发送和投递,接收方UA可以自动恢复原来的消息。当中间传送代理限制单个消息的小时可以使用这种消息类型。在"部分"类型中,只允许使用"7位"内容传送编码。 “外部信体”子类型指示消息中没有包含实际的信体数据,真正的数据是作为外部引用给出的,消息中只包含了访问这些数据所需要的信息,接收者可以根据这些信息使用 FTP、TFTP等文件传送系统获取数据。 ⑤ "图像"内容类型,指示信体中包含静态图像。"JPEG"和"GIF"子类型表示两种专用的图象格式。 ⑥ "音频"内容类型,指示信体中包含音频或话音数据。"基本"子类型指示信体是使用8位PCM编码的音频数据。 ⑦ "视频"内容类型,指示信体中包含视频,还可能有颜色和"音频"数据。子类型"MPEG"表示信体是用MPEG标准编码的视频数据。
20
3. 内容传送编码:内容传送编码提供了数据类型的本地表示与能够用7位邮件传送协议进行数据交换的表示法之间的映射。MIME定义了五种编码机制:
“7位”、“8位”、“二 进 制”、“基本64”和 “quoted-printable”。"8位", "7位"和"二进制"用来指示信体中包含的数据的类型,它们没有进行编码。"quoted-printable"用来表示大部分由八位比特组成的数据,这些八位比特与ACSII字符中的可打印字符对应。经过"quoted-printable"编码生成的八比特序列,邮件传送中不可能被修改。"基本64"内容传送编码用来表示任意八位特序列。它用ASCII的 65个字符子集 (64个打印字符和一个专用字符"=")对数据编码 ,每6位原始数据可以用一个打印字符表示。因此当输入24比特时 ,输入 4个已编码字符。 4.附 加 的 标 题 字 段: 用于进一步描述消息信体中的数据。它具有下列两种字段 : 内容描述,用于简述信体内容 ,它使用ASCII文本。为了满足用户的特殊需要和适应今后的发展 ,MIME还规定了扩展机制 ,允许对各种子类型值 、字符集名 、内容传送编码值以及字段值进行扩展。
21
MIME用户代理 (UA) MIME邮件系统的基础是具有MIME功能的UA。这种用户代理不仅应该能识别和显示MIME消息 ,而且应该能建立 MIME消息。为了实现这一点 ,MIME UA应包含各种媒体的编辑器、处理器以及 MIME消息成器和分析器、分配器。发送方UA调用各种媒体编辑器,建立各自的信体部分 ,通过合成器添加适当的标题字段 ,将各个部分合成在一起 , 生成 MIME消息。MIME消息经由邮件传送系统传送到对方 UA。对方UA接收到消息后 ,先使消息经过消息分析器 ,根据消息的标题信息识别不同的信体,然后将各个信体经分配器送至相应的处理器中进行处理。 MIME只是一种消息格式 ,它对于消息传送系统未作任何修改 ,它的消息传送系统与现有的 Internet消息传送系统一样,只是信息格式不同 , 因此MIME UA可以在现有 UA基础上经过扩展而得到 ,也可以重新设计单独的MIME UA。由于 MIME是一种可扩展的、模块化的标准 ,MIME UA的功能很容易扩展。为了增加对某一种新消息类型的支持 ,用户只增加这种消息的处理程序 ,然后通知 UA何时以及如何调用该程序即可。
22
尽管 MIME UA能够通过扩展处理新的消息类型 ,但是它毕竟不能处理全部的消息类型。而多媒体邮件包含的消息类型各种各样 ,其中很可能包含一些 UA不能处理的消息 ,如使用不同的语音编码方式生成的话音消息,一旦遇到这种情况 ,大多数 UA只能丢弃或拒绝消息。通过建立配置文件可以解决这个问题。在网络中建立一个公共配置文件 , 网络中所有的 UA都可以访问它。当某个UA创 建了一种新的消息类型,就向该文件中写入处理这种消息所需的程序名和程序的地址。当其 UA遇到这种消息时 ,就可以查询配置文件 ,了解如何处理这种消息。通过配置文件可以在不增加UA复杂程度的情况下,扩展 UA的功能。例如 ,在 UA中只给出一种语音编码和解码方法,其它的方法可以查询配置文件 ,这样 UA可以处理几乎所有的语音编码文件。Internet的编程语言Java的出现使得这种方法更具有广阔的前景。
23
本章习题 参见教师网页:
Similar presentations