VC++ 课程设计报告基于VC++的电子邮件发送和接收程序设计.doc
电子邮件发送和接收程序的开发1、需求分析1.1、开发背景电子邮件服务作为Internet上应用最多和最广的服务项目得到了非常广泛的应用,在网络应用中也起到非常重要的作用。如同其他的网络服务,电子邮件系统也有其使用的传输协议,包括SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)、POP(Post Office Protocol,邮局协议)和IMAP(Internet Message Access Protocal,消息访问协议)等,这些协议应用于电子邮件的发送和接收。一些邮件处理软件如OutLook Express和FoxMail等就是按照SMTP和POP3 协议结合Windows Sockets套接字进行设计来收发邮件的。随着互联网的不断发展,越来越多的企业单位通过电子邮件来协同工作,打破时间与地域的限制,大大提高了工作效率。电子邮件已地经成为人们生活中不可缺少的一部分。电子邮件具有普通邮件所不具备的特点:(1)信息类型多样。通过电子邮件用户不仅可惟发送普能的文本文字,而且可以将图形、图像和语音等多谋体数据做为邮件发送。(2)快速便捷。电子邮件是以电子流传输速度进行传输,速度非常快,您在深圳发送给美国的收件人,几分钟后对方就能收到。(3)高效灵活。利用电子邮件,用户可以一次将同一邮件送给多个收件人。现在很多公司都可惟利用这种工具进行联机查询、网上调查等等。电子邮件是现在应用最广泛的系统,本文基于SMTP和POP3协议开发了一个实用的邮件收发系统。但是,当前流行的各大邮件客户端软件除了最主要的收发信件之外,功能越来越复杂,但是人们平常真正用到的功能很少,很多功能尤其对于那些计算机知识相对缺乏的人来说,更加显得太过于华丽而不实用。所以这次的课程设计,我选择了制作一个操作简单,又可以实现最基本的电子邮件的收发功能的工具。1.2、功能要求基本发送和接受邮件的功能。实现通信功能。具有简单、实用、易操作的图形界面。在以上基础上尽量实现发送附件的功能。程序还应可以判断整个过程是否能正常运行,如果不正常运行,必须给出错误信息。2、系统总体分析2.1、电子邮件介绍电子邮件又称E-mai1,是种用电子手段提供信息交换的通信方式。它是全球多种网络上使用最普遍的一项服务。这种非交互式的通信,加速了信息的交流及数据传送,它是个简易、快速的方法。通过连接全世界的Internet,实现各类信号的传送、接收、存贮等处理,将邮件送到世界的各个角落。到目前为止,可以说电子邮件是Internet资源使用最多的一种服务,E-mai1不只局限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息。电子邮件的处理由两大部分组成:电子邮件发送程序和电子邮件接收程序。电子邮件发送程序的发送方式有两种:第一种是本地计算机与用户所指定的发送邮件服务器连接,然后通过发送邮件服务器将邮件传递到接收邮件服务器,邮件中包含有信件的主题和内容等一系列信息;第二种是本地计算机直接与接收电子邮件的服务器相连,并将邮件送入收件者的邮箱中。电子邮件接收程序则只需要处理本地计算机与存放电子邮件的服务器相连接,并通过帐号和口令从服务器中获取电子邮件,邮件中包含有信件的主题、内容和发送时间等。系统使用VisualC+ 6.0作为开发工具,开发一个功能全面,应用广泛电子邮件应用程序。系统实现的功能主要有创建与更改帐号,发送与接收电子邮件及其附件,管理电子邮件等。本例发送程序采取了既可与发送邮件服务器连接又可以直接与接收邮件服务器连接的方式来实现电子邮件的发送。用户在“收件人邮箱”所对应的对话框中输入收件人的Email地址,并在“发件人邮箱”所对的对话框中输入发信人的Email地址,编辑信件的正文(本例还可以发送附件,只要填写真确的路径,就可以发送附件),然后单击“发送”按钮,便可完成电子邮件的发送。电子邮件发送成功,程序将弹出一个“发送成功”的消息对话框;若电子邮件发送失败,程序将给出失败的相关信息。另外这里还有个“关于”按钮,单击一下可以查看相关帮助信息,有利于你使用此软件。本例电子邮件接收程序也采取了Visual C+语言与JMail组件相结合的方法,实现从电子邮件服务器上接收邮件。用户在“邮件服务器POP3”所对应的编辑框中输入收件人的E-mail所在的POP3服务器,在“帐号”所对应的编辑中输入邮箱的帐号,在“口令”所对应的编辑框中输入打开邮箱的密码,单击“收取”按钮,便可完成电子邮件的收取。若用户的信箱中存在着邮件,程序将把所有邮件罗列出来,单击任何一封邮件的标题,均可查看邮件的正文;若连接邮件失败,程序将给出失败的相关信息。同样有一个“关于”按钮,单击一下可以查看相关帮助信息。(1)SMTP协议的通讯模型和会话流程1)SMTP协议通讯模型 SMTP协议是TCP/IP协议族中的一员,主要对如何将电子邮件从发送方地址传送到接收方地址,也即是对传输的规则做了规定。SMTP协议的通信模型并不复杂,主要工作集中在发送SMTP和接收SMTP上:首先针对用户发出的邮件请求,由发送SMTP建立一条连接到接收SMTP的双工通讯链路,这里的接收SMTP是相对于发送SMTP而言的,实际上它既可以是最终的接收者也可以是中间传送者。发送SMTP负责向接收SMTP发送SMTP命令,而接收SMTP则负责接收并反馈应答。可大致用下面的通讯模型示意图来表示:从前面的通讯模型可以看出SMTP协议在发送SMTP和接收SMTP之间的会话是靠发送SMTP的 SMTP命令和接收SMTP反馈的应答来完成的。在通讯链路建立后,发送SMTP发送MAIL命令指令邮件发送者,若接收SMTP此时可以接收邮件则作出OK的应答,然后发送SMTP继续发出RCPT命令以确认邮件是否收到,如果接收到就作出OK的应答,否则就发出拒绝接收应答,但这并不会对整个邮件操作造成影响。双方如此反复多次,直至邮件处理完毕。SMTP协议共包含10个SMTP命令,列表如下:SMTP命令命令说明HELLO domain CRLF识别发送方到接收SMTP的一个HELLO命令MAIL FROM:reverse-pathCRLFreverse-path为发送者地址。此命令告诉接收方一个新邮件发送的开始,并对所有的状态和缓冲区进行初始化。此命令开始一个邮件传输处理,最终完成将邮件数据传送到一个或多个邮箱中。RCPT TO:forward-pathCRLFforward-path标识各个邮件接收者的地址DATA CRLF接收SMTP将把其后的行为看作邮件数据去处理,以CRLF.CRLF标识数据的结尾。REST CRLF退出/复位当前的邮件传输NOOP CRLF要求接收SMTP仅做OK应答。(用于测试)QUIT CRLF要求接收SMTP返回一个OK应答并关闭传输。VRFY string CRLF验证指定的邮箱是否存在,由于安全因素,服务器多禁止此命令。EXPN string CRLF验证给定的邮箱列表是否存在,扩充邮箱列表,也常禁止使用。HELP CRLF查询服务器支持什么命令注:CRLF为回车、换行,ASCII码分别为13、10(十进制)。SMTP协议的每一个命令都会返回一个应答码,应答码的每一个数字都是有特定含义的,如第一位数字为2时表示命令成功;为5表失败;3表没有完成。一些较复杂的邮件程序利用该特点,首先检查应答码的首数字,并根据其值来决定下一步的动作。下面将SMTP的应答码列表如下:应答码说明501 参数格式错误502 命令不可实现503 错误的命令序列504 命令参数不可实现211 系统状态或系统帮助响应214 帮助信息220domain服务就绪221 domain服务关闭421 domain服务未就绪,关闭传输信道250要求的邮件操作完成251 用户非本地,将转发向forward-path450 要求的邮件操作未完成,邮箱不可用550 要求的邮件操作未完成,邮箱不可用451 放弃要求的操作;处理过程中出错551 用户非本地,请尝试forward-path 452 系统存储不足,要求的操作未执行552 过量的存储分配,要求的操作未执行553 邮箱名不可用,要求的操作未执行354 开始邮件输入,以"."结束554 操作失败2)SMTP协议的会话流程在进行程序设计之前有必要弄清SMTP协议的会话流程,其实前面介绍的内容已经可以大致勾勒出用SMTP发送邮件的框架了,对于一次普通的邮件发送,其过程大致为:先建立TCP连接,随后客户端发出HELLO命令以标识发件人自己的身份,并继续由客户端发送MAIL命令,如服务器应答为"OK",可继续发送RCPT命令来标识电子邮件的收件人,在这里可以有多个RCPT行,而服务器端则表示是否愿意为收件人接受该邮件。在双方协商结束后,用命令DATA将邮件发送出去,其中对表示结束的"."也一并发送出去。随后结束本次发送过程,以QUIT命令退出。下面通过一个实例,从langrui发送邮件到renping来更详细直观地描述此会话流程:R:220 Simple Mail Transfer Service ReadyS:HELLO R:250 S:MAIL FROM:langruiR:250 OKS:RCPT TO:renpingR:250 OKS:DATAR:354 Start mail input;end with "CRLF.CRLF"S:R:250 OKS:QUITR:221 Service closing transmission channel(2)POP3协议简介邮局协议 3 (POP3) 是检索电子邮件的标准协议。POP3 协议控制 POP3 电子邮件客户端和存储电子邮件的服务器之间的连接。POP3 服务使用 POP3 协议将电子邮件从邮件服务器检索到 POP3 电子邮件客户端。POP3 协议针对电子邮件服务器与电子邮件客户端之间的连接时具有三种处理状态:身分验证状态、事务处理状态和更新状态。在身份验证状态下,连接到服务器的 POP3 电子邮件客户端必须先接受身份验证,然后用户才能检索电子邮件。如果电子邮件客户端提供的用户名和密码与服务器上的匹配,则用户通过身份验证,然后进入事务处理状态。如果不匹配,用户会收到错误消息,不允许连接和检索电子邮件。为防止对邮件存储区的破坏,客户端通过身份验证后,POP3 服务会锁定用户的邮箱。用户通过身份验证后,由于邮箱已被锁定,除非该连接被终止,否则不能下载提交到邮箱的新电子邮件。同样,每次只允许一个客户端连接到邮箱,其他连接邮箱的请求都会被拒绝。 在事务处理状态下,客户端发送 POP3 命令,同时服务器会根据 POP3 协议接收命令并做出响应。如果服务器接收的任一客户端请求不符合 POP3 协议,就会被忽略,并返回错误消息。更新状态关闭客户端与服务器端之间的连接。这是客户端发送的最后命令。连接关闭后,邮件存储区会更新,以反映用户连接到邮件服务器后的变化情况。例如,除非用户的电子邮件客户端配置成执行其他操作,否则在用户成功检索电子邮件后,已检索的电子邮件将被标记成删除,然后从邮件存储区中删除。POP3(Post Office Protocol 3) 是适用于C/S结构的脱机模型的电子邮件协议, 目前已发展到第三版。POP3规定了怎样将个人计算机连接到Internet的邮件服务器并下载电子邮件的规则。POP3是因特网电子邮件的第一个离线协议标准, 允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器, 用来接收电子邮件。 POP适用于C/S结构的脱机模型。脱机模型即不能在线操作,不像IMAP4(netscape支持IMAP4)当客户机与服务器连接并查询新电子邮件时,被该客户机指定的所有 将被下载的邮件都将被程序下载到客户机,下载后,电子邮件客户机就可以删除或 修改任意邮件,而无需与电子邮件服务器进一步交互。POP3客户向POP3服务器发送命令并等待响应,POP3命令采用命令行形式,用ASCII码表示。 服务器响应是由一个单独的命令行组成,或多个命令行组成,响应第一行以ASCII 文本+OK或-ERR指出相应的操作状态是成功还是失败在POP3协议中有三种状态,认可状态,处理状态,和更新状态。 当客户机与服务器建立联系时,一旦客户机提供了自己身份并成功确认,即由认可 状态转入处理状态,在完成相应的操作后客户机发出quit命令,则进入更新状态,更新之后最后重返认可状态。如下图等待连接 身份确认 quit命令 |认可| |处理|更新|_|重返认可状态图1 POP3工作流程图2.2、总体设计方案及思路(1)电子邮件的发送程序发送邮件的程序必须能够做3件事情:与接收电子邮件的服务器相连接;将相关的信息送入收件人的信箱;程序还应可以判断整个过程是否能正常运行,如果不正常运行,必须给出错误信息。一般情况下,在中,电子邮件程序的编写是利用自带的以及相关的通信协议SMPT/POP3等来实现的。但是要利用MAPI和通信协议实现一个功能强大的电子邮件管理程序,需要很强的相关专业知识。随着现代软件业的发展,软件厂商提供了方便、简易,与服务器无关且稳定的电子邮件处理组件,使我们可以在程序开发语言中调用这些组件,利用很简单的语言实现功能强大的程序。JMail组件就是一个很好用的电子邮件程序开发第三方组件。所以这次的课程设计我选择了组件。JMail组件中包含许多实现电子邮件处理的属性和方法。只需要在VC+代码中创建一个JMail组件的对象,调用其中的某些功能,就能很快完成程序的开发。JMail常用的发送邮件的基本属性和方法如表1所示。表1 JMail常用发送邮件的基本属性和方法方法和属性功能Body邮件内容Charset字符集,默认为“US-ASCII”Sendname发送人姓名Sender发送人邮箱地址ServeraddressSMPT服务器地址,可制定多个,用分号分开,并可指定端口;为空白时,JMail会尝试解决远程邮件服务器,然后直接发送。Subject标题Priority优先级(1:高优先级;3:普通优先级;5:低优先级)AddAttachment(“filename”,ContentType)添加文件附件AddCustomAttachment(“filename”,data)添加自定义附件AddURLAttachment(“bstrURL”,“bstrAttachAS”,bstrAuth)下载并添加一个来自bstrURL的附件,BstrAttachAS指定受到信件的文件名。AddRecipient(“Email-Address”)增加一个收件人AddRecipientEX(“Email-Address”,“name”)增加一个带名字的收件人AppendBodyFromFile(“filename”)将一个文件追加到正文后AppendText(“Text”)追加信的正文内容Execute()方法执行发送Close()方法强制JMail关闭缓冲与邮件服务器的连接由于JMail是第三方组件,因此VC+程序要想调用JMail对象,就必须先下载JMail动态链接库,并在本机中进行注册。具体操作方法如下:打开运行对话框,输入cmd,打开命令提示符编辑器,输入如下指令即可注册成功:(JMail组件的安装路径)regsvr32 jmail.dll(2)电子邮件的接收程序接收邮件的程序必须能够做三件事:与存放电子邮件的服务器相连接;读取相关的信件信息,并存放与本地计算机中;程序还将判断整个过程是否能正常运行,如果不正常运行,必须给出错误信息。与电子邮件发送程序的编写相同,我还是采取VC+语言和JMail组件相结合的方法来实现邮件的收取。JMail常用的接收邮件的基本属性和方法如表2所示。表2 JMail常用接收信件的基本属性和方法方法和属性功能Body邮件内容Charset字符集,默认为(US-ASCII)Date信件发送日期MailServer邮箱所在的服务器Subject标题Timeout连接服务器的超时限制Connect()连接服务器,需要参数:帐号、口令、服务器地址、端口2.3、模块分析电子子邮件接受方式程序主要由以下两个大的模块构成:发送邮件模块和收取邮件模块。其功能模块如图1所示:电子邮件客户应用系统发送邮件接收邮件 图2 电子邮件功能模块图(1)电子邮件发送程序的主要模块电子邮件发送程序主要由以下几个模块组成:邮件服务器:用于填写收件人的邮箱服务器(可以不填);收件人信箱:用于填写收件人的邮箱名;发件人信箱:用于填写发件人的邮箱名;主题:用于填写信件主题;正文:用于写入信件正文;退出:用于退出发件程序;发送:用于发送邮件;关于:用于显示软件开发的相关信息。附件:可以手动添加附件并完成发送(该功能正在进一步完善中)。(为本小组另行添加的功能)(2)电子邮件接收程序的主要模块电子邮件接收程序主要由以下几个模块组成:邮件服务器:用于填写需要收取信件信箱的服务器;帐号:用于填写需要收取信件的邮箱帐号;口令:用于填写需要收取信件的邮箱密码;邮件列表:显示邮箱中所有邮件的列表;正文:当选中邮件列表中任一邮件时,显示该封信件的具体内容;退出:用于退出接收邮件程序;收取:用于收取信件。3、程序测试(运行截图)3.1、添加“关于”标签的测试在原设计的基础上我添加了一个“关于”的标签,点击该按钮会弹出一个小的对话框,其中的内容包括本小组的成员、程序开发时间以及一些关于邮件方面的相关帮助信息。程序的运行结果如图1所示。图3 “关于”程序主界面3.2、发送邮件的测试图4 邮件发送主界面(不带附件)图5 发送邮件程序主界面(加载附件)图6 发送邮件程序主界面(带附件)3.3、收取邮件的测试图7 收取电子邮件程序主界面4、设计总结4.1、课程小结在邮件发送程序中,用户可以利用SMPT服务器向朋友发送电子邮件,也可以直接尝试链接朋友的E-mail信箱所在的服务器。这次课程设计我所利用的JMail组件封装了很强的电子邮件处理功能,如附件传递、用户的跟踪服务、发布产品信息,以及电子报刊处理等功能。在邮件接受程序中,用户可以向POP3服务器收取电子邮件。用户打开邮箱后,将利用JMail组件创建的对象指针遍历邮箱中的所有邮件,并将邮件信息下载存放于本地计算机中,利用List控件的扩展属性显示邮件的正文内容。目前我所做的这个程序还不够完整,还存在着很多的不足和不完善的地方。归纳起来体现在以下几个方面:软件的功能趋于简单,真正的邮件收发工具软件包括很多方面的信息,而不仅仅局限于发送邮件和收取邮件。真正的邮件服务软件还包括邮件导入、邮件导出、文本编辑(查找与撤消)、通讯簿、通讯规则等等功能。软件的图形操作功能缺乏,目前系统中对邮件附件的添加、删除功能都没有图形快捷操作,只能通过改变源程序中的代码达到添加附件的目的。而且由于时间和知识的欠缺,整个系统的界面显得过于单调,缺乏动态显示效果。如果能结合其它界面美化工具,使得界面更人性化,那就更好了。4.2、个人小结经过不懈的努力,终于完成了这次的课程设计。其实在做这次VC+程序设计实验之前,我基本上没有真正意义上的接触过VC+程序案例的设计和开发,只是通过课堂了解了一些关于VC+的最基本的知识,所以这次实验是在边学习边实践的基础上完成的。由于知识的不足,做的结果自己不是很满意,与自己原来的设想也有些差距。但是我也从这两个星期的设计和制作过程中学到了很多知识,对自己以后的专业学习甚至将来的工作都有很大的帮助。两个星期的实习,过程曲折可谓一语难尽。在此期间我也失落过,也曾一度热情高涨。从开始时满富盛激情到最后汗水背后的复杂心情,点点滴滴无不令我回味无长。生活就是这样,汗水预示着结果也见证着收获。劳动是人类生存生活永恒不变的话题。通过实习,我才真正领略到“艰苦奋斗”这一词的真正含义。 对我而言,知识上的收获重要,精神上的丰收更加可喜。挫折是一份财富,经历是一份拥有。这次实习必将成为我人生旅途上一个非常美好的回忆!附录(源代码):1、“关于”标签的程序代码(1)往头文件StdAfx.h中添加下列代码:#define CRLF "x0dx0a" /注意这两行必须添加#define CRLF2 CRLF CRLF(2)主要代码如下:BOOL CAboutDlg:OnInitDialog() CDialog:OnInitDialog();/ TODO: Add extra initialization herem_strEditHelp= "相关帮助信息:" CRLFCRLF " 一、 发送邮件服务器和发信人信箱有密切关系,假如你的信箱为loop,则发送邮件服务器一般为:,当然这也不是绝对的,你可以到你的邮件相关网站查询。不知道服务器名的话也可以不填!" CRLFCRLF" 二、 发信信箱格式比较灵活,如下两种格式均为合法的:1 在你的E-Mail首尾加小于大于符号:<loomman> 2 直接填写你的E-Mail:loomman " CRLFCRLF " 三、 接受信箱可以为多个,中间用分号;隔开,例如:Pookie<pookie>snuggles<snuggles><loomman> 某些信箱前面的部分字符串是收信人名称,例如上面的Pookie可以省略不写,例如下面一行和上面一行是等价的,它们都是可以接受的信箱输入格式。<pookie><snuggles><loomman>" CRLFCRLF " 四、 邮件主题,当然就是邮件的标题了,你可以随意输入自己喜爱的标题。"CRLF CRLF " 五、 邮件正文就是你要发给对方的信息。" CRLFCRLF " 六、 最后不得不提一下,由于当今好多发送邮件服务器都要求身份验证,也就是需要提供的你的信箱密码,鉴于技术问题,这类信箱本程序暂时不支持。" CRLFCRLF" 周清 周庆 蒯志刚 于雯"CRLF" 2007年7月" CRLF ; UpdateData(FALSE); / Update the Dialogreturn TRUE; / return TRUE unless you set the focus to a control / EXCEPTION: OCX Property Pages should return FALSE2、发送邮件程序代码:(1)往头文件StdAfx.h中添加JMail对象的声明,这样才能在整个程序中应用JMail对象.代码如下:#import "C:jmailjmail.dll" /显示指定JMail动态链接库using namespace jmail; /定义程序中JMail对象的名称(2)头文件MailServer.h,利用ClassWizard类项导添加退出应用程序的函数ExitInstnace().源代码如下:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMailServerApp)public:virtual BOOL InitInstance();virtual int ExitInstance();/AFX_VIRTUAL(3)源文件MailServer.cpp,类CMailServerApp的实现文件.1)由于程序中应用了JMail组件,因此必须在InitInstance()函数中添加如下代码,进行应用程序的初始化.BOOL CMailServerApp:InitInstance()AfxEnableControlContainer();:CoInitialize(NULL);#ifdef _AFXDLLEnable3dControls();/ Call this when using MFC in a shared DLL2)应用程序时,在ExitInstance()函数中添加释放各变量的代码./应用程序退出时int CMailServerApp:ExitInstance() / TODO: Add your specialized code here and/or call the base classreturn CWinApp:ExitInstance();:CoUninitialize();(4)MailServerDlg.h中,CMailServerDlg类的接口.1)在头文件MailServerDlg.h中,添加各控件的控件变量,如下表所示.控件控件变量IDC_EDIT_MAILSERVERm_strmailserverIDC_EDIT_RECIPIENTSm_strrecipientsIDC_EDIT_SENDERm_strsenderIDC_EDIT_SUBJECTm_strsubjectIDC_EDIT_BODYm_strbody2)利用ClassWizard添加IDOK控件的ON_BN_CLICKED事件函数,代码如下:Protected:/AFX_MSG(CMailServerDlg)Afx_msg void OnSend();/AFX_MSG3)源文件MailServerDlg.cpp,类CMailServerDlg的实现文件.打开MailServerDlg.cpp文件,添加发送邮件函数OnSend()的代码如下:/发送邮件程序void CMailServerDlg:OnSend() / TODO: Add your control notification handler code hereUpdateData();/获取Edit控件中的字符串m_strmailserver.TrimLeft();m_strmailserver.TrimRight();m_strrecipients.TrimLeft(); m_strrecipients.TrimRight();m_strsender.TrimLeft(); m_strsender.TrimRight();/判断Edit控件中的字符串是否有效 if(m_strrecipients.GetLength()<3)AfxMessageBox("请填写正确的收件人信箱");return;if (m_strsender.GetLength()<=0) AfxMessageBox("请填写发件人邮箱");return;/发送邮件过程try/创建一个JMail对象,这样便可以利用其内容封装的基本属性和方法jmail:IMessagePtr pMessage("JMail.Message");/发件人邮箱pMessage->From=(LPCTSTR) m_strsender;/发件人姓名pMessage->FromName="我的名字"/添加收件人pMessage->AddRecipient(LPCTSTR)m_strrecipients,"","");/优先级设置,15逐次降低,3为中级pMessage->Priority=3;/编码方式设置,默认是iso-8859-1pMessage->Charset = "GB2312"/主题pMessage->Subject = (LPCTSTR) m_strsubject;/正文pMessage->Body = (LPCTSTR) m_strbody;/开始发送pMessage->Send(LPCTSTR) m_strmailserver,VARIANT_FALSE); pMessage.Release();AfxMessageBox("发送成功!");/捕捉异常catch (_com_error e)CString strErr;strErr.Format("错误信息: %srn 错误描述: %s ", (LPCTSTR)e.ErrorMessage() , (LPCTSTR)e.Description(); AfxMessageBox(strErr);3、附件实现的代码:附件发送的实现;(1)首先在CMailServerDld类中定义几个对象。 public: CString str; CString tr; BOOL strbool; _bstr_t bstr;(2)加载文件:void CMailServerDlg:OnBtAddfile() / TODO: Add your control notification handler code hereCFileDialog cg(TRUE); if(cg.DoModal()=IDOK) strbool=true; else strbool=false;cg.DoModal(); str=cg.GetPathName();MessageBox(str);(3)发送附件: bstr=str.AllocSysString(); /CString类型转换成_bstr_t 类型 if(strbool=true) /判断有没有打开附件 _bstr_t bstrCID = pMessage->AddAttachment( bstr, VARIANT_TRUE, ""); /开始发送(带附件) pMessage->Send(LPCTSTR) m_strmailserver,VARIANT_FALSE); pMessage.Release(); AfxMessageBox("发送成功(带附件)!"); else /开始发送(不带附件) pMessage->Send(LPCTSTR) m_strmailserver,VARIANT_FALSE); pMessage.Release(); AfxMessageBox("发送成功(不带附件)!");/捕捉异常catch (_com_error e) CString strErr;strErr.Format("错误信息: %srn 错误描述: %s ", (LPCTSTR)e.ErrorMessage() , (LPCTSTR)e.Description(); AfxMessageBox(strErr);4、接受邮件程序代码:(1)往头文件StdAfx.h中添加JMail对象的声明,这样才能在整个程序中应用JMail对象.代码如下:/显示指定JMail动态链接库#import "C:jmailjmail.dll" /定义程序中JMail对象的名称using namespace jmail;(2)头文件MailServer.h,利用ClassWizard类项导添加退出应用程序的函数ExitInstnace().源代码如下:/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMailServerApp)public:virtual BOOL InitInstance();virtual int ExitInstance();/AFX_VIRTUAL(3)源文件MailRecieve.cpp,类CMailRecieveApp的实现文件.1)由于程序中应用了JMail组件,因此必须在InitInstance()函数中添加如下代码,进行应用程序的初始化.BOOL CMailRevieveApp:InitInstance()AfxEnableControlContainer();:CoInitialize(NULL);#ifdef _