软件工程毕业设计论文基于POP3协议的电子邮件接收程序的设计

上传人:痛*** 文档编号:146355627 上传时间:2022-08-31 格式:DOC 页数:24 大小:225KB
收藏 版权申诉 举报 下载
软件工程毕业设计论文基于POP3协议的电子邮件接收程序的设计_第1页
第1页 / 共24页
软件工程毕业设计论文基于POP3协议的电子邮件接收程序的设计_第2页
第2页 / 共24页
软件工程毕业设计论文基于POP3协议的电子邮件接收程序的设计_第3页
第3页 / 共24页
资源描述:

《软件工程毕业设计论文基于POP3协议的电子邮件接收程序的设计》由会员分享,可在线阅读,更多相关《软件工程毕业设计论文基于POP3协议的电子邮件接收程序的设计(24页珍藏版)》请在装配图网上搜索。

1、南阳理工软件学院 毕业设计(论文)学 号: 068108210南阳理工学院毕业设计论文题 目基于POP3协议的电子邮件接收程序的设计学 院软件学院专 业软件工程班 级08级软件工程7班姓 名指导教师 2012年3月26日目 录摘 要11、引 言31.1 课程设计的内容31.2 课程设计的要求32、设计平台简介32.1 VC+33、邮件接收协议53.1 POP3简介54、设计原理84.1 POP3交互模型85、课程设计步骤95.1 函数构造95.2 接收邮件的步骤156、测试196.1 测试目的196.2 测试环境196.3 测试结果196.4 结果分析207、出现的问题及解决方法207.1设计

2、中出现的问题207.2解决方法20参考文献21摘 要电子邮件可以使人们有效地进行电子化的数据异地交换。Internet以电子邮件服务推动着人类的通信行为不断发展,邮件的接收系统。本论文以Visual C#为开发平台,利用Socket 套接字编程,实现了基于POP3协议的邮件接收程序,介绍了POP3协议的原理及电子邮件接收程序的设计与实现方法。随着Internet/Intranet的迅猛发展,电子邮件(E-Mail)已成为因特网上非常流行、非常方便的通信方式。电子邮件技术不断进步,邮件协议也不断发展。目前应用最广泛的电子邮件收件协议是POP3。本文采用微软最新的.NET技术,以Visual C#

3、为开发平台,利用Socket套接字编程开发了基于POP3协议的邮件接收程序,现对相关原理及具体设计进行讨论。关键词 课程设计;电子邮件;接收程序;POP3;Socket;Visual C#1、引 言随着Internet/Intranet的迅猛发展,电子邮件(E-Mail)已成为因特网上非常流行、非常方便的通信方式。电子邮件技术不断进步,邮件协议也不断发展。目前应用最广泛的电子邮件收件协议是POP3。本文采用微软最新的.NET技术,以Visual C#为开发平台,利用Socket套接字编程开发了基于POP3协议的邮件接收程序,现对相关原理及具体设计进行讨论。1.1 毕业设计的内容运用C#语言设计

4、一个邮件程序实现邮件的接收1.2 毕业设计的要求(1)按要求编写课程设计报告书,能正确阐述设计结果。(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。(3)学会文献检索的基本方法和综合运用文献的能力。(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。2、设计平台简介2.1 Visual C#(1)背景VC+是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用C+的一个开发平台。VC+是Windows平台上的C+编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。Windows下编程需要了解Win

5、dows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。Visual C#作为Visual Studio的一个组件,可以通过安装Visual Studio来获得。VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说VC+不是门语言,虽然它和C+之间有密切的关系,如果形象点比喻的话,可以把C+看作为一种“工业标准”,而VC+则是某种操作系统平台下的“厂商标准”,而“厂

6、商标准”是在遵循“工业标准”的前提下扩展而来的。 (2)基本模式Visual C#应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式。VC基于C,C+语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在 Windows平台无所不能。最大缺点是开发效率不高。 (3)适用范围【1】1、 VC主要是针对Windows系统,适合一些系统级的开发,可以方便实现一些底层的调用。在VC里边嵌入汇编语言很简单。 2、 VC主要用在驱动程序开发。 3、 VC执行效率高,当对系统性能要求很高的时候,可用VC开

7、发。 4、 VC主要适用于游戏开发。 5、 VC多用于单片机,工业控制等软件开发,如直接对I/O地址操作,就要用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(Post Office Protocol Version 3),即邮局办公协议

8、,该协议用于接收邮件的双方( 客户机、POP3服务器)进行通信。使用该协议,用户可以脱机阅读信件,而不必把客户机长期连接到网络上,以减少网络费用。POP3协议允许用户以一定的方式从保存邮件的服务器( 即POP3服务器)上取走自己的邮件。3.2 POP3协议工作原理【2】POP3提供了一种客户机/服务器脱机模型,客户机通过向服务器发送一些命令来完成相应的操作。客户机能够发送的命令与它所处的状态有关。协议中定义了三种状态:即确认状态(Authorization State)、处理状态(Transaction State)和更新状态(Update State)。在不同的状态下,客户机可以向服务器发送

9、的命令是有区别的,某些命令还会导致状态的转换。POP3交互过程中的常用命令和状态转换如图3.2.1和表3.2.1所示。图3.2.1 POP3的状态转换示意图表3.2.1 一些常用的POP3命令POP3服务器一般使用的是TCP的110号端口。当客户机与服务器建立TCP连接时,POP3服务器向客户机发回一个问候,交互过程即进入确认状态。此时,若客户机提供了自己的身份并成功确认,即由确认状态转入处理状态;在这个状态,用户可用相应的命令处理自己的邮件。在完成相应的处理过程后客户机发出QUIT命令,则进入更新状态;在此状态下,POP3服务器释放邮件资源并返回一个告别响应;最后关闭TCP连接。通过POP3

10、命令查询电子邮件时,客户机可以下载指定的邮件,然后对邮件进行删除或修改操作都无需与服务器进一步交互。客户机向服务器发送命令并等待响应,POP3命令采用命令行形式,用ASCII码表示。服务器响应是由一行或多行组成,其中,第一行以ASCII文本+OK, 或-ERR开始,分别指出相应的操作是成功还是失败。POP3命令包含一个大小写无关的关键字和一个或多个参量,所有的命令以( 回车换行符)作为其结束标志。关键字和参量必须是非控制符的ASCII码字符。关键字和参量之间,参量和参量之间由一个空格字符分隔开。关键字长不大于四个字符,每个参量最长可到40个字符。POP3响应包含一个状态标志和一个跟随其后的附加

11、信息。响应也用作为其结束标志。响应最长到512字节,其中包括协议定义了两个状态标志:正确(“ +OK”)和错误(“ -ERR”)。服务器用大写格式发送“ +OK”和“ -ERR”。如果响应是多行的,则每行以结束。当响应的所有行被发送后,接着发送多行响应的结束标志行,该行仅包含一个句点“.”和一个对【3】。4、设计原理4.1 POP3交互模型POP3接收者初始化连接POP3发送者READY“Hello”“Mail from”“Rcpt to”“Data”(reque st to get)OK接收数据QUIT断开连接该模型基本原理为:POP3接收者对POP3发送者进行初始化连接,发送者对接收者发送

12、询问指令“READY”,接收者则向发送者提交所要接收数据的要求,发送者做出回应,并发送数据。接收者则开始接收数据。发送者发送完数据后,提出断开请求,并断开连接。数据接收过程完成。5、课程设计步骤5.1 函数构造Windows Socket类是对Windows Socket API的封装,其中包括,CSocket和cAsyncSocket类,使用它们能够大大简化网络通信程序的编写。套接字的数据结构中包括下面五种数据:(1)本机主机端口:接收报文或数据报的进程。(2)本机主机地址:接收数据包的主机。(3)远地协议端口:目的进程或程序。(4)远地主机端口:目的主机。(5)协议:程序在网络上传输数据时

13、使用的协议。本应用程序就是使用Windows sockets编程设计的。在接收电子邮件时,必然需要涉及到连接服务器,接收数据,接收响应以及断开等一系列操作这就需要设计一个类来封装这些操作,在该应用程序中制定了一个CSMTP类。该类的定义如下所示,#define SMTP_PORT 25#define RESPONSE_BUFFER_SIZE 1024class CSMTPPublic;CSMTP(LPCTSTR szSMTPServerName,UINT nPort=SMTP_PORT);virtualCSMTP();void SetServerProperties(LPCTSTR szSMT

14、PserverName,UINT nPort=SMTP_PORT);CString GetlastError();UINT GetPort();BOOL Disconnect();BOOL Connect();virtual BOOL FormatMAilMessage(CMailMessage * msg);BOOL getMessage(CMailMessage * msg);CString GetserverHostName();Private;BOOL get_response(UINT response_expected);CString cook_body(CMailMessage

15、 * msg);CString m_serror;BOOL m_bconnected;UINT m_nPort;CString m_sSMTPServerHostName;CSocket m_wsSMTPServer;protected;virtuaI BOOL transmit_message(CMailMessage * msg);struct response_codeUINT nResponse;TCHAR * sMessage;enum eResponseGENERIC_SUCCESS = O,CONNECT_SUCCESS,DATA_SUCCESS,QUIT_SUCCESS,LAS

16、T_RESPONSE);TCHAR * response_buf;static response_code response_table;);其中,m_sError成员代表错误信息,m_bConnected表示是否建立连接;m_bPort表示SMTP服务器所使用的端口号,m_sSMTPserverHostName表示SMTP服务器的主机名(地址);m_waSMTPserver则为将与SMTP服务器建立连接的套接字对象;response_table表示由服务器返回的响应,而eResponse列举了所有可能出现的错误。因为电子邮件有其特殊的结构,不单简单地将其作为文本进行处理。例如,邮件必须在邮件

17、头和邮件体后发送,而在收信时,先需要解析邮件头和邮件体CMailMessage类是对邮件进行格式化编码的一个类【4】。CSMTP类的构造函数如下所示:CSMTP: ; CSMTP(LPCTSTR szSMTPServerName,UINT nPort)ASSERT(szSMTPServerName l = NULL);AfxSocketInit();m_sSMTPserverHostName = azSMTPServerName;m_nPort = nPort;m_bConnected = FALSE;m_sError = _T(“OK”);response_buf = NULL;在这里调用A

18、fxsocketInit函数以初始化Window Sockets类的使用,此外还验证其他类成员是否合法,或为其赋值。#include mySock.h /添加套接字类的包含文件.class CPop3Dlg : public CDialog/ Constructionpublic:void Disp(LONG flag); /在不同的会话阶段显示不同的信息mySock pop3Socket; /套接字类对象实例CPop3Dlg(CWnd* pParent = NULL); / standard constructor.(2)pop3Dlg.cpp实现文件#include stdafx.h#in

19、clude pop3.h#include pop3Dlg.h#include mySock.h /手工添加的包含语句.BOOL CPop3Dlg:OnInitDialog()./ TODO: Add extra initialization here/用户在这里添加控件成员变量的初始化代码m_strServer = _T(); /POP3服务器地址m_strUser = _T(example); /邮箱的用户名m_strPass = _T(123456); /口令m_bolDel = FALSE; /下载邮件后不删除m_Info = _T(); /多文本框清空return TRUE; / re

20、turn TRUE unless you set the focus to a control./以下是事件处理函数和其他成员函数的代码/当用户点击连接按钮时,执行此函数void CPop3Dlg:OnBtnConn() /设定pop3类的对话框指针变量,使之指向本对话框,以便传递信息pop3Socket.SetParent(this); UpdateData(TRUE); /取来用户在对话框中输入的数据pop3Socket.Create(); /创建套接字对象的底层套接字pop3Socket.Connect(LPCSTR)m_strServer,110); /连接pop3服务器m_Info

21、= ; /多文本列表框清空UpdateData(FALSE); /更新用户界面/当用户点击断开按钮时,执行此函数void CPop3Dlg:OnBtnDisc() pop3Socket.Close();/当用户点击查看邮件按钮时,执行此函数void CPop3Dlg:OnBtnView() int i;i = m_ctrList.GetCurSel(); /获得用户在组合框中的选择/获得并显示指定信件的基本属性及信件内容m_Info += pop3Socket.GetMsgStuff(i);m_Info += pop3Socket.GetMsgBody(i);/在不同的情况下,向用户显示不同的

22、信息void CPop3Dlg:Disp(LONG flag)CString s;switch(flag)case S_CONNECT: /已连接到服务器,显示信息s = 已连接到+m_strServer+.rn;m_Info+=s;/禁用连接按钮GetDlgItem(IDC_BTN_CONN)-EnableWindow(FALSE);/启用断开按钮GetDlgItem(IDC_BTN_DISC)-EnableWindow(TRUE);/禁用查看邮件按钮GetDlgItem(IDC_BTN_VIEW)-EnableWindow(FALSE);break;case S_RECEIVE:/收到服务

23、器发来的响应,显示它的内容m_Info+=pop3Socket.lastMsg;break; case S_CLOSE: /显示关闭连接的信息m_Info+=pop3Socket.error;s = 连接已经关闭rn;m_Info+=s; /启用连接按钮GetDlgItem(IDC_BTN_CONN)-EnableWindow(TRUE);/禁用断开按钮GetDlgItem(IDC_BTN_DISC)-EnableWindow(FALSE); break;case S_GETNUM: /已经知道了邮箱中信件的总数s.Format(邮箱中共有 %d 封信rn,pop3Socket.numMsg)

24、;m_Info+=s;break;case S_GETSIZE: /显示信件的大小s.Format(信箱中信件大小为:%d字节rn,pop3Socket.sizeMsg);m_Info+=s; break;case S_ENDRETR: /所有信件已下载完毕,显示信息s.Format(共下载了 %d 封信件rn,pop3Socket.msgs.size();m_Info+=s;/如果有信件下载,启用查看邮件按钮if(pop3Socket.msgs.size()0)GetDlgItem(IDC_BTN_VIEW)-EnableWindow(TRUE);break;UpdateData(FALSE

25、); /更新用户界面/当点击“存储”按钮时,执行此函数。void CPop3Dlg:OnBtnSave() int i;CString s;i = m_ctrList.GetCurSel();/获得指定信件的基本属性及信件内容s = pop3Socket.GetMsgStuff(i);s += pop3Socket.GetMsgBody(i);CFileDialog dlg(FALSE);if(dlg.DoModal()=IDOK)CFile file(dlg.GetPathName(),CFile:modeCreate | CFile:modeWrite | CFile:typeBinary

26、);file.Write(LPCSTR)s,s.GetLength();file.Close();5.2 接收邮件的步骤(1). 建立与服务器的连接。具体工作由Connect函数完成。部分Connect函数代码如下所示:BOOL CSMTP:; Connect() if(! m_wsSMTPServerCreate()m_sError=_T(“无法创建套接字!”);delete response_buf;response_buf = NULL;return FALSE;)if(! M_wsSMTPserverConnect(GetServerHostName(),GetPort()m_sErr

27、or = _T(“无法连接到服务器”);M_sSMTPserverClose();delete response_but;response-buf = NULL;return FALSEI;if(! Get_response(CONNECT_SUCCESS)m_sError = _T(“服务器投有响应”);M_wsSMTPServerClose();delete response_buf;response_buf = NULL;return FALSE;)sHelloFormat(_T(“HELOsrn”),local_host);m_wsSMTPServerGet(LPCTSTR)sHell

28、o,sHelloGetlength();(2)建立连接后从服务器接收邮件。这个工作由GetMessage函数完成。GetMessage函数代码如下:BOOL CSMTP:GetMessage(CMailMessage * msg)if(! m_bConnected)m_sError = _T(“必须首先创建连接!”);return FALSE;)if(FormatMailMessage(msg)=FALSE)return FALSE;)if(transmit_message(msg)=FALSE)return FALSE;)return TRUE;)前面介绍过电子邮件有其特殊的格式,在这里Fo

29、rmatMailMessage函数就是用于格式化邮件信息的。Transmit_message函数将邮件进到服务器上。部分Transmit_message函数代码如下所示:BOOL CSMTP:transmit_message(CMailMessage * msg)sFromFormat_T(“MAIL From:rn”),(LPCTSTR)msg一m_sFrom);M_wsSMTPServerGet(LPCTSTR)sFrom,sFromGctLength();if(! Get_response(GENERIC_SUCCESS)return FALSEl;for(int i=O;iGetNum

30、Recipients(); i+)msg一GetRecipient(sEmail,sTemp,i);sToFormat(_T(“RCPT TO;rn”),(LPCTSTR)sEmail);m_wsSMTPServerGet( (LPCTSTR)sTemp,sTempGetLength();Get_response(GENERIC_SUCCESS);)sTemp=_T(“DATArn”);m_wsSMTPServerGet(LPCTSTR)sTemp,sTempGetLength();if(! Get_response(DATA_SUCCESS)return FALSE;m_wsSMTPserv

31、erGet(LPCTSTR)msg一m_sHeader,g一m_sHeaderGetLength();sTemp = cook_body(msg);m_wsSMTPServerGet(LPCTSTR)sTemp,sTempGetLength();sTemp = _T(“rn.rn”);m_wsSMTPServerGet(LPCTSTR)sTemp,sTemp.GetLength();if! Get_response(GENERIC_SUCCESS)return FALSE;Return TRUE;在此函数中,首先发送MAIL命令,通知服务器收信人的邮箱地址。然后发进RCPT命令,通知服务器发信

32、人的邮箱地址。需要注意的是,在有多个发信人时,必须为每个发信人都发送一次RCPT命令,通知服务器将要进行邮件数据的传输。此后,分别将邮件头和邮件体从服务器上接收下来。这里需要注意一点:当邮件数据接收完毕后,需要额外发送一个“回车换行回车/换行”信号,以通知邮件数据传输完毕(3). 当邮件接收完毕后,一般不需要保持与SMTP服务器的连接,而断开的工作由Disconnect函数完成。Disconnect代码如下:BOOL CSMTP: : Disconnect()BOOL ret;if(! m_bConnected)return TRUE;CString sQuit = _T(“QUITrn”);

33、m_wsSMTPserversend(LPCTSTR)sQuit,sQuitGetLength();Ret = get_response(QUIT_SUCCESS);m_wsSMTPServerClose();if(response_buf ! = NULL)deleteresponse_buf;Response_buf = NULL;M_bConnected = FALSE;return ret;首先向SMTP服务器发送QUIT命令,关闭邮件传输会话;然后调用套接字对象的Close函数关闭套接字,最后将类对象所占用的内存释放。6、测试6.1 测试目的检测邮件接收程序是否能接收邮件。6.2 测

34、试环境Windows XP6.3 测试结果与服务器取得联系之后,对目标邮件进行接收,证明邮件可以正常接收,具体的接收界面如下图6.3.1所示:图6.3.1接收电子邮件程序主界面6.4 结果分析邮件接收成功,本程序实现邮件接收功能。7、出现的问题及解决方法7.1设计中出现的问题(1)设计初没有接触尝试过对相似系统的设计;(2)设计时编写程式不是很顺利;(3)调试程序是出现很多错误;(4)软件界面过于简洁。7.2解决方法(1)找来相关资料,经过一番研究,对该系统有了较清晰的认识,才开始着手于正式设计。(2)经过一段时间的研究,找到了可行的函数模式。(3)不断地耐心调试,直至出现满意的结果。(4)经过相应的修改,终于达到了较好的效果。参考文献1 Al Stevens,Clayton Walnum 著,林丽闺,别红霞等译.标准C+宝典,2001. 北京:电子工业出版社.2朱岩,高伟 编著.标准Windows程序设计-Visual C+与MFC及Win32 API的应用,1997.北京:人民邮电出版社.3李博轩等 著. Visual C+6.0 网络及 Internet开发指南M,2000.北京:清华大学出版社.4邓亚平 著.计算机网络M,1999.北京:北京邮电出版社.指导教师评 语课外设计报告成 绩指导教师签 字年 月 日22II

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!