三、 CMIMEMessage子模块:该模块用于表示邮件的附件。使用该类可以根据提供的文件名读取出正确的文件,保存文件名和标题。并提供了能够取出这些属性的方法。其类图如图6所示。 内容来自论文无忧网 www.paper51.com
http://www.paper51.com 图6 CMIMEMessage类图 paper51.com 成员变量说明: http://www.paper51.com 1) protectedCString m_Filename:保护成员变量,表示附件所代表的文件的文件名。添加到邮件时使用。 内容来自论文无忧网 www.paper51.com 2) protectedCString m_FileContent、TCHAR * m_ContentBuffer:保护成员变量,表示附件所代表的文件的内容。 paper51.com 3) protectedDWORD bufLen:保护成员变量,表示当前附件的长度,单位是字节。 内容来自www.paper51.com
成员函数说明: 内容来自论文无忧网 www.paper51.com 1) publicBOOL Attach(const CString &sFilename):该方法的作用是根据传递进来的参数文件名,来把本地文件中的内容读取出来,并添加到当前附件对象中。并且根据传递进来的参数,分别给bufLen、m_FileContent、m_Filename、m_Title等成员变量赋值。如果附件添加成功,则返回TRUE;否则返回FALSE。 copyright paper51.com
2) publicCString GetFilename()、CString GetTitle()、CString GetContent()、TCHAR * GetContentBuffer()、DWORDGetBufferLength():上述方法作用分别为获取附件名称、附件标题、附件内容(以字符串形势返回)、附件内容(以数组方式返回)、附件的长度。为类的调用者提供了统一的操作接口。 内容来自论文无忧网 www.paper51.com 四、 CBASE64子模块:在SMTP的相关协议中规定,对于身份验证的用户名、密码、邮件的正文以及附件的内容均要采用BASE64的方式进行编码。该类就是对BASE64的算法进行的封装。提供了对两种数据源的加密操作和一种解密操作。其类图如图7所示。 内容来自论文无忧网 www.paper51.com
内容来自www.paper51.com 图7 CBASE64类图 http://www.paper51.com 成员变量说明: 内容来自论文无忧网 www.paper51.com
1) staticCString base64:该变量是归类所属的成员变量。表示BASE64编码所使用的字符表。 paper51.com 2) privateCString sEncode 、CString sDecode:表示编码和解码的数据。 http://www.paper51.com 成员函数说明: paper51.com 1) publicDWORD CBASE64::ComputeLen(DWORD size):该方法的作用是计算编码后数据的长度。参数为编码前的长度,返回值为编码后的长度。 paper51.com 2) TCHAR* CBASE64::Encode(TCHAR* buf , DWORD nSize):该方法的作用是对制定的数据进行编码。参数TCHAR *buf表示要进行编码的数据的首地址,参数DWORD nSize则表示要编码的长度。本方法根据BASE64编码的定义,对数据进行了编码。本类为该方法提供了一个重载的方法,其参数为CString szEncoding和int nSize。参数szEncoding表示要进行编码的数据源,而参数int nSize表示要进行编码的长度。在两种方法中,返回值均为编码后的数据。 paper51.com 3) char* CBASE64::GetTempSecret(CStringsTemp , int &length):根据BASE64编码方式的定义,在解码过程中,要先把要编码后的数据根据BASE64的对应表变换成编码时所得到的中间码。该方法就是根据编码后的数据得到中间码的操作。参数CString sTemp和int &length分别为要解码的数据和长度。 内容来自www.paper51.com
4) CStringCBASE64::Decode(CString szDecoding , int nSize):该方法的作用是根据传递进来的参数对数据进行解码。 paper51.com 4.2.2 实现软件的界面类 内容来自www.paper51.com
方便的用户界面是用户能够方便操作最基本保证。一个良好的界面能够带给用户以愉快的使用体验,从而会加大对作品的喜爱程度。目前的版本中与界面有关的类有三个:CMyEMailApp 、 CMyEMailDlg 、 CAboutDlg。这三个类均由IDE环境的AppWizard功能导航完成。在VC中,有三种应用程序模式可供选择,分别为:基于对话框的应用程序、单文档模式的应用程序、多文档模式的应用程序。本软件采用的是第一种。三个类的作用如下: paper51.com 1、CMyEMailApp类:该类由CWinApp继承而来,具有父类的所有特性。代表当前的应用程序。使用该类定义的全局对象会由MFC的框架自动传递给隐藏的方法。这个类定义的对象可以说是程序的入口点(并不是真正的入口,真正的入口是WinMain函数)。通过隐藏的操作自动调用该类的初始化方法InitInstance就会初始化应用程序。定义一个该类的全局对象是程序能够运行与否的关键部分。 http://www.paper51.com 2、CMyEMailDlg类:该类与用户操作的主界面相对应。用于提供美观、方便操作的界面给用户使用并保存用户输入的数据。提供了与邮件操作有关的按钮等触发器并定义了操作的具体处理方式。该类是本软件的操作平台。它与用户直接进行交互,该界面是否友好,直接影响到用户体验。该对话框资源如图8所示。 copyright paper51.com 图8 程序主界面 paper51.com 3、CAboutDlg类:该类与关于对话框相对应。其对应的对话框资源如图9所示。 copyright paper51.com
http://www.paper51.com
图9 关于对话框 内容来自论文无忧网 www.paper51.com 4.2.3 模块之间的关系 http://www.paper51.com
本软件是由各个工具类和界面类两个大部分构成的。其中界面类由MFC自动创建,而工具类则由作者设计完成,整个软件的开发过程就是把工具类添加进界面类并使之能够协调工作的过程(开发者的工作都是这样)。正如上节提到的,CMyEMailApp是整个应用程序的入口,在其初始化操作中调用了CMyEMailDlg的相关方法,生成主界面对话框。在主界面对话框的相关事件处理方法中,会调用CSMTP的连接和传送消息方法,并把用户输入的数据装配为一个完整的CMailMessage消息供CSMTP使用。而如果在存在附件的情况下,CMailMessage类型的消息则会包含一个CMIMEMessage类型的附件。在CSMTP和CMailMessage中又会看到,它们对CBASE64类的调用。整个软件就是由这样的一些类有机“堆砌”而成。类的关系图如图10所示。 内容来自论文无忧网 www.paper51.com
内容来自论文无忧网 www.paper51.com 图10 类关系图 内容来自www.paper51.com 4.3 核心模块实现与核心功能编码 paper51.com 在4.2节中,已经对所有的模块的功能以及相互关系进行了介绍,那么下面将对其中的核心功能进行描述。 内容来自www.paper51.com
4.3.1 邮件发送实现 paper51.com 在邮件发送之前首先要与服务器建立连接,该操作由CSMTP类的Connect操作完成。该方法根据用户输入的参数,调用底层API连接到服务器,连接失败返回FALSE,连接成功则返回TRUE。 copyright paper51.com //首先要建立接收消息缓冲区,接收服务器的消息 内容来自www.paper51.com this->responseBuf = newTCHAR[RESPONSE_BUFFER_SIZE]; copyright paper51.com //创建连接,成功继续执行,失败则返回。 paper51.com
if( !this->m_SMTPServer.Create()) http://www.paper51.com
//用用户指定的服务器和端口号码连接到服务器,成功继续执行;失败返回 paper51.com
if( !this->m_SMTPServer.Connect(p,this->GetPort())) 内容来自www.paper51.com //接收服务器发送的消息代码,为220说明服务器接受了请求,否则出错 paper51.com if(!this->GetResponse(SMTP_SERVER_READY)) 内容来自www.paper51.com //发送EHLO命令给服务器,要求建立一条通信通道 paper51.com helloCommand.Format("EHLO%s\r\n" , localHostName); copyright paper51.com this->m_SMTPServer.Send((LPCTSTR)helloCommand,helloCommand.GetLength());if(!this->GetResponse(SMTP_SERVER_TASK_FINISH) ) 内容来自论文无忧网 www.paper51.com 如果在上述过程中没有出错,那么就得到了一条客户端与服务器进行信息交互的通道。利用该通道就可以进行邮件传送操作了。综上所述,建立与服务器连接过程程序流程图如图11所示。 内容来自论文无忧网 www.paper51.com copyright paper51.com |