基于pop3的邮件收发系统的设计与实现.doc
《基于pop3的邮件收发系统的设计与实现.doc》由会员分享,可在线阅读,更多相关《基于pop3的邮件收发系统的设计与实现.doc(72页珍藏版)》请在咨信网上搜索。
陕西理工学院毕业设计 题 目 基于POP3的邮件收发系统的设计与实现 学生姓名 学号 所在学院 物理与电信工程学院 专业班级 电子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 protocol Chen (Grade12,Class01,Major electronics and information engineering School of Physics and Telecommunication Engineering, Shaanxi University of Technology, Hanzhong 723000,Shaanxi) Tutor: Abstract: 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. 引言 1 1. 1 背景 1 1. 2 研究目的 1 1. 3 开发环境及语言 1 1. 3. 1 开发环境 1 1. 3. 2 开发语言 2 1. 4 WinSock2简介 3 2. POP3协议与传输标准 5 2. 1 POP3状态简述 5 2. 1. 1 认证(Authorization)状态 5 2. 1. 2 事务(Transaction)状态 6 2. 1. 3 更新(Updata)状态 7 2. 2 Base64标准 8 2. 2. 1 BASE64编码 8 2. 2. 2 BASE64解码 9 2. 3 中文字符编码标准 9 2. 3. 1 GB2312字符集 9 2. 3. 2 GBK字符集 9 2. 3. 3 UNICODE编码 9 3. 系统流程和规划 10 3. 1 主程序总体设计 10 3. 2 POP3执行流程 11 3. 3 BASE64解码流程 13 3. 3. 1 主题与发件人解码 13 3. 3. 2 邮件正文解码 14 3. 4 邮件保存流程 15 4. POP3邮箱的C++实现 17 4. 1 TCP发送接收的实现 17 4. 1. 1 发送函数的C++封装 17 4. 1. 2 接收函数的C++封装 17 4. 2 POP3协议命令的实现 18 4. 2. 1 认证状态C++实现 18 4. 2. 2 事务状态C++实现 18 4. 2. 3 更新状态C++实现 18 4. 3 Base64 的C++解码实现 19 4. 3. 1 BASE64块解码 19 4. 3. 2 BASE64文本解码 19 4. 3. 3 BASE64解码邮件主题 20 5. 软件测试 21 结束语 23 致谢 24 参考文献 25 附录A: 26 附录B: 44 ii 1. 引言 电子邮件(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带来一系列新特性和更高的效率提升。[4] Windows 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 API WinSock.dll (16位) WSOCK32.dll (32位) WinSock2 API WinSock2 服务提供商接口 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+用户登录名+\r\n。这里的\r\n是常见的转义字符,意义等同于按下回车键。例如当登录用户名是”sinper”的时候,命令就应该这么执行:”USER sinper\r\n”。 这个命令根据执行正确与否,可能得到服务器两个回复: + OK …… 用户名有效 - ERR …… 用户名无效 任何一个命令执行是否成功都能通过返回的回复得到判断。如果回复是以+ OK开头的,这样的回复就代表上一个命令成功执行了。如果回复以- ERR开头,这就代表这个命令执行失败,需要结合具体情况来判断之后的操作。 PASS命令: PASS命令只能在认证状态下使用,并且需要在这之前成功执行过USER命令。和USER命令相似,它的使用方式也是PASS+用户密码+\r\n。例如登录名是sinper的用户使用了a1b2c3密码的时候,命令应该这样执行:”PASS a1b2c3\r\n”。 这个命令根据执行正确与否,可能得到服务器两个回复: + 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 150 2 210 …… 5 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,而,因此每3个字节会被编码成4个可打印字节。这样编码之后,其长度会比原来的文本长出大约三分之一作用,但是这样的编码保证了所有字符都是可打印的。 下图十分直观地说明了base64编码规则, 源字符 M a n ASCII码值 77 97 110 Bit 码 0 1 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 1 1 0 1 1 1 0 编码后码值 19 22 5 46 Base64编码 T W F u 图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个。该标准并不仅仅收录了中文一项内容,在此基础上,也收录了拉丁字母、希腊字母和日本平假名片假名- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 pop3 邮件 收发 系统 设计 实现
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文