《基于POP3协议的电子邮件接收程序的设计论文.docx》由会员分享,可在线阅读,更多相关《基于POP3协议的电子邮件接收程序的设计论文.docx(17页珍藏版)》请在课桌文档上搜索。
1、学号:068108210南阳理工当配毕业设计论文目摘要I1,引1.1内容11.2要求22、设 介2题目基于POP3协议的电子邮件接收程序的设计2n20年 Q 月 26 日学院软件学院专业软件工程班级08级软件工程7班姓名王志杰指导教师刘凯录言1课程设计的课程设计的计平台简2JVC+23、邮件接收协议33.1 POP3简介34、设计原理44.1 POP3交互模型45、课程设计步骤55.1 函数构造55.2 接收邮件的步骤116、测试146.1 测试目的146.2 测试环境146.3 测试结果146.4 结果分析147、出现的问题及解决方法147.1 设计中出现的问题147.2 解决方法15参考文
2、献15摘要电子邮件可以使人们有效地进行电子化的数据异地交换。Internet以电子邮件效劳推动着人类的通信行为不断开展,邮件的接收系统。本论文以VisualC#为开发平台,利用SoCket套接字编程,实现了基于POP3协议的邮件接收程序,介绍了POP3协议的原理及电子邮件接收程序的设计与实现方法。随着Internet/Intranet的迅猛开展,电子邮件(E-Mail)已成为因特网上非常流行、非常方便的通信方式。电子邮件技术不断进步,邮件协议也不断开展。目前应用最广泛的电子邮件收件协议是POP3。本文采用微软最新的.NET技术,以ViSUalC#为开发平台,利用SOCket套接字编程开发了基于
3、POP3协议的邮件接收程序,现对相关原理及具体设计进行讨论。关健词课程设计;电子邮件;接收程序;POP3:Socket;VisualC#1.引言随着InternetYIntranel的迅猛开展,电子邮件(E-Mail)已成为因特网上非常流行、非常方便的通信方式。电子邮件技术不断进步,邮件协议也不断开展。目前应用最广泛的电子邮件收件协议是POP3。本文采用微软最新的.NET技术,以ViSUalC#为开发平台,利用SoCket套接字编程开发了基于POP3协议的邮件接收程序,现对相关原理及具体设计进行讨论。1.1 毕业设计的内容运用c#语言设计一个邮件程序实现邮件的接收1.2 毕业设计的要求(1)按
4、要求编写课程设计报告书,能正确阐述设计结果。(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。(3)学会文献检索的根本方法和综合运用文献的能力。(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。2、设计平台简介2.1VisualC#(1)背景VC+是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用C+的一个开发平台。VC+是Windows平台上的C+编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL,COM等的知识,难度比较大。WindoWS下编程需要了解WindOWS的消息机制以及回调(callback)函数的原理;M
5、FC是Win32AP1的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其根本原理等等。VisualC#作为ViSUalStUdiO的一个组件,可以通过安装ViSUalStUdio来获得。VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说VC+不是门语言,虽然它和C+之间有密切的关系,如果形象点比喻的话,可以把C+看作为一种工业标准,而VC+那么是某种操作系统平台下的厂商标准,而厂商标准是在遵循工业标准的前提下扩展而来的。(2)根本模式VisualC#应
6、用程序的开发主要有两种模式,一种是WlNAPl方式,另一种那么是MFC方式。VC基于C,C+语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在Windows平台无所不能。最大缺点是开发效率不高。(3)适用范围1、VC主要是针对WindOWS系统,适合一些系统级的开发,可以方便实现一些底层的调用。在VC里边嵌入汇编语言很简单。2、VC主要用在驱动程序开发。3、VC执行效率高,当对系统性能要求很高的时候,可用VC开发。4、VC主要适用于游戏开发。5、VC多用于单片机,工业控制等软件开发,如直接对I/O地址操作,就要用
7、C+。6、VC适用开发高效,短小,轻量级的CoM组件,DLL。比方WEB上的控件。7、VC可以开发优秀的基于通信的程序。8、VC可以开发高效灵活的文件操作程序。9、VC可以开发灵活高效的数据库操作程序。10、VC是编CAD软件的唯一选择。包括AUTOCAD,UG的二次开发。11、VC在多线程、网络通信、分布应用方面,VC+有不可比较的优势。3、邮件接收协议3.1 POP3简介POP3(PostOfficeProtocolVersion3),即邮局办公协议,该协议用于接收邮件的双方(客户机、POP3效劳器)进行通信。使用该协议,用户可以脱机阅读信件,而不必把客户机长期连接到网络上,以减少网络费用
8、。POP3协议允许用户以一定的方式从保存邮件的效劳器(即POP3效劳器)上取走自己的邮件。3.2 POP3协议工作原理POP3提供了一种客户机/效劳器脱机模型,客户机通过向效劳器发送一些命令来完成相应的操作。客户机能够发送的命令与它所处的状态有关。协议中定义了三种状态:即确认状态(AuthorizationState)、处理状态(TransactionState)和更新状态(UpdateState)0在不同的状态下,客户机可以向效劳器发送的命令是有区别的,某些命令还会导致状态的转换。POP3交互过程中的常用命令和状态转换如图和表3.2.1所示。图3.2.1POP3的状态转换示意图表一些常用的P
9、OP3命令POP3效劳器一般使用的是TCP的110号端口。当客户机与效劳器建立TCP连接时,POP3效劳器向客户机发回一个问候,交互过程即进入确认状态。此时,假设客户机提供了自己的身份并成功确认,即由确认状态转入处理状态;在这个状态,用户可用相应的命令处理自己的邮件。在完成相应的处理过程后客户机发出QUrr命令,那么进入更新状态;在此状态下,POP3效劳器释放邮件资源并返回一个辞别响应;最后关闭TCP连接。通过POP3命令查询电子邮件时,客户机可以下载指定的邮件,然后对邮件进行删除或修改操作都无需与效劳器进一步交互。客户机向效劳器发送命令并等待响应,POP3命令采用命令行形式,用ASCIl码表
10、示。效劳器响应是由一行或多行组成,其中,第一行以ASCIl文本+OK,或-ERR开始,分别指出相应的操作是成功还是失败。POP3命令包含一个大小写无关的关键字和一个或多个参量,所有的命令以KRXLFX回车换行符)作为其结束标志。关键字和参量必须是非控制符的ASCll码字符。关键字和参量之间,参量和参量之间由一个空格字符分隔开。关键字长不大于四个字符,每个参量最长可到40个字符。POP3响应包含一个状态标志和一个跟随其后的附加信息。响应也用CRXLF作为其结束标志。响应最长到512字节,其中包括CRXLF协议定义了两个状态标志:正确L+OKff)和错误(-ERR)。效劳器用大写格式发送+0K和-
11、ERR。如果响应是多行的,那么每行以CRXLF结束。当响应的所有行被发送后,接着发送多行响应的结束标志行,该行仅包含一个句点和一个CRXLF对f。4、设计原理4.1 POP3交互模型POP3发送者初始化连接“Hello“Mail from Rcpt to 44Data(reque st to get)接收数据断开连接该模型根本凰POP3接收者化连接,发送者对接收者发送询问指令read!-ETX七I川-4IYizXQi=IJAL乂JymT艾TxKM的要求,发送者做出回应,并发送数据。接收者那么开始接收数据。发送者发送完数据后,提出断开请求,并断开连接。数据接收过程完成。5、课程设计步骤5.1 函
12、数构造WindoWSSoCket类是对WindoWSSocketAPl的封装,其中包括,CSOCket和CASynCSOCket类,使用它们能够大大简化网络通信程序的编写。套接字的数据结构中包括下面五种数据:(1)本机主机端口:接收报文或数据报的进程。(2)本机主机地址:接收数据包的主机。(3)远地协议端口:目的进程或程序。远地主机端口:目的主机。(5)协议:程序在网络上传输数据时使用的协议。本应用程序就是使用Windowssockets编程设计的。在接收电子邮件时,必然需要涉及到连接效劳器,接收数据,接收响应以及断开等一系列操作.这就需要设计一个类来封装这些操作,在该应用程序中制定了一个CS
13、MTP类。该类的定义如下所示,defineSMTP_PORT25AdefineRESPONSEBUFFERSIZE1024classCSMTPPublic;CSMTP(LPCTSTRSzSMTPServerName,UINTnPort=SMTP_PORT);virtualCSMTP();voidSetServerProperties(LPCTSTRSzSMTPserverName,UINTnPort=SMTP_PORT);CStringGetlastErrorO:UINTGetPort();BOOLDisconnectO;BOOLConnect();virtualBOOLFormatMAilM
14、essage(CMaiIMessage*msg);BOOLgetMessage(CMaiIMessage*msg);CStringGetserverHostName();Private;BOOLgetresponse(UINTresponseexpected);CStringcook_body(CMailMessage*msg);CStringm_serror;BOOLmbconnected;UINTm_nPort;CStringm_sSMTPServerHostName;CSocketmWsSMTPServer;protected;virtualBOOLtransmit_message(CM
15、ailMessage*msg);structresponse_codeUINTnResponse;TCHAR*sMcssage;enumeResponseGENERIC-SUCCESS=O,CONNECTSUCCESS,DATA_SUCCESS,QUIT_SUCCESS,jSTresponse);TCHAR*response_buf:staticresponsecoderesponsetable;);其中,m_sError成员代表错误信息,m_bConnected表示是否建立连接;m_bPort表示SMTP效劳器所使用的端口号,m_sSMTPserverHostName表示SMTP效劳器的主机
16、名(地址);mWaSMTPSerVer那么为将与SMTP效劳器建立连接的套接字对象;responsetable表示由效劳器返回的响应,而eResponse列举了所有可能出现的错误。因为电子邮件有其特殊的结构,不单简单地将其作为文本进行处理。例如,邮件必须在邮件头和邮件体后发送,而在收信时,先需要解析邮件头和邮件体邮件进行格式化编码的一个类F。CSMTP类的构造函数如下所示:CSMTP:;CSMTP(LPCTSTRSzSMTPServerName,UINTnPort)ASSERT(SzSMTPServerName1=NULL);AfxSocketInit();m_sSMTPserverHostN
17、ame=azSMTPServerName;mnPort=nPort;m_bConnected=FALSE;m_sError=_T(“OK);responsebuf=NULL;在这里调用AfXSoCketlnit函数以初始化WindOWSOCketS类的使用,员是否合法,或为其赋值。SincludemySock.h添加套接字类的包含文件CMai IMeSSage 类是对此外还验证其他类成classCPo3Dlg:publicCDialog/Constructionpublic:voidDisp(LONGflag);在不同的会话阶段显示不同的信息mySockpop3Socket;套接字类对象实例C
18、Po3Dlg(CWnd*Parent=NULL);/standardconstructor2. )pop3Dlg.cpp实现文件Wincludestdafx.hincludepop3.hWincludepop3DlghWincludemySock.h手工添加的包含语句BOOLCPop3Dlg:OnInitDialog()/TODO:Addextrainitializationhere用户在这里添加控件成员变量的初始化代码InstrServer=_T(pop.sina);POP3效劳器地址m_strUser=_T(example);邮箱的用户名strPass=T(123456);口令m_bolD
19、el=FALSE;下载邮件后不删除mjnfo=_T():多文本框清空returnTRUE;/returnTRUEunlessyousetthefocustoacontrol以下是事件处理函数和其他成员函数的代码当用户点击连接按钮时,执行此函数voidCPop3Dlg:OnBtnConnO设定pop3类的对话框指针变量,使之指向本对话框,以便传递信息pop3Socket.SetParent(this);UpdateData(TRUE);取来用户在对话框中输入的数据pop3Socket.Create();创立套接字对象的底层套接字pop3Socket.Connect(LPCSTR)m_strSer
20、ver,110);连接pop3效劳器mInfo=;多文本列表框清空UpdateData(FALSE);更新用户界面当用户点击断开按钮时,执行此函数voidCPop3Dlg:OnBtnDisc()pop3Socket.Close();当用户点击查看邮件按钮时,执行此函数voidCPop3DIg:OnBtnViewOinti;i=m_ctrList.GetCurSel():获得用户在组合框中的选择获得并显示指定信件的根本属性及信件内容mInfo+=pop3Socket.GetMsgStuff(I);mlnfo+=pop3Socket.GetMsgBodyCi);)在不同的情况下,向用户显示不同的信
21、息voidCPop3D1g:Disp(LONGflag)CStrings;switch(flag)caseSCONNECT:己连接到效劳器,显示信息s=已连接到+m_strServer+.rn;m_Info+=s;禁用连接按钮GetDlgItem(IDC_BTN_CONN)-EnableWindow(FALSE);启用断开按钮GetDlgItemdDCBTNDISC)-EnabIeWindow(TRUE);禁用查看邮件按钮GetDlgItem(IDC_BTN_VIEW)-EnableWindow(FALSE);break;caseS_RECEIVE:收到效劳器发来的响应,显示它的内容m_Inf
22、o+=pop3Socket.IastMsg;break;caseS_CLOSE:显示关闭连接的信息m_Info+=pop3Socket.error;S=连接己经关闭rn;mlnfo+=s;启用连接按钮GetDlgItemdDCBTNCONN)-EnabIeWindow(TRUE):禁用断开按钮GetDlgItem(IDC_BTN_DISC)-EnableWindow(FALSE);break;caseS,GETNUM:已经知道了邮箱中信件的总数5. Format(邮箱中共有%d封信rn,pop3Socket.numMsg);m_Info+=s;break;caseS,GETSIZE:显示信件的
23、大小6. Format(信箱中信件大小为:d字节rn,pop3Socket.sizeMsg);m_Info+=s;break;caseS_ENDRETR:所有信件已下载完毕,显示信息7. Format(共下载了%d封信件rn,pop3Socket.msgs,size();mInfo+=s;如果有信件下载,启用查看邮件按钮if(pop3Socket.msgs,size()0)GetDlgItemdDCBTNVIEW)-EnabIeWindow(TRUE);break;UpdateData(FALSE);更新用户界面)当点击“存储按钮时,执行此函数。voidCPop3Dlg:OnBtnSaveOi
24、nt1;CStrings;i=m_ctrList.GetCurSel();获得指定信件的根本属性及信件内容s=pop3Socket.GetMsgStuff(I);S+=pop3Socket.GetMsgBody(I);CFileDialogdig(FALSE);if(dig.DoModal()=IDOK)CFilefile(dig.GetPathNameO,CFile:IiiodeCreateCFiIe:mOdeWriteCFile:ItypeBinary):file.Write(LPCSTR)s,s.GetLengthO);file,Close。;)5.2 接收邮件的步骤(1) .建立与效劳
25、器的连接。具体工作由ConneCt函数完成。局部ConneCt函数代码如下所示:BOOLCSMTP:;Connect()Iif(!mWsSMTPServer.Create()m_sError=_T(“无法创立套接字!);deleteresponse_buf;responsebuf=NULL;returnFALSE;)if(!M_wsSMTPserver.Connect(GetServerHostNameO,GetPort()(m_sError=_T(无法连接到效劳器);M_sSMTPserver.CloseO;deleteresponsebut;response-buf=NULL;Peturn
26、FALSEI;if(!Getresponse(CONNECTSUCCESS)(m_sError=_T(效劳器投有响应);M_wsSMTPServer.CloseO;deleteresponsebuf;response_buf=NULL;returnFALSE:)SHello.Format(T(HELO%srn),localhost);m_wsSMTPServer.Get(LPCTSTR)sllello,sHello.GetlengthO);(2) .建立连接后从效劳器接收邮件。这个工作由GetMessage函数完成。GetMessage函数代码如下:BOOLCSMTP:GetMessage(C
27、MailMessage*msg)(if(!m_bConnected)msError=T(必须首先创立连接!);returnFALSE;)if(FormatMailMessage(msg)=FALSE)returnFALSE;)if(transmit_message(msg)=FALSE)returnFALSE;)returnTRUE;)前面介绍过电子邮件有其特殊的格式,在这里FormatMaiIMessage函数就是用于格式化邮件信息的。Transmit_message函数将邮件进到效劳器上。局部Transmit_message函数代码如下所示:BOOLCSMTP:transmit_messa
28、ge(CMailMessage*msg)sFrom.FormatT(MAILFrom:rn),(LPCTSTr)msg一m_sFrom);M_wsSMTPServer.Get(LPCTSTR)sFrom,sFrom.GctLength0);if(!Get_response(GENERIC_SUCCESS)returnFALSEl;for(inti=0;iGetNumRecipients();i)msg一GetRecipient(sEmaiLsTemp,i);sTo.FormatGTCfcRCPTT0jrn),(LPCTSTR)sEmail);m_wsSMTPServer.Get(LPCTSTR
29、)sTemp,sTempGetLengthO);Getresponse(GENERICSUCCESS);)sTemp=_TCDATArn);m_wsSMTPServer.Get(LPCTSTR)sTemsTemp.GetLength();if(!Get_response(DATA,SUCCESS)returnFALSE;m_wsSMTPserver.Get(LPCTSTR)msg一m_sHeaderg一m_sHeader.GetLengthO);sTemp=cookbody(msg);m_wsSMTPServer.Get(LPCTSTR)sTemp,sTemp.GetLengthO);sTem
30、p=T(rn.rn);m_wsSMTPServer.Get(LPCTSTR)sTemp,sTcmp.GetLengthO);if!Getresponse(GENERICSUCCESS)returnFALSE;ReturnTRUE;在此函数中,首先发送MAIL命令,通知效劳器收信人的邮箱地址。然后发进RCPT命令,通知效劳器发信人的邮箱地址。需要注意的是,在有多个发信人时,必须为每个发信人都发送一次RCPT命令,通知效劳器将要进行邮件数据的传输。此后,分别将邮件头和邮件体从效劳器上接收下来。这里需要注意一点:当邮件数据接收完毕后,需要额外发送一个“回车/换行回车/换行信号,以通知邮件数据传输完毕
31、.(3) .当邮件接收完毕后,一般不需要保持与SMTP效劳器的连接,而断开的工作由Disconnect函数完成。DiSConneCt代码如下:BOOLCSMTP:Disconnect()BOOLret;if(!mbConnected)returnTRUE;CStringsQuit=_T(“QUITrn);mWsSMTPserver.send(LPCTSTR)sQuit,sQuit.GetLengthO);Ret=get_response(QUIT_SUCCESS);mWsSMTPServer.Close0;if(response_buf!=NULL)deleteresponse_buf;Res
32、ponse_buf=NULL:M_bConnected=FALSE;returnret;首先向SMTP效劳器发送QUIT命令,关闭邮件传输会话;然后调用套接字对象的Close函数关闭套接字,最后将类对象所占用的内存释放。6、测试6.1 测试目的检测邮件接收程序是否能接收邮件。6.2 测试环境WindowsXP6.3 测试结果与效劳器取得联系之后,对目标邮件进行接收,证明邮件可以正常接收,具体的接收界面如下列图所示:图接收电子邮件程序主界面6.4 结果分析邮件接收成功,本程序实现邮件接收功能。7、出现的问题及解决方法7.1 设计中出现的问题(1)设计初没有接触尝试过对相似系统的设计;(2)设计时
33、编写程式不是很顺利;(3)调试程序是出现很多错误;(4)软件界面过于简洁。7.2 解决方法(1)找来相关资料,经过一番研究,对该系统有了较清晰的认识,才开始着手于正式设计。(2)经过一段时间的研究,找到了可行的函数模式。(3)不断地耐心调试,直至出现满意的结果。(4)经过相应的修改,终于到达了较好的效果。参考文献1 AlStevens,ClaytonWalnum著,林丽闺,别红霞等译.标准C+宝典,2001.北京:电子工业出版社,2朱岩,高伟编著.标准Windows程序设计-ViSualC+与MFC及Win32API的应用,1997.北京:人民邮电出版社.3李博轩等著.VisualC+6.0网络及Internet开发指南M,2000.北京:清华大学出版社,4邓亚平著.计算机网络M,1999.北京:北京邮电出版社.指导教师评语课外设计报告成绩指导教师签字年月日