电子邮件系统的设计与开发.doc_第1页
电子邮件系统的设计与开发.doc_第2页
电子邮件系统的设计与开发.doc_第3页
电子邮件系统的设计与开发.doc_第4页
电子邮件系统的设计与开发.doc_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

山东农业大学毕业论文 题目: 电子邮件系统的设计与开发 院 部信息学院专业班级计算机科学与技术 04级7班届 次2008届学生姓名李康男学 号2004160839指导教师姜红花 二八年六月中英文摘要第一章 电子邮件的发展背景和意义 电子邮件翻译自英文的E-mail,它表示通过电子通讯系统进行信件的书写、发送和接收。30多年前,人们发明了电子邮件这种便捷的信息传递方式,这是人类通信历史上的一次革命。电子邮件的兴起是在20世纪80年代,70年代的沉寂主要是因为当时使用Arpanet网络的人太少,网络的速度也仅为目前56Kbps标准速度的二十分之一。受网络速度的限制,那时的用户只能发送些简单的信息,根本无法象现在这样发送大量照片;到80年代中期,个人电脑兴起,电子邮件开始在电脑迷以及大学生中广泛传播开来;到90年代中期,随着计算机技术的发展,出现了功能强大的Internet。在Internet众多的服务功能中,电子邮件E-mail就是其强大功能中的一个。自此,电子邮件被广为使用。今天使用的最多的通讯系统是互联网,同时电子邮件也是互联网上最受欢迎的功能之一。通过电子邮件系统,您可以用非常低廉的价格,以非常快速的方式,与世界上任何一个角落的网络用户联络系,这些电子邮件可以是文字、图象、声音等各种方式。同时,您可以得到大量免费的新闻、专题邮件,并实现轻松的信息搜索。这是任何传统的方式也无法相比的。正是由于电子邮件的使用简易、投递迅速、收费低廉,易于保存、全球畅通无阻,使得电子邮件被广泛地应用,它使人们的交流方式得到了极大的改变。 随着网络越来越普及,现在已经是人人一个电子邮箱甚至有多个电子邮箱。在Internet上使用最多的服务当属电子邮件服务了。可见,电子邮件与人们的工作、学习和生活息息相关,它已经深深的融入到每个人的生活中,生活在这个网络时代的人是不可能没有电子邮箱的。电子邮箱已经由以前科技工作者用于科技信息交流转变到现在大多数人用来进行日常生活工作学习的交流工具。同时,电子邮箱的功能也发生了翻天覆地的变化。由原来只能收发文本到现在的收发多媒体文件。简化邮件的编码,减少编码造成的数据冗余。这些都得宜于与电子邮箱有关的网络协议的发展和有关硬件的改进。 现在我们每天都习惯于通过E-mail进行交流,各大网站也几乎都推出了自己的基于WEB的免费邮件系统。电子邮件已无可争议的地成为互联网上最受用户欢迎的服务。邮件的安全也逐渐受到人们的重视。至今已出现了各种安全保障措施来加强E-mail的安全性。随着电子邮件服务的完善和安全性的不断提高。电子邮件毫无疑问将在人类的通信史上占有一席之地。如同其他的网络服务,电子邮件系统也有其使用的传输协议,包括SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)、POP(Post Office Protocol,邮局协议)和IMAP(Internet Message Access Protocal)消息访问协议)等,这些协议应用于电子邮件的发送和接收。一些邮件处理软件如OutLook Express和FoxMail等就是按照SMTP和POP3 协议结合Windows Sockets套接字进行设计来收发邮件的。第二章 电子邮件收发原理及相关技术 本章简单介绍了SMTP协议,POP3协议的工作原理。只有较深入的掌握了这两个协议的主要内容,才能理解基于SMTP,POP3的邮件收发系统是怎样工作。2.1 SMTP协议简介2.1.1 SMTP协议原始命令码和工作原理SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,或者说是由它来控制信件传输的一种中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,我们就可以把Email寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转电子邮件。(1)SMTP协议的通信模型 首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最终的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。 文件系统发送SMTP接受SMTPSMTP命令邮件内容文件系统用户应答图2-1 SMTP协议通信模型示意图(2)SMTP协议的命令和应答从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的SMTP命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,发送SMTP发送MAIL FROM:命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响。双方如此反复多次,直至邮件处理完毕。SMTP协议共包含10个SMTP命令,列表如下:- 表2-1 SMTP命令 命令说明-HELLO domainCRLF 识别发送方到接收SMTP的一个HELLO命令 MAIL FROM:reverse-pathCRLF reverse-path 为发送者地址。此命令告诉接收方一个新邮件发送的开始并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传 输处理最终完成将邮件数据传送到一个或多个邮箱中。 RCPT TO:forward-pathCRLF 标识各个邮件接收者的地址 DATA CRLF 接收SMTP将把其后的行为看作邮件数据去处理,以CRLF.CRLF标识数据的结尾。 REST CRLF 退出/复位当前的邮件传输 NOOP CRLF 要求接收SMTP仅做OK应答。(用于测试) QUIT CRLF 要求接收SMTP返回一个OK应答并关闭传输。 VRFY string CRLF 验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。 EXPN string CRLF 验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。 HELP CRLF 查询服务器支持什么命令 VRFY CRLF 用于验证给定的用户邮箱是否存在,以及接收关于该用户的详细信息。EXPN CRLF 用于扩充邮件列表。-注:CRLF为回车、换行,ASCII码分别为13、10(十进制)。- MAILFROM命令中指定的地址是称作envelopefrom地址,不需要和发送者自己的地址是一致的。RCPTTO与之等同,指明的接收者地址称为envelopeto地址,而与实际的to:行是什么无关。邮件被分为信封部分,信头部分和信体部分envelopefrom,envelopeto与messagefrom:,messageto:完全不相干。evnelope是由服务器主机间SMTP后台提供的,而messagefrom/to是由用户提供的。有无冒号也是区别。SMTP协议的每一个命令都会返回一个应答码,应答码的每一个数字都是有特定含义的,如第一位数字为2时表示命令成功;为5表失败;3表没有完成。一些较复杂的邮件程序利用该特点,首先检查应答码的首数字,并根据其值来决定下一步的动作。下面将SMTP的应答码列表如下:- 表2-2 应答码说明-501 参数格式错误 502 命令不可实现 503 错误的命令序列 504 命令参数不可实现 211 系统状态或系统帮助响应 214 帮助信息 220 domain服务就绪 221 domain服务关闭 421 domain服务未就绪,关闭传输信道 250 要求的邮件操作完成 251 用户非本地,将转发向forward-path 450 要求的邮件操作未完成,邮箱不可用 (例如,邮箱忙)550 要求的邮件操作未完成,邮箱不可用 (例如,邮箱未找到,或不可访问)451 放弃要求的操作;处理过程中出错 551 用户非本地,请尝试forward-path 452 系统存储不足,要求的操作未执行 552 过量的存储分配,要求的操作未执行 553 邮箱名不可用,要求的操作未执行 354 开始邮件输入,以.结束 554 操作失败 (3)SMTP协议工作原理SMTP协议规定的命令是以明文方式进行的。SMTP工作在两种情况下:一是电子邮件从客户机传输到服务器;二是从某一个服务器传输到另一个服务器。SMTP是个请求/响应协议,命令和响应都是基于ASCII文本,并以CR和LF符结束。响应包括一个表示返回状态的三位数字代码。SMTP服务器在TCP协议25号端口监听连接请求。连接和发送过程如下: a.建立TCP连接 b.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令服务器端正希望以OK作为响应,表明准备接收。 c.客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行。服务器端则表示是否愿意为收件人接受邮件。 d.协商结束,发送邮件,用命令DATA发送。 e.以.表示结束输入内容一起发送出去。 f.结束此次发送,用QUIT命令退出。2.1.2 SMTP协议的会话流程在进行程序设计之前有必要弄清SMTP协议的会话流程,其实前面介绍的内容已经可以大致勾勒出用SMTP发送邮件的框架了,对于一次普通的邮件发送,其过程大致为:先建立TCP连接,随后客户端发出HELLO命令以标识发件人自己的身份,并继续由客户端发送MAIL命令,如服务器应答为OK,可继续发送RCPT命令来标识电子邮件的收件人,在这里可以有多个RCPT行,而服务器端则表示是否愿意为收件人接受该邮件。在双方协商结束后,用命令DATA将邮件发送出去,其中对表示结束的.也一并发送出去。随后结束本次发送过程,以QUIT命令退出。下面通过一个实例,从发送邮件到来更详细直观地描述此会话流程:(S;SENDER R:RECIEVOR)s: 建立连接R:220 Simple Mail Transfer Service Ready S:HELLO /客户端发出HELLO命令以标识发件人自己的身份R:250 S:MAIL FROM: /客户端发送MAIL命令R:250 OK /250 要求的邮件操作完成S:RCPT TO: /发送RCPT命令来标识电子邮件的收件人,在这里可以有多个RCPT行R:250 OK /250 服务器端则表示是否愿意为收件人接受该邮件S:DATA /命令DATA将邮件发送出去R:354 Start mail input;end with CRLF.CRLFS: Blah blah blah.S: .等等S: .R:250 OKS:QUITR:221 Service closing transmission channel 2.2 POP3协议2.2.1 POP3协议用于电邮接收的工作模式和原理 POP的全称是 Post Office Protocol,即邮局协议,用于电子邮件的接收,它使用TCP的110端口。现在常用的是第三版 ,所以简称为 POP3。POP3仍采用Client/Server工作模式,Client被称为客户端,Server是服务器端。 应用层协议建立在网络层协议之上,相应的软件会调用应用层的相应协议。如当打开Foxmail这个邮件软件收取邮件时,Foxmail这个软件就会调用TCP/IP参考模型中的应用层协议-POP协议。POP这个应用层的协议会指挥TCP协议,利用IP协议将一封大邮件拆分成若干个数据包在Internet上传送。(1)POP3标准命令 这个协议只包含12个命令(其中有3个完全可以忽略它们的存在)。这些命令被客户端计算机用来发送给远程服务器。反过来,服务器返回给客户端计算机两个回应代码。POP3命令由一个命令和一些参数组成。所有命令以一个CRLF对结束。命令和参数由可打印的ASCII字符组成,它们之间由空格间隔。命令一般是三到四个字母,每个参数却可达40个字符长。POP3服务器响应由一个状态码和一个可能跟有附加信息的命令组成。不同服务器的回应会有所不同,但开头部分都是一样的所有响应也是由CRLF对结束。现在有两种状态,确定(+OK)和失败(-ERR)。-表2-3 POP3标准命令(2) POP工作原理简介下面简单介绍一下电子邮件软件收取电子邮件的过程,一般我们在电子邮件软件的账号属性上设置一个POP服务器的URL(Uniform Resource Locator )(比如),以及邮箱的账号和密码。当我们按下电子邮件软件中的收取键后,电子邮件软件首先会调用DNS(Domain Name Server)协议对POP服务器进行解析IP地址,当IP地址被解析出来后,邮件程序便开始使用TCP协议连接邮件服务器的110端口,因为POP服务器是比较忙的,所以在这个过程中我们相对要等比较长的时间。当邮件程序成功地连上POP服务器后,其先会使用USER命令将邮箱的账号传给POP服务器,然后再使用PASS命令将邮箱的账号传给服务器,当完成这一认证过程后,邮件程序使用STAT命令请求服务器返回邮箱的统计资料,比如邮件总数和邮件大小等,然后LIST便会列出服务器里邮件数量。然后邮件程序就会使用RETR命令接收邮件,接收一封后便使用DELE命令将邮件服务器中的邮件置为删除状态。当使用QUIT时,邮件服务器便会将置为删除标志的邮件给删了。通俗地讲,邮件程序从服务器接收邮件,其实就是一个对话过程,POP协议就是用于电子邮件的一门语言。 (3) POP3会话的3个状态 a.确认状态首先TCP连接由POP3客户打开,POP3服务器发送一个单行的确认。这个消息可以是由CRLF结束的任何字符。例如,它可以是:S:+OKPOP3serverready此时POP3会话就进入了确认状态。此时,客户必须向服务器证明它的身份。在此介绍两种可能的处理机制,一种是USER和PASS命令,另一种是在后面要介绍的APOP命令用USER和PASS命令进行确认过程,客户必须首先发送USER命令,如果POP3服务器以确认状态码响应,客户就可以发送PASS命令以完成确认,或者发送QUIT命令终止POP3会话。如果POP3服务器返回失败状态码,客户可以再发送确认命令,或者发送QUIT命令。当客户发送了PASS命令后,服务器根据USER和PASS命令的附加信息决定是否允许访问相应的存储邮件。一旦服务器通过这些数据决定允许客户访问储存邮件,服务器会在邮件上加上排它锁,以防止在进入更新状态前对邮件的改变。如果成功获得了排它锁,服务器返回一个确认状态码。会话进入操作状态,同时没有任何邮件被标记为删除。如果邮件因为某种原因不能打开(例如,排它锁不能获得,客户不能访问相应的邮件或者邮件不能进行语法分析),服务器将返回失败状态码。在返回失败状态码后,服务器会关闭连接。如果服务器没有关闭连接,客户可以重新发送确认命令,重新开始,或者发送QUIT命令。在服务器打开邮件后,它为每个消息指定一个消息号,并以八进制表示每个消息的长度。第一个消息被指定为1,第二个消息被指定为2,以此类推,第N个消息被指定为N。在POP3命令和响应中,所以的消息号和长度以十进制表示。下面是在确认状态中可用的命令:USER username;PASS password; QUIT b.操作状态一旦客户向服务器成功地确认了自己的身份,服务器将锁住并打开相应的邮件,这时POP3会话进入操作状态。现在客户可以重复下面的POP3命令,对于每个命令服务器都会返回应答。最后,客户发送QUIT命令,会话进入更新状态。下面是在操作状态中可用的命令:STAT;LISTmsg;RETRmsg;DELEmsg;NOOP;RSET; TOPmsgn;UIDLmsg c.更新状态当客户在操作状态下发送QUIT命令后,会话进入更新状态。(注意:如果客户在确认状态下发送QUIT后,会话并不进入更新状态。)如果会话因为QUIT命令以外的原因中断,会话并不进入更新状态,也不从服务器中删除任何信件。QUIT在更新状态有效。; 可选的POP3命令:APOPnamedigest在确认状态有效 TOPmsgn; UIDLmsg在操作状态有效 注:除了STAT,LIST和UIDL的响应外,其它命令的响应均为+OK和-ERR。响应后的所有文本将被客户略去。2.2.2 POP3会话流程S:C:S:+OKPOP3serverreadyC:USER usernameS:+OKC:PASS passwordS:+OKC:STAT /请求服务器发回关于邮箱的统计资料,如邮件总数和总字节数S:+OK2320C:LIST /返回邮件数量和每个邮件的大小S:+OK2messages(320octets)S:1120S:2200S:.C:RETR1 /回由参数标识的邮件的全部文本S:+OK.S:S:C:DELE1S:+OKmessage1deletedC:QUITS:+OKdeweyPOP3serversigningoff(maildropempty)C:S:2.3 RFC822简介 电子邮件是全世界通用的。你可以给任何一个人发送电子邮件而不用考虑他所处的地理位置在哪或他使用的是什么软件作为邮件接受客户端。和其他与Internet相关的事物一样(或者可以说,与计算机技术相关的事物),电子邮件也是基于一种标准的,而人们把这个特殊的标准称作RFC 822。这个标准早在二十多年前(准确的日期是一九八二年八月十三日)就公布于世,在这期间它基本没有改变。在2001年公布的RFC 2822标准取代了RFC 822,但是它的基本内容和RFC 822是完全一致的,只是做了一些很小的更新和改动。而其他的一些邮件标准,比如RFC 850(在USENET上使用),同样也基于RFC 822标准。(RFC,Request For Comments) 2.4 Winsock简介 许多网络程序都是采用Socket套接字实现的,对于一些标准的网络协议如HTTP、FTP和SMTP等协议的编程也是基于套接字程序的,只是端口号不再是随意设定而要由协议来指定,比如HTTP端口在80、FTP是21,而SMTP则是25。Socket只是提供在指定的端口上同指定的服务器从事网络上的通讯能力,至于客户和服务器之间是如何通讯的则由网络协议来规定,这对于套接字是完全透明的。因此可以由Socket套接字为SMTP提供网络通讯基础,而对于网络通讯连路建立好之后采取什么样的通讯应答则要按SMTP协议的规定去执行了。本科题为方便起见,没有采用编写较复杂的Windows Sockets API进行编程,而是使用经过较好封装的MFC 的CSocket类。2.5 MFC简介 MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C+提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。 MFC封装了Win32 API,OLE API,ODBC API等底层函数的功能,并提供更高一层的接口,简化了Windows编程。同时,MFC支持对底层API的直接调用。 MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件。 MFC是C+类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是C+对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。第三章 电子邮件系统的设计和开发本章首先对SMTP协议,POP3协议的工作流程作了详细的分析,然后按照SMTP和POP3 协议结合Windows Sockets套接字进行设计实现代码并封装成CSMTP协议类和CPOP3协议类。最后根据客户端的基本需求设计成客户端邮件收发软件,并以友好的界面形式呈现出来。3.1 服务器端作用简介SMTP,POP3采用Client/Server工作模式,Client被称为客户端,一般我们日常使用电脑都是作为客户端,而Server(服务器)则是网管人员进行管理的。SMTP服务器的主要功能就是接收来自客户端的SMTP协议命令,然后对这些命令进行解析,根据不同的命令进行不同的处理,处理完成之后,将结果发送给客户端。图要作说明serverclientclientclient 图3-1 Client/Server工作模式示意图 以下用简单的流程图来分别示范SMTP,POP3的服务器端与他们对应的客户端的会话: 图3-2 SMTP会话流程示意图如图示,连接和发送过程如下: a.建立TCP连接 b.客户端发送HELO命令以标识发件人自己的身份,然后客户端发送MAIL命令服务器端正希望以OK作为响应,表明准备接收。 c.客户端发送RCPT命令,以标识该电子邮件的计划接收人,可以有多个RCPT行。服务器端则表示是否愿意为收件人接受邮件。 d.协商结束,发送邮件,用命令DATA发送。 e.以.表示结束输入内容一起发送出去。 f.结束此次发送,用QUIT命令退出。 图3-2 POP3会话流程示意图如图示,当邮件程序成功地连上POP服务器后,其先会使用USER命令将邮箱的账号传给POP服务器,然后再使用PASS命令将邮箱的账号传给服务器,当完成这一认证过程后,邮件程序使用STAT命令请求服务器返回邮箱的统计资料,比如邮件总数和邮件大小等,然后LIST便会列出服务器里邮件数量。然后邮件程序就会使用RETR命令接收邮件,也可在接收一封后便使用DELE命令将邮件服务器中的邮件置为删除状态。当使用QUIT时,邮件服务器便会将置为删除标志的邮件给删了。3.2 客户端程序设计本节主要介绍客户端的实现。本人选择使用VC+6.0来实现本系统的客户端,VC+6.0是使用面向对象语言C+的开发环境,更有利于集中精力于主要功能的实现。由图3-2,图3-3可以明显看出客户端需完成的任务:1发送SMTP命令,处理相应服务器的响应,将邮件按RFC822格式编码并发送。2发送POP3命令,处理相应服务器的响应,将邮件按RFC822格式解码并发送。本系统的现实主要使用了CSMTP,CPOP3,CmailMessage封装类。CSMTP类中的成员函数主要实现发送SMTP命令并处理SMTP服务器响应 ,CPOP3的成员函数主要实现发送POP3命令并处理POP3服务器响应,CMailMessage实现邮件的编码解码功能。3.2.1邮件的格式化由于电子邮件结构上的特殊性,在传输时是不能当作简单的文本来直接处理的,而必须按照一定的格式对邮件头和邮件体进行格式化处理之后才可以被发送。需要进行格式化的部分主要有:发件人地址、收件人地址、主题和发送日期等。在RFC(Request For Comments)文档的RFC 822里对邮件的格式化有详尽的说明.在本论文中由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_tDateTime.GetCurrentTime();/ Format: Mon, 01 Jun 98 01:10:30 GMTm_sHeader.Format( From: %srnTo: %srnDate: %srnSubject: %srn, / Include other extension lines if desired(LPCTSTR)m_sFrom, /sender(LPCTSTR)sTo, /recipients (LPCTSTR)sDate, /日期(LPCTSTR)m_sSubject);/主题void CMailMessage:EncodeBody() /此函数为邮件体编码(此处仅列出了关键部分)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 + m_sBody.Right( m_sBody.GetLength() - (nPos + nBadLength) ); /最后以rn.rn结尾3.2.2 SMTP&POP3协议封装类 很多EMAIL系统都是使用SMTP协议来作为发送协议,而POP3协议来作为接受协议。本节编写了有关于SMTP,POP3协议的C+类,这样的话呢,我们可以在连接的时候使用它。并且,类中实现的一些功能类似于SMTP,POP3协议中的一些命令。以下程序是通过使用MFC中CSocket类中成员函数的使用实现的,它包含在afxsock.h中。CSMTP class中的关键函数如下:BOOL Connect(); /格式化并发送HELLO命令,连接SMTP服务器BOOL Disconnect(); /断开连接SMTP服务器virtual BOOL FormatMailMessage( CMailMessage* msg );/ 调用CMailMessage类EncodeHeader()EncodeBody()对邮件格式化BOOL SendMessage( CMailMessage* msg );/ 调用CSMTP类 FormatMailMessage( ) transmit_message( )BOOL get_response( UINT response_expected ); /判断应答码是否为期望值BOOL transmit_message( CMailMessage* msg ); /发送SMTP命令调用get_response()处理服务器应答码并发送邮件头和邮件体SMTP协议类中部分成员函数的实现如下(此处仅列出了关键部分):CSMTP:CSMTP( LPCTSTR szSMTPServerName, UINT nPort ) AfxSocketInit(); / 用AfxSocketInit()函数对套接字进行初始化;BOOL CSMTP:Connect()if( !m_wsSMTPServer.Create() )/用Create()创建套接字对象m_sError = _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_wsSMTPServer.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 ) = 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_message(CMailMessage * msg) / Send the MAIL commandsFrom.Format( MAIL From: rn, (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 GetNumRecipients(); i+ ) msg-GetRecipient( sEmail, sTemp, i );sTo.Format( RCPT TO: rn, (LPCTSTR)sEmail );m_wsSMTPServer.Send( (LPCTSTR)sTo, sTo.GetLength() );get_response( GENERIC_SUCCESS );/ Send the DATA commandsTemp = DATArn; m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );/ Send the headerm_wsSMTPServer.Send( (LPCTSTR)msg-m_sHeader, msg-m_sHeader.GetLength() );/ Send the bodym_wsSMTPServer.Send( (LPCTSTR)msg-m_sBody, msg-m_sBody.GetLength() );/ Signal end of dataCRLF.CRLFsTemp = rn.rn;m_wsSMTPServer.Send( (LPCTSTR)sTemp, sTemp.GetLength() );return TRUE;到此为止,已基本在程序中体现出了SMTP协议类的功能,能在Socket套接字所提供的网络通讯能力基础之上实现以SMTP命令和SMTP应答码为基本会话内容的通讯交互过程,从而最终实现SMTP协议对电子邮件的发送。CPOP3 class中的关键函数如下:BOOL Disconnect();/发送QUIT 命令BOOL Connect(); /创建并初始化套节字,发送USER,PASS 命令BOOL GetMessage( UINT nMsg, CMailMessage* msg); /发送RETR命令,获得邮件int CPOP3:GetNumMessages()/发送STAT获得邮件总数及字节数BOOL DeleteMessage( UINT nMsg );/发送DELETE命令BOOL get_response( UINT executed_action );CPOP3协议类中部分成员函数的实现如下(此处仅列出了关键部分):CPOP3:CPOP3( LPCTSTR szPOP3ServerName, UINT nPort, LPCTSTR sUsername, LPCTSTR sPassword)AfxSocketInit();/在正式使用套接字之前,先用AfxSocketInit()函数对套接字进行初始化 BOOL CPOP3:Connect() if( !m_wsPOP3Server.Create() ) /用Create()创建套接字对象m_sError = _T( Unable to create the socket. );return FALSE;/由该套接字通过Connect()建立同邮件服务器的连接if( !m_wsPOP3Server.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 ) )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)CString sMsg;CString sRetr;sRetr.Format(RETR %drn,nMsg);m_wsPOP3Server.Send( (LPCTSTR)sRetr, sRetr.GetLength() );while ( sMsg.Find(rn.rn)m_sHeader=

温馨提示

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

评论

0/150

提交评论