5收发电子邮件实例程序参考

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

7.6接收电子邮件的程序实例7.6.1实例程序的目的和实现的技术要点通过这个实例,读者可以进一步了解POP3的有关原理和内容。程序的用户界面如图7.6所示:图7.6pop3电子邮件接收程序的用户界面这个实例不太复杂,用户可以利用某个网站的pop3电子邮件接收服务器来接收你在该网站的电子邮箱里的信件。首先填入pop3服务器地址、邮箱用户名和口令,并决定是否要删除邮箱里的邮件;然后点击“连接”按钮,程序会与服务器建立TCP连接,然后发送用户名和口令,经过验证,进入POP3会话。通过命令交互,将邮箱中的所有邮件取回。在此过程中,左下方的多文本列表框(RichTextBox)会显示全部的会话信息。信件全部下载完毕后,左上方的组合列表框中就有了所有信件的标题字段。用户可以从中选择一封信件,查看或者存储。然后可以断开连接。实例只介绍了接收邮件,提取信头标题字段的有关内容,能正确显示符合Rfc822规范的邮件。由于目前邮件结构非常复杂,限于篇幅,程序没有对收到的信件作进一步的分析,也没有对编码的信息进行译码,读者看到的是收信的原始信息,有兴趣的读者可以进一步扩展程序的功能,例如,对信件进行MIME格式分析,将附件提取出来。程序实现的技术要点是:1.运用Windows的消息驱动机制除了由MFC创建的应用程序类和对话框类以外,程序从CAsyncSocket类派生了自己的套接字类,并为它添加了OnConnect()、OnClose()和OnReceive()三个事件处理函数。程序的会话过程几乎完全是由FD_READ消息驱动的。建立连接后,服务器会返回信息,接到命令后,服务器也会返回信息。当信息到达客户端套接字的接收缓冲区时,会触发FD_READ消息,并自动执行OnReceive()函数。该函数接收服务器发来的信息,进行分析处理,然后再发送相应的命令。这命令又会引来服务器的响应,又会触发客户端的FD_READ消息。如此周而复始,完成POP会话的全过程。2.通过状态转换来控制会话命令的发布顺序程序定义了一个枚举类型STATE,并为套接字类定义了一个STATE类型的变量state,用来表示POP会话的实际状态。容易看出,枚举的成员符号是客户端向POP3服务器发送的命令。typedefenum{FIRST=0,USER,PASS,STAT,LIST,RETR,ENDRETR,DELE,GOON}STATE;STATEstate;当用户点击“连接”按钮与服务器建立TCP连接时,将state置为初值FIRST;然后,每当收到服务器的信息,一方面根据会话的当前状态作响应的分析处理,决定应当继续发送哪条命令,另一方面发出下一个命令以后,改变state的值,将它置为该命令的状态对应的值,这就实现了会话过程中的状态转换,并保证会话按照既定的顺序进行。读者可仔细分析mySock::AnalyzeMsg()函数。3.用结构向量来缓存信件信息首先程序定义了一个结构类型,用来缓存一封信件信息。typedefstruct{CStringtext;//存储信件的文本intmsgSize;//信件的大小intretrSize;//信件实际下载的大小,在下载过程中动态变化}MESSAGEPROP;然后为套接字类定义了一个向量型的成员变量,相当于一个数组,其成员是上述的结构。vectorMESSAGEPROPmsgs;在pop会话中,一次性地将信箱中所有信件的信息转入这个向量,然后可以查阅,存储到文件中,或者进行其他处理。7.6.2创建应用程序的过程1.使用MFCAppWizard创建应用程序框架工程名是pop3,应用程序的类型是基于对话框的,对话框的标题是“接收电子邮件客户端程序”,需要WindowsSockets的支持,其它部分接受系统的默认设置就可以。向导自动为应用程序创建了两个类:应用程序类:CPop3App,基类是CWinApp,对应的文件是pop3.h和pop3.cpp。对话框类:CPop3Dlg,基类是CDialog,对应的文件是pop3Dlg.h和pop3Dlg.cpp。2.为对话框添加控件在程序的主对话框界面中按照图7.6添加相应的可视控件对象,并按照表7.6修改控件的属性。表7.6对话框中的控件属性控件类型控件IDCaption静态文本statictextIDC_STATICpop3服务器地址静态文本statictextIDC_STATIC用户名静态文本statictextIDC_STATIC口令编辑框editboxIDC_EDIT_SERVER编辑框editboxIDC_EDIT_USER编辑框editboxIDC_EDIT_PASS复选框CheckBoxIDC_CHECK_DEL删除邮箱中的邮件多文本框RichEditBoxIDC_RICH_INFO组合选择框ComboBoxIDC_COMB_LIST(DropList型)命令按钮buttonIDC_BTN_CONN连接命令按钮buttonIDC_BTN_DISC断开命令按钮buttonIDCANCAL取消命令按钮buttonIDC_BTN_VIEW查看邮件命令按钮buttonIDC_BTN_SAVE存储3.定义控件的成员变量按照表7.7,用类向导(ClassWizard)为对话框中的控件对象定义相应的成员变量。表7.7控件对象的成员变量控件IDControlIDs变量名称MemberVariableName变量类别Category变量类型VariableTypeIDC_EDIT_SERVERm_strServerValueCStringIDC_EDIT_USERm_strUserValueCStringIDC_EDIT_PASSm_strPassValueCStringIDC_CHECK_DELm_bolDelValueBOOLIDC_COMB_LISTm_ctrListControlCComboBoxIDC_RICH_INFOm_InfoValueCStringm_ctrlnfoControlCRichEditCtrl4.为对话框中的控件对象添加事件响应函数按照表7.8,用类向导(ClassWizard)为对话框中的控件对象添加事件响应函数。表7.8对话框控件的事件响应函数控件类型对象标识ObjectID消息Message函数Memberfunctions命令按钮IDC_BTN_CONNBN_CLICKEDOnBtnConn命令按钮IDC_BTN_DISCBN_CLICKEDOnBtnDisc命令按钮IDC_BTN_VIEWBN_CLICKEDOnBtnView命令按钮IDC_BTN_SAVEBN_CLICKEDOnBtnSave5.为Cpop3Dlg类添加其它的成员voidDisp(LONGflag);//在不同的会话阶段显示不同的信息mySockpop3Socket;//套接字类对象实例6.创建从CAsyncSocket类继承的派生类为了能够捕获并响应socket事件,应创建用户自己的套接字类,可利用类向导添加。ClassType选择MFCClass,类名为mySock,基类是CAsyncSocket类,创建后对应的文件是mysock.h和mysock.cpp。在利用类向导为mysock类添加OnConnect,OnClose和OnReceive三个事件处理函数,并为它添加一般的成员函数和变量。可参看下一小节的程序代码。7.手工添加包含语句以及事件函数和成员函数的代码8.分阶段编译执行,进行测试7.6.3程序清单1.CPop3App应用程序类对应的文件pop3.h不动,在pop3.cpp的InitInstance()函数中添加一句初始化多文本框控件的函数。BOOLCPop3App::InitInstance(){if(!AfxSocketInit()){AfxMessageBox(IDP_SOCKETS_INIT_FAILED);returnFALSE;}AfxEnableControlContainer();//MFC自动创建的代码AfxInitRichEdit();//用户添加的...............}2.CPop3Dlg对话框类对应的文件(1)pop3Dlg.h包含文件.........#includemySock.h//添加套接字类的包含文件.........classCPop3Dlg:publicCDialog{//Constructionpublic:voidDisp(LONGflag);//在不同的会话阶段显示不同的信息mySockpop3Socket;//套接字类对象实例CPop3Dlg(CWnd*pParent=NULL);//standardconstructor...........(2)pop3Dlg.cpp实现文件#includestdafx.h#includepop3.h#includepop3Dlg.h#includemySock.h//手工添加的包含语句...................BOOLCPop3Dlg::OnInitDialog(){.............//TODO:Addextrainitializationhere//用户在这里添加控件成员变量的初始化代码m_strServer=_T(pop.sina.com.cn);//POP3服务器地址m_strUser=_T(example);//邮箱的用户名m_strPass=_T(123456);//口令m_bolDel=FALSE;//下载邮件后不删除m_Info=_T();//多文本框清空returnTRUE;//returnTRUEunlessyousetthefocustoacontrol}.................//以下是事件处理函数和其他成员函数的代码//当用户点击连接按钮时,执行此函数voidCPop3Dlg::OnBtnConn(){//设定pop3类的对话框指针变量,使之指向本对话框,以便传递信息pop3Socket.SetParent(this);UpdateData(TRUE);//取来用户在对话框中输入的数据pop3Socket.Create();//创建套接字对象的底层套接字pop3Socket.Connect((LPCSTR)m_strServer,110);//连接pop3服务器m_Info=;//多文本列表框清空UpdateData(FALSE);//更新用户界面}//当用户点击断开按钮时,执行此函数voidCPop3Dlg::OnBtnDisc(){pop3Socket.Close();}//当用户点击查看邮件按钮时,执行此函数voidCPop3Dlg::OnBtnView(){inti;i=m_ctrList.GetCurSel();//获得用户在组合框中的选择//获得并显示指定信件的基本属性及信件内容m_Info+=pop3Socket.GetMsgStuff(i);m_Info+=pop3Socket.GetMsgBody(i);}//在不同的情况下,向用户显示不同的信息voidCPop3Dlg::Disp(LONGflag){CStrings;switch(flag){caseS_CONNECT://已连接到服务器,显示信息s=已连接到+m_strServer+...\r\n;m_Info+=s;//禁用连接按钮GetDlgItem(IDC_BTN_CONN)-EnableWindow(FALSE);//启用断开按钮GetDlgItem(IDC_BTN_DISC)-EnableWindow(TRUE);//禁用查看邮件按钮GetDlgItem(IDC_BTN_VIEW)-EnableWindow(FALSE);break;caseS_RECEIVE://收到服务器发来的响应,显示它的内容m_Info+=pop3Socket.lastMsg;break;caseS_CLOSE://显示关闭连接的信息m_Info+=pop

1 / 46
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功