#基于POP3协议的电子邮件接收程序的设计论文_第1页
#基于POP3协议的电子邮件接收程序的设计论文_第2页
#基于POP3协议的电子邮件接收程序的设计论文_第3页
#基于POP3协议的电子邮件接收程序的设计论文_第4页
#基于POP3协议的电子邮件接收程序的设计论文_第5页
免费预览已结束,剩余29页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学 号:068108210南阳理工学院毕业设计论文题 目基于POP3协议的电子邮件接收程序的设计2012 年3-1-26B学院软件学院专业软件工程班 级08级软件工程7班姓名 王志杰指导教师刘凯1、1.1课程设计的内容 21.2课程设计的要求 22、设计平台简介22.1 VC+ 23、邮件接收协议43.1 POP3 简介44、设计原理74.1 POP3交耳槿型75、课程设计步骤85.1 函数构造85.2 接收邮件的步骤 146、狈U试 186.1测试目的 18南阳理工软件学院毕业设计(论文)6.2 测试环境186.3 测试结果186.4 结果分析197、出现的问题及解决方法 197.1 设计中

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

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

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

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

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

7、对系统性能要求很高的时候,可用 VC开发。4、VC主要适用于游戏开发。5、VC多用于单片机,工业控制等软件开发,如直接对I/O地址操作,就要用C+-K6、VC适用开发高效,短小,轻量级的 COMfi件,DLL。比如WEBt的控件。7、VC可以开发优秀的基于通信的程序。8、VC可以开发高效灵活的文件操作程序。9、VC可以开发灵活高效的数据库操作程序。10、VC是编CADa件的唯一选择。包括 AUTOCADUG的二次开发。11、VC在多线程、网络通信、分布使用方面,VC+后不可比拟的优势。3南阳理工软件学院毕业设计(论文)3、邮件接收协议3.1 POP3 简介POP3(Post Office Pr

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

9、tate )。在不同的状态下,客户机可以向服务器发送的命 令是有区别的,某些命令还会导致状态的转换。POP3交互过程中的常用命令和状态转换如图3.2.1和表3.2.1所示。#南阳理工软件学院毕业设计(论文)验证失败 认态 确状:连接;超时'超时或QUIT命令操作超时>初始化连接和服务器问侯I1USER :-1帐号| QUIT: T1终止会话PASS : 密码用 LISTRETR,DELE.NOOP'RSET.TOP、UIDL等命令进行邮件操作QUIT命令:进入更新状态注销并关闭连接3.2.1 POP3的状态转换示意图5南阳理工软件学院毕业设计(论文)命令参数状态说 明US

10、ERI. srrName确认导致状态转移PASSPasVi or<l确认A POPName , Dist确认Digest是MD5消息摘星STATNolle处理返回邮箱的统计资料U【DLMsg#处理返回邮件的唯一标识符LISTMsg#处理返向邮件的数最和大小RETRMsg#处理返回邮件的全部文本DELE处理将邮件标记为删除KSETNone处理取置删除标记TOPMsg#处理返回邮件前n行的内容NOOPNone处理返回一个肯定的响应QUITNone更新退出会话,关闭连接表3.2.1 一些常用的POP瑜令POP3服务器一般使用的是TCP的110号端口。当客户机和服务器建立 TCP 连接时,pop

11、:®务器向客户机发回一个问候,交互过程即进入确认状态。此时, 若客户机提供了自己的身份并成功确认,即由确认状态转入处理状态;在这个状态,用户可用相应的命令处理自己的邮件。 在完成相应的处理过程后客户机发出 QUIT命令,则进入更新状态;在此状态下, POP3®务器释放邮件资源并返回一 个告别响应;最后关闭TCR4接。通过POPm令查询电子邮件时,客户机可以下载指定的邮件,然后对邮件 进行删除或修改操作都无需和服务器进一步交互。客户机向服务器发送命令并等待响应,POP3命令采用命令行形式,用 ASCII码表示。服务器响应是由一行或 多行组成,其中,第一行以ASCII文本+OK

12、,或-ERR开始,分别指出相应的操作 是成功还是失败。POP3命令包含一个大小写无关的关键字和一个或多个参量,所有的命令以 <CR><LF>回车换行符)作为其结束标志。关键字和参量必须是非控制符的ASCII 码字符。关键字和参量之间,参量和参量之间由一个空格字符分隔开。关键字长不大于四个字符,每个参量最长可到 40个字符。南阳理工软件学院毕业设计(论文)POP3向应包含一个状态标志和一个跟随其后的附加信息。响应也用<CR><LF> 作为其结束标志。响应最长到512字节,其中包括<CR><LF协议定义了两个状态 标志:正确(“ +

13、OK”)和错误(" -ERR”)o服务器用大写格式发送“ +OK” 和“ -ERR”。如果响应是多行的,则每行以<CR><LF结束。当响应的所有行被 发送后,接着发送多行响应的结束标志行,该行仅包含一个句点”.”和一个<CR><LF>。4、设计原理4.1 POP3交互模型7断开连接初始化连接该模型基本原理为:POP3RUPOP3POP接送者进行初始化连接,发送者对 接收者发送询问指令' READY,接收者则向发送者提交所要接收.据的要求,送者做出回应,并发送数据。接收者则开始接收数据。发送者发送完数据后,提 出断开请求,并断开连接。数

14、据接收过程完成。南阳理工软件学院毕业设计(论文)5、课程设计步骤5.1函数构造Windows Socket类是对 Windows Socket API 的封装,其中包括,CSocket和 cAsyncSocket类,使用它们能够大大简化网络通信程序的编写。套接字的数据结 构中包括下面五种数据:(1)本机主机端口:接收报文或数据报的进程。(2)本机主机地址:接收数据包的主机。(3)远地协议端口:目的进程或程序。(4)远地主机端口:目的主机。(5)协议:程序在网络上传输数据时使用的协议。本使用程序就是使用Windows sockets编程设计的。在接收电子邮件时,必然需要涉及到连接服务器,接收数据

15、,接收响应以及断开等一系列操作.这就需要设计一个类来封装这些操作,在该使用程序中制定了一个CSMTP。该类的定义如下所示,#define SMTP_PORT 25#define RESPONSE_BUFFER_SIZE 1024 class CSMTP Public;CSMTP(LPCTSTR szSMTPServerName,UINT nPort=SMTP_PORT);virtual CSMTP();void SetServerProperties(LPCTSTR szSMTPserverName, UINT nPort=SMTP_PORT);CString GetlastError();U

16、INT GetPort();BOOL Disconnect。;BOOL Connect。;virtual BOOL FormatMAilMessage(CMailMessage * msg8、 i);BOOL getMessage(CMailMessage * msg);CString GetserverHostName();Private;BOOL get_response(UINT response_expected);CString cook_body(CMailMessage * msg);CString m_serror;BOOL m_bconnected;UINT m_nPort;

17、CString m_sSMTPServerHostName;CSocket m_wsSMTPServer;protected ;virtual BOOL transmit_message(CMailMessage * msg);struct response_codeUINT nResponse;TCHAR * sMessage;;enum eResponseGENERIC_SUCCESS = OCONNECT_SUCC ESSDATA_SUCCESS,QUIT_SUCCESSLAST_RESPONSE);TCHAR * response_buf;static response_code re

18、sponse_table;);其中,m_sError成员代表错误信息,m_bConnectedft示是否建立连接;m_bPort 表示SMT服务器所使用的端口号,m_sSMTPserverHostName示SMT服务器的主9机名(地址);m_waSMTPserve则为将和SMT服务器建立连接的套接字对象;response_table表示由服务器返回的响应,而eRespons萌!J举了所有可能出现 的错误。因为电子邮件有其特殊的结构,不单简单地将其作为文本进行处理。例如,邮 件必须在邮件头和邮件体后发送,而在收信时,先需要分析邮件头和邮件 体.CMailMessag酸是对邮件进行格式化编码的一个

19、类。CSMTP的构造函数如下所示:CSMTP: ; CSMTP(LPCTSTR szSMTPServerNa meUINT nPort)ASSERT(szSMTPServerName l = NULL);AfxSocketInit();m_sSMTPserverHostName = azSMTPServerName;m_nPort = nPort;m_bConnected = FALSE;m_sError = _ T( "OK );response_buf = NULL;在这里调用AfxsocketInit 函数以初始化Window Sockets类的使用,此外还验 证其他类成员是否

20、合法,或为其赋值。#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"#include "pop3.h"

21、10南阳理工软件学院毕业设计(论文)#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 =

22、FALSE;/m_Info = _T("");/邮箱的用户名口令下载邮件后不删除多文本框清空return TRUE; / return TRUEunless you set the focus to a control/以下是事件处理函数和其他成员函数的代码/当用户点击“连接"按钮时,执行此函数void CPop3Dlg二OnBtnConn() /设定pop3类的对话框指针变量,使之指向本对话框,以便传递信息 pop3Socket.SetParent(this);UpdateData(TRUE);/取来用户在对话框中输入的数据pop3Socket.Create()

23、;/ 创建套接字对象的底层套接字pop3Socket.Connect(LPCSTR)m_strServer,110); /连接 pop3 服务器m_Info = ""/多文本列表框清空UpdateData(FALSE); /更新用户界面 /当用户点击“断开"按钮时,执行此函数 void CPop3Dlg二OnBtnDisc() 11南阳理工软件学院毕业设计(论文)pop3Socket.Close();/当用户点击“查看邮件"按钮时,执行此函数void CPop3Dlg二OnBtnView() int i;i = m_ctrList.GetCurSel()

24、; 获得用户在组合框中的选择/获得并显示指定信件的基本属性及信件内容m_Info += pop3Socket.GetMsgStuff(i);m_Info += pop3Socket.GetMsgBody(i);/在不同的情况下,向用户显示不同的信息void CPop3Dlg二Disp(LONG flag)CString s;switch(flag)case S_CONNECT: 已连接至ij服务器,显示信息s ="已连接到"+m_strServer+”rn"m_Info+=s;/禁用连接按钮GetDlgItem(IDC_BTN_CONN)->EnableWi

25、ndow(FALSE);/启用断开按钮GetDlgItem(IDC_BTN_DISC)->EnableWindow(TRUE);/禁用查看邮件按钮GetDlgItem(IDC_BTN_VIEW)->EnableWindow(FALSE);break;case S_RECEIVE:收到服务器发来的响应,显示它的内容m_Info+=pop3Socket.lastMsg;break;case S_CLOSE: /显示关闭连接的信息12m_Info+=pop3Socket.error;s ="连接已经关闭rn"m_Info+=s;/启用连接按钮GetDlgItem(ID

26、C_BTN_CONN)->EnableWindow(TRUE);/禁用断开按钮GetDlgItem(IDC_BTN_DISC)->EnableWindow(FALSE);break;case S_GETNUM: 已经知道了邮箱中信件的总数s.Format("邮箱中共有 %d 封信rn",pop3Socket.numMsg);m_Info+=s;break;case S_GETSIZE:显示信件的大小s.Format("信箱中信件大小为:d?节rn",pop3Socket.sizeMsg); m_Info+=s;break;case S_END

27、RETR: /所有信件已下载完毕,显示信息s.Format("共下载了 %d 封信件 rn",pop3Socket.msgs.size(); m_Info+=s;/如果有信件下载,启用查看邮件按钮if(pop3Socket.msgs.size()>0)GetDlgItem(IDC_BTN_VIEW)->EnableWindow(TRUE);break;UpdateData(FALSE); /更新用户界面/当点击“存储”按钮时,执行此函数。void CPop3Dlg:OnBtnSave()int i;CString s;13南阳理工软件学院毕业设计(论文)i =

28、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);file.Write(LPCSTR)s,s.GetLength();file.Close();5.2接收邮件的步骤(1) .建立和服务器的连接。

29、具体工作由Connect函数完成。部分 Connect函数代码如下所示:BOOL CSMTP:; Connect。if(! m_wsSMTPServer . Create。)m_sError=_T(无法创建套接字! ”);delete response_buf;response_buf = NULL;return FALSE;)if(! M_wsSMTPserver . Connect(GetServerHostName(),GetPort()m_sError = _T(无法连接到服务器”);M_sSMTPserver Close();delete response_but;response-

30、buf = NULL;#南阳理工软件学院毕业设计(论文)return FALSEI;if(! Get_response(CONNECT_SUCCESS)m_sError = _T( 服务器投有响应”);M_wsSMTPServe r Close();delete response_buf ;response_buf = NULL;return FALSE;)sHello . Format(_T( HEL(%srn "), local_host);m_wsSMTPServerGet(LPCTSTR)sHello , sHello .Getlength();(2) .建立连接后从服务器接

31、收邮件。这个工作由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;)前面介绍过电子邮件有其特殊的格式,在这里FormatMailMessage函数就是 用于格式化邮件信息的

32、。Transmit_message函数将邮件进到服务器上。部分Transmit_message函数代码如下所示:BOOL CSMTP二transmit_message(CMailMessage *msg)sFrom. Format_T( MAIL From: <%s>rn"),(LPCTSTR)mscp>m_sFrom);M_wsSMTPServe r Get(LPCTSTR)sFrom,sFrom.GctLength();15南阳理工软件学院毕业设计(论文)if(! Get_response(GENERIC_SUCCESS) return FALSEl;for(i

33、nt i=O;i<msg一GetNumRecipients(); i+)msgGetRecipient(sEmail , sTemp i);sTo. Format(_T( RCPT TO;%s>rn "),(LPCTSTR)sEmail);m_wsSMTPServe r Get( (LPCTSTR)sTemp,sTempGetLength();Get_response(GENERIC_SUCCESS);)sTemp=_T( DATArn ");m_wsSMTPServer Get(LPCTSTR)sTemp sTemp GetLength();if(! Get_

34、response(DATA_SUCCESS)return FALSE ; m_wsSMTPserver Get(LPCTSTR)msgr >m_sHeader, g 一m_sHeader GetLength();sTemp = cook_body(msg);m_wsSMTPServer Get(LPCTSTR)sTemp sTemp GetLength();sTemp = _T( rn.rn");m_wsSMTPServer Get(LPCTSTR)sTemp sTemp.GetLength();if! Get_response(GENERIC_SUCCESS)return FALSE ; Return TRUE;在此函数中,首先发送 MAIL命令,通知服务器收信人的邮箱地址。然后发 进RCP怖令,通知服务器发信人的邮箱地址。需要注意的是,在有多个发信人 时,必须为每个发信人都发送一次 RCP怖令,通知服务器将要进行邮件数据的 传输。此后,分别将邮件头和邮件体从服务器上接收下来。这里需要注意一点: 当邮件数据接收完毕后,需要额外发

温馨提示

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

评论

0/150

提交评论