第9章邮件接收和发送客户端之二•在第8章中详细的讲解了邮件发送协议SMTP和邮件接收协议POP3。并且在最底层通过socket编写了与邮件服务器交互的命令,来完成邮件的接收和发送等等操作。但界面做的比较粗糙,功能的实现看起来比较费劲。这一章将要介绍另一种方法——使用第三方的组件Jmail,它可以轻松实现与邮件服务器的交互,这样我们就可以腾出更多的时间改造粗糙的界面了。9.1邮件管理器简介•这节将带领大家提前看看我们这章要实现的示例的运行效果。这算是一个展示,主要用来吸引大家对本章内容的学习兴趣。9.1.1程序主界面•主界面用来管理3个对话框的显示:收件箱、发件箱和设置对话框,如图9.1所示。图9.1程序主界面•操作起来很简单,只要单击相应的按钮就会跳转到相应的对话框中。9.1.2“设置”对话框•“设置”对话框是程序启动后最先跳出来的界面。程序建议用户先填写相关信息,以便其它按钮对话框功能的实现。“设置”对话框的界面如图9.2所示。图9.2“设置”对话框•用户需要填写的信息包括:POP3服务器IP地址、用户名和密码信息。这些信息会在,“收件箱”对话框初始化和“发件箱”对话框发送邮件时用到,所以程序优先弹出这个对话框引导用户填写。9.1.3收件箱•当用户单击程序主界面上的“收件箱”按钮时,就会弹出如图9.3所示的“收件箱”对话框。图9.3收件箱对话框•当用户在“设置”对话框上填写了邮箱用户名和密码信息后,收件箱会在上边的列表框自动列出邮箱中的所有邮件信息,“刷新列表”按钮可以用来更新接收到的所有邮件,当用户用鼠标单击相应邮件的列表项时,下面的文本框会自动列出相应邮件的内容。“清空列表”按钮,顾名思义就是用来清空邮件列表和文本框内容的。•作为参照,我们在网页上打开邮箱,查看收件箱,如图9.4所示。图9.4通过网页登陆邮箱查看邮件发件人邮件主题接收日期9.1.4发件箱•当用户在程序主界面上单击“发件箱”按钮时,就会弹出如图9.5所示的“发件箱”对话框。图9.5发件箱对话框•用户发送邮件时要填写的信息包括:SMTP服务器的IP地址(SMTP服务器负责邮件的发送,它的IP地址可以在邮件服务器提供商的官网上找到)、收件人邮箱地址、邮件的主题、邮件的内容和添加的附件,本实例一封邮件只可以添加一个附件。单击“发送邮件”按钮就可以发送了,发送成功会有提示信息,“重写邮件”按钮只会清空邮件内容。•填写发信内容如图9.6所示。图9.6发送邮件内容填写•添加的附件是一副图片,如图9.7所示。图9.7附件添加的图片•单击“发送邮件”按钮,发送成功会弹出提示框,如图9.8所示。图9.8邮件发送成功•用网页登录邮箱,查看如图9.9所示。图9.9通过网页登录邮箱•打开刚接收到的邮件,如图9.10所示。图9.10通过网页打开邮件•使用提供的预览功能查看附件,如图9.11所示。图9.11附件预览9.1.5“正在处理中…”对话框•在打开“收件箱”对话框时会伴随着另一个对话框的“闪现”,因为它的出现十分的短暂,不易被察觉,截图是通过对程序代码做了“睡眠”处理,才有幸捕捉到它的行踪的,如图9.12和图9.13所示。图9.12“正在处理中…”对话框1图9.13“正在处理中…”对话框2•图示对话框是在不同阶段弹出的,然后会自动关闭。•怎么样?界面不再是单调的灰色,同样连按钮都变了。由于笔者的绘画功底比较差,所以这里只是起到一个抛砖引玉的作用,有自信的读者完全可以将程序绘制的更好看。当然从网上搜集些好看的素材同样不失为一个好主意。本章的背景素材全是由笔者借助于window7自带的“画图”工具完成的,如图9.14所示。图9.14“画图”工具•提醒:我们的邮件管理器可以登录任何邮件服务提供商的邮箱,也可以发送邮件,但是需要用户手动填写邮件服务提供商服务器的网址,分别是:用来接收邮件的POP3服务器的网址、用来发送邮件的SMTP服务器的网址,这个可以在邮件服务提供商的网站上找到。比如,示例所用的是126的邮箱,那么网址分别是:pop.126.com和smtp.126.com。填写不正确会影响邮件的接收和发送。9.2Jmail简介•Jmail就是一个第三方邮件操作的组件,常用于Web服务器端。它可应用于网站,使其拥有发送和接收邮件的能力,例如注册时邮箱收到的激活邮件就是由它发送的。Jmail同样也可应用于一般的应用程序。它有以下的一些特点:•可以发送附件。•当然,它还有最重要的特点,免费!是不是可以考虑下使用看看。9.2.1如何使用Jmail•Jmail组件就是一个后缀为dll的库,使用前需要在电脑上注册,可以通过以下两种方式注册:•方法一:使用官网提供的安装程序。•方法二:找到Jmail组件库,通过命令窗口定位到这个库,使用命令“regsvr32jmail.dll”注册即可。•官网提供的安装程序会完成如下功能:•检测电脑上是否已经有了一个Jmail的版本,会让用户选择“卸载”或“停止安装”。•笔者写本章节时,Jmail的版本是4.5.0。高级的版本可能不会再提供一些低版本的函数,所以提醒读者,本章示例所用的Jmail版本是4.3。这里演示下应用向导安装组件的过程。•从官网或者网上找到Jmai4.3的安装程序,开始安装,如图9.15所示。图9.15安装过程1•在向导的第4步选择安装的位置,如图9.16所示。图9.16安装过程2•在向导的第5步选择安装的方式,我们选择“Typical”,如图9.17所示。安装路径图9.17安装过程3•很简单的步骤,动动鼠标就能轻松完成。组件已经注册了,我们看看安装目录下的文件,如图9.18所示。安装方式图9.18目录下的文件•可以看到jmail.dll、一个自述文档readme.txt和一个PDF格式的使用手册,文件夹中包含了使用了这个组件的示例,如图9.19所示。图9.19组件使用示例源代码•我们要使用这个组件,需要复制jmail.dll到工程文件下,然后在stdafx.h文件中加入如下语句:•#importjmail.dll•usingnamespacejmail;•那么我们就可以在程序的源代码中直接使用jmail提供的属性和方法了。9.2.2属性•Jmail的常用属性字段如下:•From:发件人邮箱号。9.2.3方法•Jmail的常用方法如下:•AddAttachment(filename,[ContentType]),用来添加附件。9.2.4发送和接收邮件示例•首先看下发送邮件的代码,如下:•01//首先创建一个jmail.message对象•02jmail::IMessagePtrpMessage(JMail.Message);•03•04//填充发件人邮箱•05pMessage-From=everyone_now@126.com;•06//发件人姓名•07pMessage-FromName=pang;•08//添加收件人•09pMessage-AddRecipient((funy_myday@126.com,,);•10//优先级设置•11pMessage-Priority=3;•12//编码方式设置•13pMessage-Charset=GB2312;•14//主题•15pMessage-Subject=一次小小的尝试;•16//正文•17pMessage-Body=在邮箱中看到了我?恭喜你成功的发送了邮件!;•18//添加附件•19pMessage-AddAttachment(C:\\image.bmp,•20VARIANT_TRUE,image/gif);•21//发件人的邮箱•22pMessage-MailServerUserName=everyone_now@126.com;•23//发件人的登录密码,这里就暂用*代替吧•24pMessage-MailServerPassWord=*******;•25//发送邮件•26pMessage-Send(smtp.126.com,VARIANT_FALSE);•27//释放对象•28pMessage.Release();•可以看到,代码只是完成了信息的填充功能,即将各类信息对号入座,最后发送邮件。代码中有详细的注释,就不一一细说了。再来看看接收邮件的代码吧,如下:•01//首先,创建一个jmail.pop3对象实例•02jmail::IPOP3PtrpPOP3(JMail.POP3);•03•04//设置连接服务器超时限制30S•05pPOP3-Timeout=30;•06•07//连接邮件服务器,110为pop3默认端口号•08pPOP3-Connect(everyone_now@126.com,•09****,//同样,密码这里用了*代替•10pop.126.com,•11110);•12•13jmail::IMessagesPtrpMessages;•14pMessages=pPOP3-Messages;•15//已下载的邮件的实际个数(因为第0个ITEM是未用的,所以-1)•16longlCount=pMessages-Count-1;•17•18//以下变量用来临时保存邮件的不同部分•19_bstr_tg_bstrFrom;•20_bstr_tg_bstrSubject;•21_bstr_tg_bstrBody;•22COleDateTimeg_oleDate;•23CStringArrayg_strDetailArray;•24inti;•25if(lCount==0)•26AfxMessageBox(信箱为空);•27else•28{•29jmail::IMessagePtrpMessage;•30•31//遍历每封信•32for(i=1;i=lCount;i++)•33{•34//获取一封完整的邮件•35pMessage=pMessages-Item[i];•36//获取邮件的具体信息•37g_bstrFrom=pMessage-From;•38g_bstrSubject=pMessage-Subject;•39g_bstrBody=pMessage-Body;•40g_oleDate=pMessage-Date;•41•42//保存邮件的主体文本•43g_strDetailArray.Add((constchar*)g_bstrBody);•44pMessage.Release();•45}•46}•47//断开连接•48pPOP3-Disconnect();•我们必须首先依照提供的信息与存放电子邮件的服务器相连,然后才能读取信息,最后一定要关闭连接。得到邮件后就可以通过收件人、主题等字段取得想要的信息了。•那么以上就是发送和接收邮件的主要代码了。本章示例只是将代码中的变量与控件建立了联系,并且选择了恰当的时机执行代码而已。9.3CBitButtonNL简介•CBitButtonNL是MFC提供的类吗?当然不是,不过也不能说和MFC毫无关系,因为CBitButtonNL是继承自MFC的类CButton的,我们只是在CButton的基础上添加了功能而已。9.3.1按钮图像•我们首先来为按钮添加图像,这感觉就像是在原来灰色的按钮上贴了层彩色贴纸一样。1.设置按钮图像之SetBitmaps()•(1)在类CBitButtonNL体内定义私有结构,用来保存位图的信息,如下:•3个成员分别用来保存位图的句柄、位图宽度和位图高度。以此自定义类型为类CBitButtonNL定义数组,用来保存按钮在4种状态下显示的位图。如下:•STRUCT_BITMAPSm_csBitmaps[4]•(2)为类CBitButtonNL添加公有成员函数SetBitmaps(),参数是资源的ID,代码编写如下:•函数SetBitmaps()主要通过参数传递进来的位图资源ID,获取图片资源的句柄,下一阶段的工作将由同名的重载函数SetBitmaps()完成剩余的功能,它们的参数不同。•函数SetBitmaps(),第一个参数是必选项,其它参数都有