电子邮件系统的设计与开发

上传人:jin****ng 文档编号:176683193 上传时间:2022-12-23 格式:DOCX 页数:26 大小:218.26KB
收藏 版权申诉 举报 下载
电子邮件系统的设计与开发_第1页
第1页 / 共26页
电子邮件系统的设计与开发_第2页
第2页 / 共26页
电子邮件系统的设计与开发_第3页
第3页 / 共26页
资源描述:

《电子邮件系统的设计与开发》由会员分享,可在线阅读,更多相关《电子邮件系统的设计与开发(26页珍藏版)》请在装配图网上搜索。

1、毕业论文题目:电子邮件系统的设计与开发院部信息学院专业班级运算机科学与技术04级7班届次2008届学生姓名李康男学号2004160839指导教师姜红花二OO八年六月中英文摘要第一章 电子邮件的进展背景和意义电子邮件翻译自英文的Email ,它表示通过电子通讯系统进行信件的书写、发送和接收。 30多年前,人们发明了电子邮件这种便利的信息传递方式,这是人类通信历史上的一次革命。 电子邮件的兴起是在20世纪80年代,70年代的沉静要紧是因为当时使用Arpanet网络的人太 少,网络的速度也仅为目前56Kbps标准速度的二十分之一。受网络速度的限制,那时的用户 只能发送些简单的信息,全然无法象现在如此

2、发送大量照片;到80年代中期,个人电脑兴起, 电子邮件开始在电脑迷以及大学生中广泛传播开来;到90年代中期,随着运算机技术的进展, 显现了功能强大的In terne t。在In terne t众多的服务功能中,电子邮件E-mai l确实是其强大 功能中的一个。自此,电子邮件被广为使用。今天使用的最多的通讯系统是互联网,同时电子邮件也是互联网上最受欢迎的功能之 一。通过电子邮件系统,您能够用专门低廉的价格,以专门快速的方式,与世界上任何一个 角落的网络用户联络系,这些电子邮件能够是文字、图象、声音等各种方式。同时,您能够 得到大量免费的新闻、专题邮件,并实现轻松的信息搜索。这是任何传统的方式也无

3、法相比 的。正是由于电子邮件的使用简易、投递迅速、收费低廉,易于储存、全球畅通无阻,使得 电子邮件被广泛地应用,它使人们的交流方式得到了极大的改变。随着网络越来越普及,现在差不多是人人一个电子邮箱甚至有多个电子邮箱。在Internet上使用最多的服务当属电子邮件服务了。可见,电子邮件与人们的工作、学习和生 活息息相关,它差不多深深的融入到每个人的生活中,生活在那个网络时代的人是不可能没 有电子邮箱的。电子邮箱差不多由往常科技工作者用于科技信息交流转变到现在大多数人用 来进行日常生活工作学习的交流工具。同时,电子邮箱的功能也发生了翻天覆地的变化。由 原先只能收发文本到现在的收发多媒体文件。简化邮

4、件的编码,减少编码造成的数据冗余。 这些都得宜于与电子邮箱有关的网络协议的进展和有关硬件的改进。现在我们每天都适应于通过E-mai l进行交流,各大网站也几乎都推出了自己的基于WEB 的免费邮件系统。电子邮件已无可争议的地成为互联网上最受用户欢迎的服务。邮件的安全 也逐步受到人们的重视。至今已显现了各种安全保证措施来加强E-mail的安全性。随着电子 邮件服务的完善和安全性的不断提高。电子邮件毫无疑问将在人类的通信史上占有一席之 地。如同其他的网络服务,电子邮件系统也有其使用的传输协议,包括SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)、P0P(Pos

5、t Office Protocol,邮局协议)和IMAP (InternetMessage Access Protocal)消息访问协议)等,这些协议应用于电子邮件的发 送和接收。一些邮件处理软件如Out Look Express和FoxMail等确实是按照SMTP和POP3协议 结合Windows Socke ts套接字进行设计来收发邮件的。第二章 电子邮件收发原理及相关技术本章简单介绍了 SMTP协议,P0P3协议的工作原理。只有较深入的把握了这两个协议的要 紧内容,才能明白得基于SMTP,P0P3的邮件收发系统是如何样工作。2.1 SMTP协议简介2.1.1 SMTP协议原始命令码和工作

6、原理SMTP(Simple Mail Tra nsfer Protoco I)即简单邮件传输协议,它是一组用于由源地址到 目的地址传送邮件的规则,或者说是由它来操纵信件传输的一种中转方式oSMTP协议属于 TCP/IP协议族,它关心每台运算机在发送或中转信件时找到下一个目的地。通过SMTP协议 所指定的服务器,我们就能够把Email寄到收信人的服务器上了,整个过程只要几分钟。 SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转电子邮件。(1)SMTP协议的通信模型第一针对用户发出的邮件要求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路, 那个地点的接收SMTP是相关于

7、发送SMTP而言的,实际上它既能够是最终的接收者也能够是中 间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。图2-1 SMTP协议通信模型示意图(2)SMTP协议的命令和应答从前面的通讯模型能够看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP 的SMTP命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,发遴MTP发送MAIL FROM: 命令指令邮件发送者,若接收SMTP现在能够接收邮件则作出0K的应答,然后发送SMTP连续发 出RCPT命令以确认邮件是否收到,假如接收到就作出0K的应答,否则就发出拒绝接收应答, 但这并

8、可不能对整个邮件操作造成阻碍。双方如此反复多次,直至邮件处理完毕。SMTP协议 共包含10个SMTP命令,列表如下:表2-1SMTP命令命令说明HELLO VdomainVCRLF 识别发送方到接收SMTP的一个HELL0命令MAIL FROM:Vreverse-pathVCRLF Vreverse-path 为发送者地址。此命令告诉接 收方一个新邮件发送的开始并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传 输处理最终完成将邮件数据传送到一个或多个邮箱中。RCPT TO:Vforward-pathVCRLF 标识各个邮件接收者的地址DATA VCRLF接收SMTP将把其后的行为看作邮件

9、数据去处理,以VCRLF. VCRLF标识 数据的结尾。REST VCRLF退出/复位当前的邮件传输NOOP VCRLF要求接收SMTP仅做OK应答。(用于测试)QUIT VCRLF要求接收SMTP返回一个OK应答并关闭传输。VRFYVstring VCRLF 验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命 令。EXPNVstring VCRLF 验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。HELP VCRLF查询服务器支持什么命令VRFY VCRLF用于验证给定的用户邮箱是否存在,以及接收关于该用户的详细信息。EXPN VCRLF用于扩充邮件列表。注:VCRLF为回车、换

10、行,ASCII码分别为13、10 (十进制)。MAIL FROM命令中指定的地址是称作envelope from地址,不需要和发送者自己的地 址是一致的RCPT TO与之等同,指明的接收者地址称为envelope to地址,而与实际的 to:行是什么无关。邮件被分为信封部分,信头部分和信体部分envelope from, envelope to与message from:, message to:完全不相干。evnelope是由服务器主机间SMTP后台 提供的,而message from/to是由用户提供的。有无冒号也是区别。SMTP协议的每一个命令都会返回一个应答码,应答码的每一个数字差不多

11、上有特定含义 的,如第一位数字为2时表示命令成功;为5表失败;3表没有完成。一些较复杂的邮件程序 利用该特点,第一检查应答码的首数字,并依照其值来决定下一步的动作。下面将SMTP的应 答码列表如下:表2-2 应答码说明501 参数格式错误502 命令不可实现503 错误的命令序列504 命令参数不可实现211 系统状态或系统关心响应214 关心信息220 Vdomain 服务就绪221 Vdomain 服务关闭421 Vdomain 服务未就绪,关闭传输信道250 要求的邮件操作完成251 用户非本地,将转发向V forward-pa th450 要求的邮件操作未完成,邮箱不可用(例如,邮箱忙

12、)550 要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)451 舍弃要求的操作;处理过程中出错551用户非本地,请尝试V forward-pa th452 系统储备不足,要求的操作未执行552 过量的储备分配,要求的操作未执行553 邮箱名不可用,要求的操作未执行354 开始邮件输入,以.终止554 操作失败(3) SMTP协议工作原理SMTP协议规定的命令是以明文方式进行的。SMTP工作在两种情形下:一是电子邮件从 客户机传输到服务器;二是从某一个服务器传输到另一个服务器。SMTP是个要求/响应协议, 命令和响应差不多上基于ASCII文本,并以CR和LF符终止。响应包括一个

13、表示返回状态的三 位数字代码。SMTP服务器在TCP协议25号端口监听连接要求。连接和发送过程如下:a. 建立TCP连接b. 客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令服务器端 正期望以0K作为响应,说明预备接收。c. 客户端发送RCPT命令,以标识该电子邮件的打算接收人,能够有多个RCPT行。服务 器端则表示是否情愿为收件人同意邮件。d. 协商终止,发送邮件,用命令DATA发送。e. 以.表示终止输入内容一起发送出去。f. 终止此次发送,用QUIT命令退出。2.1.2 SMTP协议的会话流程在进行程序设计之前有必要弄清SMTP协议的会话流程,事实上前面介绍的内容

14、差不多能 够大致勾勒出用SMTP发送邮件的框架了,关于一次一般的邮件发送,其过程大致为:先建立 TCP连接,随后客户端发出HELL 0命令以标识发件人自己的身份,并连续由客户端发送MAIL 命令,如服务器应答为0K,可连续发送RCPT命令来标识电子邮件的收件人,在那个地点能 够有多个RCPT行,而服务器端则表示是否情愿为收件人同意该邮件。在双方协商终止后,用 命令DATA将邮件发送出去,其中对表示终止的也一并发送出去。随后终止本次发送过程, 以QUIT命令退出。下面通过一个实例,从langruisohu发送邮件到renpingsina 来更详细直观地描述此会话流程: (S;SENDER R:R

15、ECIEV0R)s: 建立连接R:220 sina Simple Mail Transfer Service ReadyS:HELLO sohu/客户端发出HELLO命令以标识发件人自己的身份R:250 sinaS:MAIL FR0M:Vlangruisohu /客户端发 送MAIL 命令R:250 OK/250要求的邮件操作完成S:RCPT TO:Vrenpingsina/发送RCPT命令来标识电子邮件的收件人,在那个地点能够有多个RCPT行250 OKR/250服务器端则表示是否情愿为收件人同意该邮件DATA/命令DATA将邮件发送出去354 St art mail inpu t;end

16、wi th VCRLF.VCRLFBlah blah blah.等等.250 OKQUIT221 sina Service closing transmission channel2.2 POP3 协议2.2.1 POP3协议用于电邮接收的工作模式和原理POP的全称是Post Office Protocol,即邮局协议,用于电子邮件的接收,它使用TCP 的110端口。现在常用的是第三版,因此简称为POP3。POP3仍采纳Client/Server工作模式, Client被称为客户端,Server是服务器端。应用层协议建立在网络层协议之上,相应的软 件会调用应用层的相应协议。如当打开Foxmai

17、l那个邮件软件收取邮件时,Foxmail那个软件 就会调用TCP/IP参考模型中的应用层协议-POP协议。POP那个应用层的协议会指挥TCP协议, 利用IP协议将一封大邮件拆分成若干个数据包在Int erne t上传送。(1)POP3标准命令那个协议只包含12个命令(其中有3个完全能够忽略它们的存在)。这些命令被客户端运 算机用来发送给远程服务器。反过来,服务器返回给客户端运算机两个回应代码。POP3命令由一个命令和一些参数组成。所有命令以一个CRLF对终止。命令和参数由可打 印的ASCII字符组成,它们之间由空格间隔。命令一样是三到四个字母,每个参数却可达40 个字符长。POP3服务器响应由

18、一个状态码和一个可能跟有附加信息的命令组成。不同服务器的回应 会有所不同,但开头部分差不多上一样的所有响应也是由CRLF对终止。现在有两种状态, 确定(+OK)和失败(-ERR)。表2-3 POP3标准命令USER nserRame认可此命令与下面的p吐三命令若应功将导做状态转换PASS password 认可APOP Digest 认可 Diges-tMB5消息捕要STAT ffone处理洁求服务器发回关于邮箱的编计资料i如師件总数和总字节数UIDL 血誹处理返回邮件的唯一标泯符.HJFd会话的毎个标识苻都将是唯一的 LIST 矗醉处理返回邮件数量和毎平邮件的大小RETR 壯誹处理返回由参數

19、标识的由U件的全部文本DELE 呢誹处理服雾器将由参数标识的由E件标记为删除,由呼讥命零执行RS町Hone处理服务器将重置所有标记为删除的邮件,用于撤消DEI4-TOF 血gn杓处理服务器将返回由卷数标识的挪件前n行內客型须是正整数 NOOF ffone处理服务器返回一亍肯定的响应(2) POP工作原理简介下面简单介绍一下电子邮件软件收取电子邮件的过程,一样我们在电子邮件软件的账号 属性上设置一个POP服务器的URL(Uniform Resource Loca tor)(比如pop.163),以及邮箱的账号和密码。当我们按下电子邮件软件中的收取键后,电子邮件软件第一会调用 DNS(Domain

20、 Name Server)协议对POP服务器进行解析IP地址,当IP地址被解析出来后,邮件 程序便开始使用TCP协议连接邮件服务器的110端口,因为POP服务器是比较忙的,因此在那 个过程中我们相对要等比较长的时刻。当邮件程序成功地连上POP服务器后,其先会使用USER 命令将邮箱的账号传给POP服务器,然后再使用PASS命令将邮箱的账号传给服务器,当完成 这一认证过程后,邮件程序使用STAT命令要求服务器返回邮箱的统计资料,比如邮件总数和 邮件大小等,然后LIST便会列出服务器里邮件数量。然后邮件程序就会使用RETR命令接收邮 件,接收一封后便使用DELE命令将邮件服务器中的邮件置为删除状态

21、。当使用QUIT时,邮件 服务器便会将置为删除标志的邮件给删了。通俗地讲,邮件程序从服务器接收邮件,事实上 确实是一个对话过程,POP协议确实是用于电子邮件的一门语言。(3) POP3会话的3个状态a. 确认状态第一TCP连接由POP3客户打开,POP3服务器发送一个单行的确认。那个消息能够是由 CRL F终止的任何字符。例如,它能够是:S:+OKPOP3serverready现在POP3会话就进入了确认状态。现在,客户必须向服务器证明它的身份。在此介绍 两种可能的处理机制,一种是USER和PASS命令,另一种是在后面要介绍的APOP命令用USER 和PASS命令进行确认过程,客户必须第一发送

22、USER命令,假如POP3服务器以确认状态码响 应,客户就能够发送PASS命令以完成确认,或者发送QUIT命令终止POP3会话。假如POP3服务 器返回失败状态码,客户能够再发送确认命令,或者发送QUIT命令。当客户发送了 PASS命令后,服务器依照U SER和PASS命令的附加信息决定是否承诺访问相 应的储备邮件。一旦服务器通过这些数据决定承诺客户访问储存邮件,服务器会在邮件上加 上排它锁,以防止在进入更新状态前对邮件的改变。假如成功获得了排它锁,服务器返回 一个确认状态码。会话进入操作状态,同时没有任何邮件被标记为删除。假如邮件因为 某种缘故不能打开(例如,排它锁不能获得,客户不能访问相应

23、的邮件或者邮件不能进行语 法分析),服务器将返回失败状态码。在返回失败状态码后,服务器会关闭连接。假如 服务器没有关闭连接,客户能够重新发送确认命令,重新开始,或者发送QUIT命令。在服务器打开邮件后,它为每个消息指定一个消息号,并以八进制表示每个消息的长 度。第一个消息被指定为1,第二个消息被指定为2,以此类推,第N个消息被指定为N。在POP3 命令和响应中,因此的消息号和长度以十进制表示。下面是在确认状态中可用的命令:USER username;PASS password; QUITb. 操作状态一旦客户向服务器成功地确认了自己的身份,服务器将锁住并打开相应的邮件,这时POP3会话进入操作

24、状态。现在客户能够重复下面的POP3命令,关于每个命令服务器都会返 回应答。最后,客户发送QUIT命令,会话进入更新状态。下面是在操作状态中可用的命 令:STAT;LISTmsg;RETRmsg;DELEmsg;NOOP;RSET; TOPmsgn;UIDLmsgc. 更新状态当客户在操作状态下发送QUIT命令后,会话进入更新状态。(注意:假如客户在 确认状态下发送QUIT后,会话并不进入更新状态。)假如会话因为QUIT命令以外的缘故 中断,会话并不进入更新状态,也不从服务器中删除任何信件oQUIT在更新状态有效。; 可选的POP3命令:APOPnamediges t在确认状态有效TOPmsg

25、n; UIDLmsg在操作状态有效注:除了STAT,LIST和UIDL的响应外,其它命令的响应均为+OK和-ERR。响应 后的所有文本将被客户略去。2.2.2 POP3会话流程S:等待连接到TCP端口 110C:打开连接S:+OKPOP3serverreadyC:USER usernameS:+OKC:PASS passwordS:+OKC:STAT/要求服务器发回关于邮箱的统计资料,如邮件总数和总字节数S:+OK2320C:LIST/返回邮件数量和每个邮件的大小S:+OK2messages(320octets)S:1120S:2200S:-.C:RETR1 /回由参数标识的邮件的全部文本S:

26、+OK.s:服务器发送信件1S:C:DELE1S:+OKmessage1deletedC:QUITS:+OKdeweyPOP3serversigningoff(maildropempty)C:关闭连接s:等待下一次连接2.3 RFC822简介电子邮件是全世界通用的。你能够给任何一个人发送电子邮件而不用考虑他所处的地理 位置在哪或他使用的是什么软件作为邮件同意客户端。和其他与Int erne t相关的事物一样 (或者能够说,与运算机技术相关的事物),电子邮件也是基于一种标准的,而人们把那个 专门的标准称作RFC 822。那个标准早在二十多年前(准确的日期是一九八二年八月十三日) 就公布于世,在这

27、期间它差不多没有改变。在2001年公布的RFC 2822标准取代了RFC 822, 然而它的差不多内容和RFC 822是完全一致的,只是做了一些专门小的更新和改动。而其他 的一些邮件标准,比如RFC 850 (在USENET上使用),同样也基于RFC 822标准。(RFC,Request For Comments)2.4 Winsock 简介许多网络程序差不多上采纳Socke t套接字实现的,关于一些标准的网络协议如 、FTP 和SMTP等协议的编程也是基于套接字程序的,只是端口号不再是随意设定而要由协议来指 定,比如 端口在80、FTP是21,而SMTP则是25。Socket只是提供在指定的

28、端口上同指定 的服务器从事网络上的通讯能力,至于客户和服务器之间是如何通讯的则由网络协议来规 定,这关于套接字是完全透亮的。因此能够由Socket套接字为SMTP提供网络通讯基础,而关 于网络通讯连路建立好之后采取什么样的通讯应答则要按SMTP协议的规定去执行了。本科题 为方便起见,没有采纳编写较复杂的Windows Socke ts API进行编程,而是使用通过较好封 装的MFC的CSocket类。2.5 MFC简介MFC (Microsoft Foundation ClassLibrary)中的各种类结合起来构成了一个应用程 序框架,它的目的确实是让程序员在此基础上来建立Windows下的

29、应用程序,这是一种相对SDK来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口 的标准实现方法,程序员所要做的确实是通过预定义的接口把具体应用程序特有的东西填入 那个轮廓。Microsoft Visual C+提供了相应的工具来完成那个工作:AppWizard能够用来 生成初步的框架文件(代码和资源等);资源编辑器用于关心直观地设计用户接口; ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定 的逻辑。MFC封装了Win32 API,OLE API,ODBC API等底层函数的功能,并提供更高一层的接口, 简化了Window

30、s编程。同时,MFC支持对底层API的直截了当调用。MFC提供了一 个Windows应用程序开发模式,对程序的操纵要紧是由MFC框架完成的,而 且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其 本身处理事件,不依靠程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。MFC是C+类库,程序员确实是通过使用、继承和扩展适当的类来实现特定的目的。例如, 继承时,应用程序特定的事件由程序员的派生类来处理,不感爱好的由基类处理。实现这种 功能的基础是C+对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。第三章 电子邮件系统的设计和开发本章第一对SMT

31、P协议,POP3协议的工作流程作了详细的分析,然后按照SMTP和POP3协议 结合Windows Socke ts套接字进行设计实现代码并封装成CSMTP协议类和CPOP3协议类。最后 依照客户端的差不多需求设计成客户端邮件收发软件,并以友好的界面形式出现出来。3.1 服务器端作用简介SMTP,POP3采纳Client/Server工作模式,Client被称为客户端,一样我们日常使用 电脑差不多上作为客户端,而Server (服务器)则是网管人员进行治理的。SMTP服务器的要 紧功能确实是接收来自客户端的SMTP协议命令,然后对这些命令进行解析,依照不同的命令 进行不同的处理,处理完成之后,将

32、结果发送给客户端。图要作说明图3-1 Clien t/Server工作模式示意图0服翱方以下用简单的流程图来分别示范SMTP, POP3的服务器端与他们对应的客户端的会话:250 0K250 0KEZU ELna. com Sim卫Nai 1 Tr:iiLj;ter Service ReidyMELLO ohu. com50 sins, cornMAIL FRJM : . CELT yjurmail . : QUIT221 mina. uom Service u3.02iitgS 客户方图3-2 SMTP会话流程示意图如图示,连接和发送过程如下:a. 建立TCP连接b. 客户端发送HELO命令

33、以标识发件人自己的身份,然后客户端发送MAIL命令服务器端 正期望以OK作为响应,说明预备接收。c. 客户端发送RCPT命令,以标识该电子邮件的打算接收人,能够有多个RCPT行。服务 器端则表示是否情愿为收件人同意邮件。d. 协商终止,发送邮件,用命令DATA发送。e. 以.表示终止输入内容一起发送出去。f. 终止此次发送,用QUIT命令退出。彳诘険立连接嵋开连捺S: + OKFOF3 5 *1化 ft $ adyjC: ITSER he er nameS:+0K町S:+0K、C:SIAT 谙求服务器发回关于曲箱的统计资料,如制 S :+0E232a己违沙“一 71/遁回邮件数量和每亍邮件的大

34、小: MTR1回由卷数标识的邮件的全部文本S:+OK. .S:对应于客尸端覺出谕鲁的操作itC:QUITiS : +ijKile,rfeyFLiT3 e er ver e i gni ngo f im :i 1 drop ernp tj )c:烘闭连接 SY等待下一次连接客户方等特 ilfe&QllO图3-2 POP3会话流程示意图如图示,当邮件程序成功地连上POP服务器后,其先会使用USER命令将邮箱的账号传 给POP服务器,然后再使用PASS命令将邮箱的账号传给服务器,当完成这一认证过程后,邮 件程序使用STAT命令要求服务器返回邮箱的统计资料,比如邮件总数和邮件大小等,然后 LIST便会

35、列出服务器里邮件数量。然后邮件程序就会使用RETR命令接收邮件,也可在接收一 封后便使用DELE命令将邮件服务器中的邮件置为删除状态。当使用QUIT时,邮件服务器便会 将置为删除标志的邮件给删了。3.2 客户端程序设计本节要紧介绍客户端的实现。本人选择使用VC+6.0来实现本系统的客户端,VC+6.0 是使用面向对象语言C+的开发环境,更有利于集中精力于要紧功能的实现。由图3-2,图3-3 能够明显看出客户端需完成的任务:1. 发送SMTP命令,处理相应服务器的响应,将邮件按RFC822格式编码并发送。2. 发送POP3命令,处理相应服务器的响应,将邮件按RFC822格式解码并发送。本系统的现

36、实要紧使用了CSMTP,CPOP3,CmailMessage封装类。CSMTP类中的成员函数要 紧实现发送SMTP命令并处理SMTP服务器响应,CP0P3的成员函数要紧实现发送POP3命令并 处理POP3服务器响应,CMailMessage实现邮件的编码解码功能。3.2.1邮件的格式化由于电子邮件结构上的专门性,在传输时是不能当作简单的文本来直截了当处理的,而 必须按照一定的格式对邮件头和邮件体进行格式化处理之后才能够被发送。需要进行格式化 的部分要紧有:发件人地址、收件人地址、主题和发送日期等。在RFC (Request For Commen ts) 文档的RFC 822里对邮件的格式化有详

37、尽的说明.在本论文中由CMailMessage类中的成员函 数实现邮件的编码解码功能。BOOL EncodeHeader();BOOL DecodeHeader();void EncodeBody();void DecodeBody();下面通过VC+6.0按照RFC 822文档规定将格式化邮件的部分编写如下(部分代码): BOOL CMailMessage:EncodeHeader()/此函数为邮件头部编码(此处仅列出了关键部分) CString sTo;CString sDate;CString sEmail = ;CString sFriendly = ;m_tDateTime = m_

38、tDateTime.GetCurrentTime();/ Format: Mon, 01 Jun 98 01:10:30 GMTm_sHeader.Format( From: %srnTo: %srnDate: %srnSubject: %srn,/ Include other extension lines ifdesired(LPCTSTR)m_sFrom,/sender(LPCTSTR)sTo,/recipients(LPCTSTR)sDate,/日期(LPCTSTR)m_sSubject);/主题void CMailMessage:EncodeBody()/此函数为邮件体编码(此处仅列

39、出了关键部分)CString sCooked = ;LPTSTR szBad = rn.rn;LPTSTR szGood = rn.rn;int nPos;int nBadLength = strlen( szBad );if( m_sBody.Left( 3 ) = .rn )m_sBody = . + m_sBody;while( (nPos = m_sBody.Find( szBad ) -1 )/npos中是终止符所在的位子,即共有多少有意义的字符sCooked = m_sBody.Mid( 0, nPos );sCooked += szGood;m_sBody = sCooked +

40、 m_sBody.Right( m_sBody.GetLength() - (nPos + nBadLength) );/最后以rn.rn 结尾3.2.2 SMTP&P0P3协议封装类专门多EMAIL系统差不多上使用SMTP协议来作为发送协议,而POP3协议来作为同意协议。 本节编写了有关于SMTP,POP3协议的C+类,如此的话呢,我们能够在连接的时候使用它。同 时,类中实现的一些功能类似于SMTP,POP3协议中的一些命令。以下程序是通过使用MFC中 CSocke t类中成员函数的使用实现的,它包含在afxsock.h中。CSMTP class中的关键函数如下:BOOL Connec t(

41、);/格式化并发送HELLO命令,连接SMTP服务器BOOL Disconnec t();/断开连接 SMTP 服务器virtual BOOL FormatMailMessage( CMailMessage* msg );/ 调用CMailMessage类EncodeHeader()EncodeBody()对邮件格式化BOOL SendMessage( CMailMessage* msg );/ 调用CSMTP类 FormatMailMessage( ) transmit_message()BOOL get_response( UINT response_expected ); /判定应答码是

42、否为期望值BOOL transmit_message( CMailMessage* msg );/发送SMTP命令调用get .response ()处理服务器应答码并发送邮件头和邮件体SMTP协议类中部分成员函数的实现如下(此处仅列出了关键部分):CSMTP:CSMTP( LPCTSTR szSMTPServerName, UINT nPort )AfxSocketlnit();/用AfxSocketlnit()函数对套接字进行初始化 BOOL CSMTP:Connect()f( !m_wsSMTPServer.Crea te() )/用Crea te()创建套接字对象m_sError =

43、_T( Unable to create the socket. ); return FALSE;if( !m_wsSMTPServer.Connect( GetServerHostName(), GetPort() ) )/由该套接字通过Connect ()建立同邮件服务器的连接。m_sError = _T( Unable to connect to server ); m_wsSMTPServer.Close();if( !get_response( CONNECT_SUCCESS ) )m_sError = _T( Server didnt respond. ); m_wsSMTPSer

44、ver.Close();return FALSE;sHello.Format( HELO %srn, local_host ); m_wsSMTPServer.Send( (LPCTSTR)sHello, sHello.GetLength() ); if( !get_response( GENERIC_SUCCESS ) )m_wsSMTPServer.Close();return FALSE;m_bConnected = TRUE;return TRUE;BOOL CSMTP:SendMessage(CMailMessage * msg)if( FormatMailMessage( msg

45、) = FALSE )return FALSE;if( transmit_message( msg ) = FALSE )return FALSE;return TRUE;BOOL CSMTP:FormatMailMessage( CMailMessage* msg )if( msg-EncodeHeader() = FALSE )return FALSE;msg-EncodeBody();if( msg-m_sBody.Right( 2 ) != rn )msg-m_sBody += rn;/确认最后以rn.rn终止return TRUE;BOOL CSMTP:transmit_messag

46、e(CMailMessage * msg) / Send the MAIL commandsFrom.Format( MAIL From: %srn, (LPCTSTR)msg-m_sFrom ); m_wsSMTPServer.Send( (LPCTSTR)sFrom, sFrom.GetLength() );if( !get_response( GENERIC_SUCCESS ) )return FALSE;/ Send RCPT commands (one for each recipient)for( int i = 0; i msg-GetNumRecipients(); i+ )m

47、sg-GetRecipient( sEmail, sTemp, i );sTo.Format( RCPT TO: . VCRLFsTemp = rn.rn;m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() ); return TRUE;到此为止,已差不多在程序中表达出了SMTP协议类的功能,能在Socket套接字所提供的 网络通讯能力基础之上实现以SMTP命令和SMTP应答码为差不多会话内容的通讯交互过程,从 而最终实现SMTP协议对电子邮件的发送。CPOP3 class中的关键函数如下:BOOL Disconnect();/发送QU

48、IT 命令BOOL Connect();/创建并初始化套节字,发送USER,PASS命令BOOL Get Message( UINT nMsg, CMailMessage* msg); /发送 RETR 命令,获得邮件 int CPOP3:Ge tN umMessages()/发送STAT获得邮件总数及字节数BOOL Dele teMessage( UINT nMsg );/发送DELETE 命令BOOL get_response( UINT executed_action );CPOP3协议类中部分成员函数的实现如下(此处仅列出了关键部分):CPOP3:CPOP3( LPCTSTR szPO

49、P3ServerName, UINT nPort, LPCTSTR sUsername, LPCTSTR sPassword)AfxSocke tlni t();/在正式使用套接字之前,先用AfxSocke tlni t()函数对套接字进行 初始化 BOOL CPOP3:Connect() if( !m_wsP0P3Server.Crea te() ) /用Crea te()创建套接字对象 m_sError = _T( Unable to create the socket. ); return FALSE;/由该套接字通过Connect ()建立同邮件服务器的连接if( !m_wsPOP3S

50、erver.Connect( GetServerHostName(), GetPort() ) ) m_sError = _T( Unable to connect to server ); m_wsPOP3Server.Close();return FALSE;/命令USER & PASS对在网络上发送明文用户名和口令给服务器 sUser.Format( USER %srn, GetUsername();m_wsPOP3Server.Send( (LPCTSTR)sUser, sUser.GetLength() ); if( !get_response( IDENTIFICATION ) )

51、m_wsPOP3Server.Close();return FALSE; sPass.Format( PASS %srn, GetPassword(); m_wsPOP3Server.Send( (LPCTSTR)sPass, sPass.GetLength() ); if( !get_response( AUTHENTIFICATION ) )m_wsPOP3Server.Close();return FALSE; m_bConnected = TRUE; return TRUE;BOOL CPOP3:GetMessage( UINT nMsg, CMailMessage* msg)CStr

52、ing sMsg;CString sRetr; sRetr.Format(RETR %drn,nMsg);m_wsPOP3Server.Send( (LPCTSTR)sRetr, sRetr.GetLength() ); while ( sMsg.Find(rn.rn)m_sHeader=sMsg.Left(br);msg-m_sBody=sMsg.Mid(br+4); msg-DecodeHeader();msg-DecodeBody();return TRUE;3.2.3 客户端邮件收发系统介绍(1)客户端邮件收发系统应用界面图注(2)此系统的使用方法:发送邮件时,先输入SMTP邮件服务器

53、(如),发信人邮箱,收信人邮箱,SMTP服务器用户名和密码,然后写好信的标题和内容,最后单击发送按钮即可。收信时,先输入POP3邮件服务器(如),POP3服务器用户名和密码,然后单击接收按钮,第一封信件就会显示出来。在Messag文本框中输入要阅读的邮件的索引号。然后点击Receive按钮。在Messag文本框中输入要删除的邮件的索引号。然后点击Dele te按钮。点击Stat us,将会弹出错误信息对话框。3.2.4 各功能模块实现方法及流程依照本人对邮件收发系统的使用需求的明白得,将此系统分为接收,发送,编辑,删 除四个模块。以下是对他们的实现方法的具体介绍。以下程序是通过使用MFC中CS

54、ocke t类, 自定义的CSMTP类,CP0P3类中成员函数的使用实现的。a. 发送在正式使用套接字之前,也要先用AfxSocke tlnit()函数对套接字进行初始化,然后用 Crea te()创建套接字对,这是在CSMTP创建对象时由构造函数自动执行的。并由该套接字通 过Connect ()建立同邮件服务器的连接。图3-1 邮件发送模块程序设计流程图实现此模块所调用的CSMTP中关键函数:BOOL Connec t();/格式化并发送HELLO命令,连接SMTP服务器BOOL Disconnec t();/断开连接 SMTP 服务器virtual BOOL FormatMailMessa

55、ge( CMailMessage* msg );/ 调用CMailMessage类EncodeHeader()EncodeBody()对邮件格式化BOOL SendMessage( CMailMessage* msg );/ 调用CSMTP类 FormatMailMessage( ) transmit_message()BOOL transmit_message( CMailMessage* msg );/发送SMTP命令调用get .response ()处理服务器应答码并发送邮件头和邮件体图3-1中的smtp是CSMTP类创建的对象,以下为发送功能的实现代码: void CMailDlg:

56、OnSend()UpdateData( TRUE );CSMTP smtp( m_SMTP ); /加载winsock dll版本并为SMTP的对象smtp中成员变量赋值 CMailMessage msg;msg.m_sFrom = m_From; msg.AddMultipleRecipients( m_To ); msg.m_sSubject = m_Subject;msg.m_sBody = m_Body;if( !smtp.Connect() )AfxMessageBox( smtp.GetLastError() ); return;if( !smtp.SendMessage( &ms

57、g ) )AfxMessageBox( smtp.GetLastError() ); return;if( !smtp.Disconnect() )AfxMessageBox( smtp.GetLastError() ); return;AfxMessageBox( _T( Message Sent Successfully) );b. 接收实现此模块,也要先用AfxSocke tlni t()函数对套接字进行初始化,然后用Crea te()创 建套接字对,这是在CSMTP创建对象时由构造函数自动执行的。并由该套接字通过Connec t ()建立同邮件服务器的连接。图3-2 邮件接收模块程序设

58、计流程图实现此模块所调用的POP3中关键函数:BOOL Disconnect();/发送QUIT 命令BOOL Connect();/创建并初始化套节字,发送USER,PASS命令BOOL Get Message( UINT nMsg, CMailMessage* msg); /发送 RETR 命令,获得邮件 int CPOP3:Ge tN umMessages()/发送STAT获得邮件总数及字节数BOOL Dele teMessage( UINT nMsg );/发送DELETE 命令上图中的pop3是CPOP3类创建的对象,以下为发送功能的实现代码:void CMailDlg:OnRetr()UpdateData( TRUE );CPOP3 pop3( m_POP3 );pop3.SetUserProperties(m_User,m_Password);if (!pop3.Connect()AfxMessageBox( pop3.GetLastError() ); return;CMailMessage msg;if (

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!