基于POP3的邮件收发系统的设计与实现.doc_第1页
基于POP3的邮件收发系统的设计与实现.doc_第2页
基于POP3的邮件收发系统的设计与实现.doc_第3页
基于POP3的邮件收发系统的设计与实现.doc_第4页
基于POP3的邮件收发系统的设计与实现.doc_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

陕西理工学院毕业设计题 目 基于POP3的邮件收发系统的设计与实现 学生姓名 陈新鹏 学号 1213014008 所在学院 物理与电信工程学院 专业班级 电子1201班 指导教师 李菊叶 完成地点 物电学院计算机信息处理实验室 2016 年 6 月 5 日陕西理工学院毕业设计毕业论文设计任务书院(系) 物电学院 专业班级 电子信息工程 学生姓名 陈新鹏 一、毕业论文设计题目 基于POP3的邮件收发系统的设计与实现 二、毕业论文设计工作自_2016 _年_3 _月10 日 起至_ 2016_年 6 月 20 日止三、毕业论文设计进行地点: 物电学院计算机信息处理分室 四、毕业论文设计的内容要求:POP3(Post office Protocol 3)是适用于C/S结构的脱机模型电子邮件协议,它规定怎样将个人计算机连接到Internet的邮件服务器下和下载电子邮件的协议。本设计要求学生,在Visual c+环境下,使用POP3技术开发一个邮件接收系统,接收邮件服务器上的邮件之后,把邮件下载并保存到本地计算机上,要求可以提取邮箱里的邮件数量和标题字段等内容。 五、 毕业论文设计应收集资料及参考文献:1徐孝凯,张纪勇.C+面向对象程序设计:VC+6.0运行环境M.天津大学出版社2009. 2汪晓平,钟军.VC+网络通信协议分析与应用实现M.北京:人民邮电出版社,2003. 3王艳平,张越.Windows网络与通信程序设计M.北京:人民邮电出版社,2006. 4 Andrew S.Tanenbau.计算机网络(第四版)M.北京:清华大学出版社,2004. 5谢希仁.计算机网络(第五版)M.北京:电子工业出版社,2012. 6朱桂英.张元亮 Visual C+网络编程开发与实践M.清华大学出版社.2013. 六、 毕业论文设计的进度安排: 3月2日3月29日:查阅资料,完成初步设计方案和开题报告。 4月1日4月26日:根据POP3邮件收发系统的工作原理,给出设计方案,及软件流程图。 4月29日5月24:并在软件环境下进行运行调试,进一步完善系统功能,整理资料; 5月27日6月7日:撰写、修改毕业设计论文。 6月10日6月15日:打印论文准备并完成答辩。 指导教师签名 系(教研室)主任签名 专业负责人签名 批准日期 基于POP3的邮件收发系统的设计与实现陈新鹏(陕西理工学院物理与电信工程学院电子信息工程专业,2012级1班,陕西 汉中 723000)指导教师:李菊叶摘要电子邮件是互联网基础服务中重要的一部分。从互联网在上世纪90年代开始逐步发展之时到今天信息极大丰富的互联网2.0时代,实现电子邮件POP3收取都有重要的意义。本设计使用Visual Studio 2010作为开发平台,使用Windows Socket 2应用程序接口,实现了一个具有POP3邮件接收和保存功能的计算机邮件接收程序,同时介绍了POP3邮件接收协议、base64解码方法和基于Windows下Visual C+的程序设计以及实现的方法。 关键字电子邮件; POP3协议; Winsock2; Visual C+Design and implementation of an E-mail system based on POP3 protocolChen Xinpeng(Grade12,Class01,Major electronics and information engineering School of Physics and Telecommunication Engineering, Shaanxi University of Technology, Hanzhong 723000,Shaanxi)Tutor: Li JuyeAbstract: E-mail is an important part of basic Internet service. From the beginning of the progressive development of the Internet in the 1990s, to the great wealth of information in the Internet 2.0 era today, achieveing the e-mail POP3 charge always is an important significance. This design uses Visual Studio 2010 as the development platform, using the Windows Socket 2 application program interface, achieved a computer mail receiving program which having a POP3 mail receiving and storing function with the POP3 mail receiving protocol which based on Windows under Visual C + programming and methods of implementation.Keywords: E-mail; POP3 protocol; Winsock2; Visual C +目录1. 引言11. 1 背景11. 2 研究目的11. 3 开发环境及语言11. 3. 1 开发环境11. 3. 2 开发语言21. 4 WinSock2简介32. POP3协议与传输标准52. 1 POP3状态简述52. 1. 1 认证(Authorization)状态52. 1. 2 事务(Transaction)状态62. 1. 3 更新(Updata)状态72. 2 Base64标准82. 2. 1 BASE64编码82. 2. 2 BASE64解码92. 3 中文字符编码标准92. 3. 1 GB2312字符集92. 3. 2 GBK字符集92. 3. 3 UNICODE编码93. 系统流程和规划103. 1 主程序总体设计103. 2 POP3执行流程113. 3 BASE64解码流程133. 3. 1 主题与发件人解码133. 3. 2 邮件正文解码143. 4 邮件保存流程154. POP3邮箱的C+实现174. 1 TCP发送接收的实现174. 1. 1 发送函数的C+封装174. 1. 2 接收函数的C+封装174. 2 POP3协议命令的实现184. 2. 1 认证状态C+实现184. 2. 2 事务状态C+实现184. 2. 3 更新状态C+实现184. 3 Base64 的C+解码实现194. 3. 1 BASE64块解码194. 3. 2 BASE64文本解码194. 3. 3 BASE64解码邮件主题205. 软件测试21结束语23致谢24参考文献25附录A:26附录B:44ii1. 引言电子邮件(electronic mail 简称E-mail)是指用电子方式传送的信件。其中也可能包括多媒体信息,包括图片、音乐、视频等等。电子邮件是基础互联网服务之一,从古老的阿帕网开始算起,尽管目前互联网发展已经有将近50年,电子邮件诞生也超过45年,但是电子邮件始终是最为广泛应用的,也是最为可靠的信息传送方式之一。电子邮件不仅可以用来发送接收普通文本信件消息,现代的电子邮件多数都是基于html超文本标记语言的,通过在支持这一协议的客户端或者网页端打开邮件,用户能感受到和最简单的文本邮件完全不一样的体验。它甚至可以让用户免费得到大量的多媒体信息,通过邮件订阅,用户也可能得到免费新闻和专题报道等等内容。电子邮件由于其优越的特性,在上世纪上网仍然需要拨号的时代就开始广为流行,并在国内获得了“伊妹儿”这一昵称。网民对其喜爱程度可见一斑。电子邮件的蓬勃发展和其C/S结构是分不开的,邮件服务只要求服务器长时间在网,客户端完全可以脱离网络,只在接收发送邮件的短时间内才连接网络,这种特性大大降低了早期互联网发送邮件的费用。任何服务器和客户端之间的连接都需要通过协议支持才能完成,而POP3协议(Post Office Protocol - Version 3,邮局协议版本3)就是支撑这种特性实现的基础。通过这一技术,用户可以只在很短的时间内联网,就可以下载大量邮件并且离线阅读,节省了互联网初期用户的费用开支的同时,也极大的丰富了人民的网络信息生活。1. 1 背景电子邮件曾经是网络上最主要的通信方式,从1971年诞生开始,电子邮件就开始改变了人们的信息交流方式。1987年9月份,CANET在北京计算机应用技术研究所内正式建成了中国第一个国际互联网电子邮件节点,并在9月14日发出了中国第一封电子邮件。这一事件标志着中国人使用互联网的历史拉开了序幕,可见电子邮件系统在互联网时代的重要性绝非其他互联网服务可以相提并论的。到了21世纪,在即时通信和社交网络的冲击下,关于电子邮件是否仍然有必要存在的争论开始进入人们的视线,但是电子邮件作为商务交流和网络账号注册中不可或缺的一部分,电子邮件现在仍然在全球范围内拥有众多用户。计算机网络并无国界,和即时通讯充满竞争并且协议不公开的现状不同,电子邮件协议统一并且可以轻松发往国外,这也使电子邮件更为适合国际化环境下的应用。自从谷歌提供免费GB级别的谷歌邮箱开始,多数互联网邮件提供商都开始了免费化服务,邮件存储空间扩大,删除邮件也变得不再是必须的。而用户发送电子邮件成本几乎为0,低成本的邮件发送服务也使得垃圾邮件一度十分猖獗。近年来,电子邮件技术日趋成熟,已经开始了从以提供和保证邮箱基础服务为主的POP3/SMTP协议向以提供安全邮件信息服务为特征的SSL/ IMAP协议过渡。作为全世界使用最广泛的通信方式之一,电子邮件的开放性极大地方便了各地网民的信息交流,及资源的共享。1. 2 研究目的虽然现在绝大多数邮件服务商都有网页版本的邮件服务端,但是对于网络收到资费限制的地方,或者处理能力有限的嵌入式设备,POP3协议相比网页端都是更加适合这些应用环境的。同时,众多软件内部都包含邮件接收系统,比如有些软件的bug反馈就是通过客户端内置的SMTP服务向服务器发送bug反馈邮件,在服务端查看邮件的时候就可能需要使用到pop3协议。因此清楚POP3协议并且使用C+语言实现协议执行功能,仍然是十分有必要的。1. 3 开发环境及语言本文中POP3邮箱使用Visual Studio 2010开发环境,使用C+语言编写程序代码。1. 3. 1 开发环境Visual Studio可以用来创建Windows平台下的Windows应用程序。Visual Studio 2010相比VC+6.0具有新外观和新功能,功能也更加强健。VC+6.0发布于1998年,当时主流系统还是Windows 95/98,尽管后来发布了SP6补丁包,但是对新的操作系统支持仍然很不够。1998年时C+语言也没有统一标准,C+第一个标准是1999年发布的,所以导致VC+6.0语法和相当一部分编译器不兼容。而这些问题在Visual Studio 2010中都没有出现。Visual Studio 2010是微软在2010年推出的多语言编译器,可以支持C/C+,C#,Visual Basic等一系列语言。同时部分支持C+ 0x标准,对于新的语言特性有更好的支持的同时,也更加符合现代程序开发流程,团队化合作非常方便。并且可以支持新的操作系统,Windows 7等NT6.0以上的系统和Windows XP都能完美支持,并且开发的程序安全性能更好。但是相对于VC+6.0,Visual Studio 2010国内教材和书籍更少,因此学习成本也更大。为了实现完整的邮箱功能,更加符合现代化操作系统程序开发,本文中选择使用Visual Studio 2010作为设计开发平台。Visual Studio 2010包含很多完全集成的工具。这些工具可以使编写C+程序的过程变得十分轻松。作为IDE的一部分,Visual Studio 2010提供了编辑器,编译器,链接器和库。这些都是编写C+程序所需要的基本工具1。他们的功能如下:1) 编辑器:编辑器给用户提供了创建和编写C+代码的环境。除了常见的文本操作功能,比如复制粘贴等等,编辑器一般还提供语言元素高亮这一功能。它可以自动识别C+语言当中的关键字,并且按照分类给这些关键字着不同的颜色,这一功能使得代码的可读性更加好,并且当程序员拼错关键词时,编译器会给出清楚的提示。2) 编译器:编译器可以将编辑器编辑后的源代码转换为目标代码,并且在这个过程当中检测代码错误。代码错误包括无效的或者不能被识别的代码,或者代码结构错误(比如代码永远不会被执行到,代码缺少了大括号等等)。编译器输出的目标代码存储在目标文件当中,在Visual Studio当中,目标文件是obj格式的。3) 链接器:链接器根据编译器输出的obj目标代码生成各种模块。从程序库当中添加所需代码模块之后将所有模块组合成可以执行的可执行文件。链接器也会检测和报告错误,这些错误一般是程序缺少了某个模块,或者程序当中使用了不存在的库文件,等等。4) 库:库并不只是预先写好的示例代码集合,它更是经过专业制作的标准代码,可以扩展并且支持C+语言的特性。这些代码经常整合到用户的程序中,来执行非常常见的功能2。Visual Studio 2010提供了本论文当中必不可少的标准库,比如IO流,顺序容器,字符串。关联容器等等。1. 3. 2 开发语言本文使用C+语言作为程序开发语言。C语言始于1972年,在1983年,贝尔实验室的Bjarne Strou-strup发明了一种基于C语言的扩充和完善版本的语言:C+。 C+面向对象,并且继承了C语言的高效率,这使得C+很快推广了起来并且获得了成功。C+经历了33年的打磨时间的打磨,其在工业界的地位已经相当稳固,在很多领域里已经是不可取代也没有必要取代的统治者。C+具有非常好的跨平台特性,并且具有足够高的效率。这对于计算机网络编程而言,这两者都非常重要。因为因特网并不区分接入设备的操作系统,无论是Windows系列的Windows XP, Windows 7, Windows Server还是POSIX系列的Linux,UNIX,以及基于这两者的众多安卓移动设备,苹果Pad等,都要能接入互联网。众多的设备底层完全支持C+,这为程序的可移植性提供了保证。而效率是另外一方面。计算机网络要求具有低延迟的连接特性,因此效率必须足够,这一点C+也可以保证。因此C+完全具备开发网络应用程序的一切特性。C+语言是一门充满活力的编程语言。它不仅跨平台,具有强大的功能,极高的效率,在此同时还能保持语言进化相当的活力。从C+ 标准1998年版本到C+2011年版本的,C+正在变成一门完美的程序设计语言。原来版本当中来不及引入的内容,以及语言机制中发现的一些缺陷,都在新的版本当中得以弥补和发展。比如新版标准当中引入了无序容器,以弥补原版标准中对hash容器的缺陷。新版本标准支持移动构造函数和移动赋值运算符,以减小特定场合下对象拷贝的性能开销。新版本标准不但在语法上增加了大量特性,而且在标准库当中引入了大量设施,这不光使得标准库对于C+语言的重要性远超从前3,也使得“重复造轮子”,尤其是制造低级轮子这种事情在C+语言界变成上一个时代的事情。1. 4 WinSock2简介C+网络编程在不同的操作系统上需要不同的编程规范。WinSock规范就是Windows下为编写通用TCP/IP应用程序提供的一个强大且可扩展的API。程序员可以使用一个基于Windows Sockets规范的Windows Sockets来实现创建任何类型的TCP/IP客户端或者服务器应用程序。 Windows Sockets规范有两个主要版本,1.1版本和2版本。Windows Sockets规范1.1版本的作者试图限制WinSock的范围以促进WinSock的发展和成功。 这一目标确实达成了,Windows Socket1.1仅仅支持TCP/IP协议,它对其他的协议并没有提供支持。同时Windows Socket 1.1仅仅能创建一个活跃的dll,这种特性也限制了这一版本的灵活性。因此可见,Windows Socket1.1主要提供的是针对TCP/IP协议,单一活跃dll而设计的。而Windows Sockets规范2.0版本正式为一系列其他协议提供了API支持,并且允许他们同时存在。Windows Sockets2也增加了一些具有实质功能的新函数。并且,最重要的一点是,Windows Sockets两个版本之间是兼容的,原来基于WinSock1.1的应用程序可以不用修改直接在Windows Sockets2上运行。这对于原本基于WinSock1.1开发的应用程序是非常重要的,平滑升级的同时也可以完全享受到Windows Sockets2带来一系列新特性和更高的效率提升。4Windows Sockets 2 相比Windows Sockets 1.1具有很多让人印象深刻的新特性。这些新特性所涉及的面积很广泛,具体可以包括以下几种分类:1) 多协议支持:新版本支持更多协议,可以方便用户二次开发2) 分散和聚合:新的协议版本对发送和接收提供了更多的缓冲器支持3) 重叠I/O:应用使用异步I/O的时候提高了应用程序的执行效率4) QoS支持:WinSock2支持控制流量规范并且可以接收当其变化时的通知。5) Socket分组:通过对Socket的属性进行分组,并且支持按照分组设置优先级。6) 多点和多播:可以有选择性的发送数据,通过多播将数据发送到多个目标。7) 接受条件控制:根据协议连接与断开的变换中发送接收正常数据之外的其他数据。8) 进程级别的Socket共享功能:可以在一个或者多个进程中共享Socket。Windows Socket 2 API的数量和WinSock1.1相比,其函数数量多了几乎一倍之多。不同于仅支持单一活跃dll的WinSock,WinSock2同时可以在同一台计算机上面提供多个WinSocket,这让其灵活性大大增加,同时WinSock2增加了架构的灵活性,多个协议栈和接口仅仅使用一个顶层dll就可以完成所有的功能。WinSock API通过标准化服务提供接口与服务提供商进行交流,并且能够同时多进程的在多个服务提供商之间进行对话。下图展示了Windows Sockets2 架构的简单描述5:Windows Sockets 1.1 应用程序Windows Sockets 2应用程序WinSock1.1 APIWinSock.dll (16位) WSOCK32.dll (32位)WinSock2 APIWinSock2 服务提供商接口WS2-32.dll(32位)附加传输服务提供商SPX/IPX等基于TCP/IP域名解析网页空间服务提供商TCP/IP传输服务提供商图1.1 Windows Socket 2的WOSA架构示意图2. POP3协议与传输标准POP3协议用来支持客户端远程管理服务器上面的电子邮件。这个协议允许用户连接到远程服务器之后,将邮件保存到本地计算机上,然后删除在服务器上的邮件副本。这个协议是在RFC-1939当中定义的。POP3协议采用Client/Server工作模式。POP3服务器遵循POP3协议,始终保持在线来接收其他电子邮箱发送过来的邮件,而POP3客户端则负责和POP3服务器连接,在这之后,下载在服务器端的邮件。在默认配置下,该协议使用TCP连接,110端口进行访问。POP3协议是一个并不复杂的协议,因此很多人们熟悉的功能在这个协议当中并没有直接实现。比如查看收到了多少封新邮件,恢复之前被删除的邮件等等功能。这些功能需要软件自己记住之前接收的邮件,然后通过计算得出新邮件到底有哪些才能完成任务。这一特性有些像RISC架构通过实现一些最简单和最常用的功能,对这些功能进行复杂组合之后,就可以实现更高的复杂性才能完成的任务,而且效率也很高。2. 1 POP3状态简述POP3协议通过一系列命令,使得服务器和客户端之间建立连接并登录,之后传送邮件等等。POP3本身命令并没有很多,只包含了最基本的一些功能,如登录认证,下载邮件,删除邮件等等,除此之外,POP3指令还有3个可选指令,能够实现一些增强安全性等等的功能6。POP3命令和其当前所处的状态是分不开的,一些命令只能在部分状态下面使用,一些命令又会导致当前状态发生改变,所以设计计算机程序的时候,也要注意这些才能正确编程处理,否则可能会发生一些意外的bug。2. 1. 1 认证(Authorization)状态按照命令状态区分,经常在“认证”状态执行的命令有两个:USER命令:USER命令只能在认证的状态下使用,而且必须是通过Greeting命令和服务器打过招呼之后,或者USER+PASS命令认证失败之后才能执行的命令。这个命令的使用方式是USER+用户登录名+rn。这里的rn是常见的转义字符,意义等同于按下回车键。例如当登录用户名是”sinper”的时候,命令就应该这么执行:”USER sinperrn”。这个命令根据执行正确与否,可能得到服务器两个回复:+ OK 用户名有效- ERR 用户名无效任何一个命令执行是否成功都能通过返回的回复得到判断。如果回复是以+ OK开头的,这样的回复就代表上一个命令成功执行了。如果回复以- ERR开头,这就代表这个命令执行失败,需要结合具体情况来判断之后的操作。PASS命令:PASS命令只能在认证状态下使用,并且需要在这之前成功执行过USER命令。和USER命令相似,它的使用方式也是PASS+用户密码+rn。例如登录名是sinper的用户使用了a1b2c3密码的时候,命令应该这样执行:”PASS a1b2c3rn”。这个命令根据执行正确与否,可能得到服务器两个回复:+ OK 登录成功- ERR 登录失败登录失败的原因并不仅仅只有密码错误这一种常见的情况。POP3协议会在一个连接过程中为这个用户邮箱加锁,这样其他的POP3程序就不能再次访问这个邮箱了,当然也就不能在有其他人登录这个邮箱的时候再次登录,除非这个连接因为超时自动断开,锁自动解除。邮箱加锁情况下,POP3服务器同样会登录失败7。2. 1. 2 事务(Transaction)状态经过这两个命令之后,如果执行成功,服务器状态就会从认证状态(AUTHORIZATION)转到了事务状态(TRANSACTION)。这时就可以读取邮件,删除邮件,更新邮件系统等等操作了。STAT命令:STAT命令只能在事务状态使用,否则POP3服务器端会报错。这个命令并没有任何参数,执行之后会返回当前登录的邮箱的邮件数量和总邮件大小。得到的回复一般如下:+ OK 2 320/包含两封邮件,一共320byte大小- ERR command not vaild in this stat./状态不正确,可能是在认证状态错误使用了命令。STAT命令的意义是,可以为客户端收件软件预估要占用的内存空间和存储硬盘空间的大小,当内容过于庞大的时候提醒用户,不至于应用正在运行因为内存不够或者硬盘空间不足导致应用直接卡死或者崩溃。LIST命令:这个命令可以附带一个参数,也可以不附带参数。命令只能在TRANSACTION模式,即事务模式使用。当附带参数的时候,该命令的功能是返回指定邮件编号的大小。如果不带参数,那么这个命令执行之后,服务器端会返回所有邮件的大小。注意,如果用这个命令查看被标记为将要删除的邮件的大小的时候,可能返回错误值,因此不应该以这个值作为参考。这个命令根据执行参数和结果,可能得到服务器几种回复:不带参数,直接执行LIST+ OK 5 messages (720 octets)1 1502 2105 110.带参数执行LIST 2:+ OK 2 210执行命令遇到错误:- ERR 命令失败,一般后面会跟随错误原因。RETR命令和TOP命令:这两个命令都可以让邮件服务器端返回邮件的具体信息,不同的是,TOP命令执行需要两个参数,一个具体邮件编号,一个返回前几行的行数。之后会返回和邮件发件人,发信时间等等这些信息。而RETR命令会返回邮件的全部信息,并且当然也包含TOP命令返回的一切。这两个命令都只能运行在事务模式下面,并且都必须带参数,参数的大小在1到邮件总数之间,表示返回具体哪个邮件的相关信息。两个命令执行之后,会得到+ OK信息,然后跟随几行到十几行的邮件信息。当邮件有相当多的内容或者有附件的时候,RETR命令可能会返回非常长的信息。这些信息一般使用BASE64进行编码,所以都是可以显示的内容。邮件内容显示结束之后,会有单独一行以一个单独的半角句号作为终止符,告诉POP3客户端信息传送完全结束了。至此一封邮件的要求内容将会被完全取回。命令成功执行。DELE命令:这个命令的作用是标记删除一封邮件,它需要带一个参数,表明具体删除邮件的标号。这个命令执行之后并不会直接删除邮件,而仅仅是做一个标记,等到执行QUIT命令的时候,脱离事务模式之后才会真正执行删除操作。客户端得到POP3服务器的回复一般都是+ OK,示例如下:执行DELE 3+ OK message 3 deleted/邮件1成功标记删除执行 DELE 3- ERR message 3 already deleted/邮件2已经被标记为删除了REST命令:在一封邮件已经通过DELE命令标记删除之后,可以使用REST命令恢复标记,这样邮件就不会在执行错误删除之后,退出被真正删除了。这个命令不需要任何参数,因此执行完之后,任何之前被标记为需要删除的邮件,都会被取消标记。邮件服务器传回的信息如下:执行 REST+ OK maildrop has 3 messages (540 octets)NOOP命令:服务器和客户端连接需要占用一定资源,所以一般情况下服务器不可能长期保持一个TCP连接,而会在一段时间服务器和客户端之间没有数据交流之后就自动断开连接,来达到节省系统资源,同时避免一些客户端卡死而无法释放连接,一直占用服务器资源这种情况发生。正常情况下,服务器和客户端需要保持定时发送一个命令来达到保持连接的要求。NOOP命令就能达到这样的功能。通过客户端定期向服务器发送NOOP命令,服务器可以知道客户端仍然在线,继续保持链接。这个命令执行之后,服务器端会返回一个积极回复,表示命令执行成功:执行 NOOP+ OK 2. 1. 3 更新(Updata)状态退出命令可以令系统从事务状态中退出,进入更新状态。在事务状态中标记为删除的邮件,如果退出事务状态之前没有执行过REST命令取消删除标记,将会在进入更新状态时候删除。进入更新状态之后,连接将会自动断开,并且加在邮箱上登录锁也会被取消。这样,其他客户端就可以登录到这个邮箱当中了。QUIT命令:这个命令可以退出事务状态,使对话进入更新状态,这样之前的操作就可以得到执行了,比如之前如有过删除指令,在退出之后,删除将正式进行。这个命令本身并不需要参数,一般情况下,执行完这个语句之后,此次邮件服务器连接就会自动断开了。命令执行如下:执行QUIT+ OK /成功执行- ERR some deleted messages not removed/一些邮件没有被成功删除,返回错误2. 2 Base64标准电子邮件发明于上个世纪的美国,一开始只用于传输文本文件。英文文本绝大多数都是用ASCII编码的,其特点是只使用了一个字节的低7位,最高位一般始终为0。电子邮件因此也只能传输这样的文本。后来电子邮件应用于非英语国家,兼容问题就出现了。例如中文文本,为了区分编码和ASCII并不一致,其最高位往往都是1,这样的信息直接使用POP3协议传输时不被允许的。因此需要一种协议将中文等其他语言的文本转化为可打印的ASCII文本才能发送。在MIME当中,有两种常用的编码转换方式,Quoted-printable和Base64。Quoted-Printable方式主要适用于ASCII文本当中夹杂了少量的非ASCII字符这种情况。该方式规定所有可以打印的ASCII字符都用原来的方式表示,而将不可打印的ASCII用其16进制编码表示,前后各加一个=来表示。很明显,汉字包含大量不可打印ASCII字符,所以并不适合这种方式。相比Quoted-Printable标准,base64可以用更短的编码后文本传送更多的消息,在网络拥堵或者移动网络等环境不佳的条件下,这种编码也有更加优秀的表现。互联网上绝大多数邮件服务提供商也都是使用base64进行编码的。在这里我们着重讨论Base64编码。2. 2. 1 BASE64编码Base64之所以命名为base64,是因为选出了64个字符,基于这64个字符编码所有的二进制文件。这64个字符分别是大小写英文字母,10个数字,和符号+/。ASCII编码每8个bit为一个字节,我们选取3个byte,这样一共有24bit,正好可以拆解成4个6bit,而26=64,因此每3个字节会被编码成4个可打印字节。这样编码之后,其长度会比原来的文本长出大约三分之一作用,但是这样的编码保证了所有字符都是可打印的。下图十分直观地说明了base64编码规则,源字符ManASCII码值7797110Bit 码010011010110000101101110编码后码值1922546Base64编码TWFu图2.1 Base64编码示例当然编码过程中可能会遇到编码字符不足3个的时候,这时分为两种情况。1) 编码有两个字节:这种情况一共有两个8bit,一共16位二进制。我们仍然按照规则转换成三组,前两组是正常编码,后一组剩下16-6-6=4个bit,向其结尾加两个0,之后进行编码。编码之后三个字符后面补一个“=”号表示三个字符缺少1个。2) 编码只有一个字节:这种情况一共有一个字节,8bit。我们按照规则转换成两组,第一组正常编码,后一组剩下8-6=2个bit,向其结尾加4个0,之后进行编码。编码之后两个字符后面补齐两个“=”符号,表示这一组三个编码字符缺少两个。Base64编码在很多场合都很常用,例如php语言中就提供了base64_encode()用于编码、base64_decode()用于解码。Python里面也有专门的模块来编码解码一系列base编码。但是C+语言并没有可以直接使用的程序来完成这一任务,因此需要程序时自己实现这一功能。在本设计中,使用了map这一容器进行解码时的查找。2. 2. 2 BASE64解码本次毕业设计目的是完成POP3邮件解码,因此过程和编码过程完全相反。但是只要了解编码过程,解码过程只是它的逆过程,实现并不困难。解码过程先判断解码文本最后有几个=符号,来判断最后一个解码块有多少字符。其他部分可以按照4个byte解码为3个byte的方式运行。通过逻辑移位和或运算,解码过程运行速度很快,并不需要担心效率问题。2. 3 中文字符编码标准英文字符编码标准现在仍然使用的几乎只有ASCII编码。但是中文字符由于历史问题,编码并没有统一,现在仍然在使用的编码方案有几种,下面简单叙述一下两者之间的关系和之间的兼容性问题。2. 3. 1 GB2312字符集汉字显示的国内标准之一是GB2312,这个标准在1980年开始实施,由国家标准总局制定,通行于中国大陆。GB2312标准一共收录了6763个汉字,这其中包含一级汉字3755个,二级汉字3008个。该标准并不仅仅收录了中文一项内容,在此基础上,也收录了拉丁字母、希腊字母和日本平假名片假名、俄语字母等682个字符。GB2312基本满足了现代计算机处理需要,覆盖了中国大陆99.75%的使用频率字符。但是对于人名和地名,古汉语当中的字符来说,这个标准仍然缺少一些罕见字和繁体字由于该标准提出较早,几乎所有的中国大陆和部分中文国家的操作系统和软件都支持这个标准,目前国内电子邮件交换主要仍然是这个标准。但是GB2312缺点也很明显,因为标准制定比较早,因此一些比较生僻的汉字并没有被加入进去,所以可能导致部分汉字不显示的问题。在此基础上,一些兼容的后续标准也在此之后陆续发布。2. 3. 2 GBK字符集GBK是编码全称是汉字内吗扩展规范。在1995年由中华人民共和国全国信技术标准化技术委员会制定。作为GB2312后续标准之一,GBK编码相对于旧版本有更多的汉字支持。GBK标准向下和GB2312标准编码兼容,向上更支持国际ISO10646.1标准,目前国内使用也比较多。电子邮件传输过程中,使用GBK编码也比较常见。GB18030标准是GBK标准的后续升级版本,用于取代GBK编码。该编码除了保留全部GBK编码汉字之外,在第二字节把能使用扩展再度进行扩展,增加了大约100个汉字的空间。GB18030保留了全部GBK编码汉字,作为其子集。因此这两种编码可以视为互相兼容的。对于普通汉字而言,GBK字符集内部的汉字数量已经足够使用了。目前电子邮件发送过程当中使用的编码主要均为GBK和GB2312,本次编译工程也是在主要以支持这,两字符集的环境下进行的。2. 3. 3 UNICODE编码Unicode是为了解决传统的字符编码方案的局限而产生的,例如ISO 8859-1所定义的字符虽然在不同的国家中广泛地使用,可是在不同国家间却经常出现不兼容的情况。很多传统的编码方式都有一个共同的问题,即容许电脑处理双语环境(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境(指可同时处理多种语言混合的情况)。UNICODE虽然解决了上述的问题,国际兼容性更强,但是因为这种编码方式和上述两种编码方式并不兼容,互相在对方的显示模式下都会变成乱码,因此UNICODE在国内使用并不多见,只在部分需要国际兼容性的时候才会使用。但为了显示这些内容,本次邮件接收系统仍然设计了两种模式之间的转换,使用系统提供的API函数转换,使之能正常显示。3. 系统流程和规划3. 1 主程序总体设计本系统主程序执行按照如下图所示流程进行。图3.1 主程序执行流程图3. 2 POP3执行流程POP3协议定义了一系列操作来使得服务器端和邮件客户端可以相互连接。在逻辑上,这些命令需要按照一定的流程进行执行。按照这些流程,POP3邮件收取过程将在认证状态事务状态更新状态三个状态之间变动8。通常情况下,命令执行的顺序如下:图3.2POP3协议下邮件接收流程图当主程序当中完成POP3服务器域名解析之后,在邮件服务器和POP3邮件客户端建立连接即可进行邮件收取工作。通过一系列命令,我们可以完成全部收取邮件的任务。按照如上图所示流程我们可以完成邮件的收取工作。由于POP3协议可以使用telnet命令直接连接到服务器端,所以手工方式也可以很简单的登录邮件服务器,按照如上图所示流程,使用telnet命令登录到开发软件环境邮箱,可以清楚的查看到服务器返回给客户端的响应内容:图3.3 telnet连接到邮箱服务器邮件收取的大体流程是一致的,但是一些不同的软件可能有不同的处理方式,比如Foxmail和Outlook删除邮件的方式就有区别,对于Foxmail,接收每一封邮件之后都会标记一次删除,然后退出之后删除所有邮件,对于Outlook则是只有当收取完所有邮件的时候才会全部标记删除。一些可能的错误也会出现,比如一共有15封邮件,当邮件收取到第10封邮件时软件崩溃,当再次重连的时候,仍然只能从第一封邮件开始收取。因为POP3协议的简单实现方式,很多功能都需要客户端和服务器配合多次执行简单功能才能实现,这也是POP3协议本身的局限性之一9。3. 3 BASE64解码流程BASE64只是一种编码方式,邮件当中并不是全部都是用BASE64进行编码的,所以解码并不能全文进行BASE64解码,否则会出现不可预料的问题。如何找到编码部分并进行解码,是本次设计的一部分。邮件详情未加工信息如下:图3.4 邮件RETR信息3. 3. 1 主题与发件人解码邮件主题一般都使用了BASE64编码技术。一些邮件发送端可能只在邮件当中有非英文字符的时候才会使用BASE64编码。因此识别邮件标题是否经过编码就是解码与否的关键问题。在这里,邮件使用了RFC 2045标准(Multipurpose Internet Mail Extensions)。当邮件当中使用了BASE64编码的时候,主题会显示为这样的格式:=?gb2312?B?xxxxxxx?=,当程序发现主题是使用=?开始,以?=结束,则判断该代码使用了base64编码技术。排除开始和结尾两个部分之后可以发现,编码中,gb2312是文本经过BASE64解码之后需要显示时使用的中文字符编码标准。?B?之后的内容则是中文字符编码的BASE64编码内容,程序应该按照BASE64解码规则解码这些内容。解码之后,使用何种方式显示中文字符,则涉及到了中文字符编码标准的内容。此内容在3.3当中进行了详细的叙述。邮件发件人一般包含两个部分。发件人地址和发件人名称。其中发件人地址符合标注邮箱地址,其中只包含英文字符,数字和等基础ASCII标点符号。因此这一部分没有使用BASE64编码。这一部分通常使用尖括号来表示。例如,并一般在邮件发件人姓名的后面。邮件发件人一般在发件人地址之前。当使用中文姓名的时候,邮件发件人将使用非ASCII编码,这是就将需要BASE64编码。它的解码规则和邮件主题基本相同,都是使用=?作为开头,使用?=作为结尾。中间内容包含了解码之后的中文编码方式和BASE64编码后的内容。因此提取过程可以和邮件主题使用同一个子程序。这二者的解码流程如下:图3.5 邮件主题发件人解码流程3. 3. 2 邮件正文解码邮件正文在中文环境下一般都是用中文进行编写的,因此基本不可能直接发送,而必须要使用BASE64编码,编码方式和上文所述的邮件发件人和邮件主题有所区别,因为邮件发件人姓名和主题一般不会非常长,所以可以使用在单一一行进行编码就足以满足标准。但是邮件正文长度远远比邮件主题要长,因此编码方式也完全不同。BASE64编码之后的内容保存在邮件最后的位置,中文字符编码方式使用charset:”gb2312”字段表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论