电子邮件接收程序的设计与实现学生姓名:XX 指导老师:XX摘要电子邮件可以使人们有效地进行电子化的数据异地交换。
Internet以电子邮件服务推动着人类的通信行为不断发展。
本文以VC++为开发平台,利用Socket 套接字编程,实现了基于POP3协议的邮件接收程序,介绍了POP3协议的原理及电子邮件接收程序的设计与实现方法。
关键词课程设计;电子邮件;接收程序;POP3;Socket;VC++1、引言随着Internet/Intranet的迅猛发展,电子邮件(E-Mail)已成为因特网上非常流行、非常方便的通信方式。
电子邮件技术不断进步,邮件协议也不断发展。
目前应用最广泛的电子邮件收件协议是POP3。
本文采用微软最新的.NET技术,以VC++为开发平台,利用Socket套接字编程开发了基于POP3协议的邮件接收程序,现对相关原理及具体设计进行讨论。
1.1 课程设计的内容运用VC++语言设计一个邮件程序实现邮件的接收1.2 课程设计的要求(1)按要求编写课程设计报告书,能正确阐述设计结果。
(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。
(3)学会文献检索的基本方法和综合运用文献的能力。
(4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。
2、设计平台简介2.1 VC++(1)背景VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用C++的一个开发平台。
VC++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。
Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。
VC++作为Visual Studio的一个组件,可以通过安装Visual Studio来获得。
VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,如果形象点比喻的话,可以把C++看作为一种“工业标准”,而VC++则是某种操作系统平台下的“厂商标准”,而“厂商标准”是在遵循“工业标准”的前提下扩展而来的。
(2)基本模式VC++应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式。
VC基于C,C++语言,主要由是MFC组成,是与系统联系非常紧密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效率高,几乎可说VC在 Windows平台无所不能。
最大缺点是开发效率不高。
(3)适用范围【1】1、 VC主要是针对Windows系统,适合一些系统级的开发,可以方便实现一些底层的调用。
在VC里边嵌入汇编语言很简单。
2、 VC主要用在驱动程序开发。
3、 VC执行效率高,当对系统性能要求很高的时候,可用VC开发。
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),即邮局办公协议,该协议用于接收邮件的双方(客户机、POP3服务器)进行通信。
使用该协议,用户可以脱机阅读信件,而不必把客户机长期连接到网络上,以减少网络费用。
POP3协议允许用户以一定的方式从保存邮件的服务器(即POP3服务器)上取走自己的邮件。
3.2 POP3协议工作原理【2】POP3提供了一种客户机/服务器脱机模型,客户机通过向服务器发送一些命令来完成相应的操作。
客户机能够发送的命令与它所处的状态有关。
协议中定义了三种状态:即确认状态(Authorization State)、处理状态(Transaction State)和更新状态(Update State)。
在不同的状态下,客户机可以向服务器发送的命令是有区别的,某些命令还会导致状态的转换。
POP3交互过程中的常用命令和状态转换如图3.2.1和表3.2.1所示。
图3.2.1 POP3的状态转换示意图表3.2.1 一些常用的POP3命令POP3服务器一般使用的是TCP的110号端口。
当客户机与服务器建立TCP连接时,POP3服务器向客户机发回一个问候,交互过程即进入确认状态。
此时,若客户机提供了自己的身份并成功确认,即由确认状态转入处理状态;在这个状态,用户可用相应的命令处理自己的邮件。
在完成相应的处理过程后客户机发出QUIT命令,则进入更新状态;在此状态下,POP3服务器释放邮件资源并返回一个告别响应;最后关闭TCP连接。
通过POP3命令查询电子邮件时,客户机可以下载指定的邮件,然后对邮件进行删除或修改操作都无需与服务器进一步交互。
客户机向服务器发送命令并等待响应,POP3命令采用命令行形式,用ASCII码表示。
服务器响应是由一行或多行组成,其中,第一行以ASCII文本+OK, 或-ERR开始,分别指出相应的操作是成功还是失败。
POP3命令包含一个大小写无关的关键字和一个或多个参量,所有的命令以<CR><LF>(回车换行符)作为其结束标志。
关键字和参量必须是非控制符的ASCII 码字符。
关键字和参量之间,参量和参量之间由一个空格字符分隔开。
关键字长不大于四个字符,每个参量最长可到40个字符。
POP3响应包含一个状态标志和一个跟随其后的附加信息。
响应也用<CR><LF>作为其结束标志。
响应最长到512字节,其中包括<CR><LF>协议定义了两个状态标志:正确(“ +OK”)和错误(“ -ERR”)。
服务器用大写格式发送“ +OK”和“ -ERR”。
如果响应是多行的,则每行以<CR><LF>结束。
当响应的所有行被发送后,接着发送多行响应的结束标志行,该行仅包含一个句点“.”和一个<CR><LF>对【3】。
4、设计原理4.1 POP3交互模型该模型基本原理为:POP3接收者对POP3发送者进行初始化连接,发送者对接收者发送询问指令“READY”,接收者则向发送者提交所要接收数据的要求,发送者做出回应,并发送数据。
接收者则开始接收数据。
发送者发送完数据后,提出断开请求,并断开连接。
数据接收过程完成。
5、课程设计步骤5.1 函数构造Windows Socket类是对Windows Socket API的封装,其中包括,CSocket和cAsyncSocket类,使用它们能够大大简化网络通信程序的编写。
套接字的数据结构中包括下面五种数据:(1)本机主机端口:接收报文或数据报的进程。
(2)本机主机地址:接收数据包的主机。
(3)远地协议端口:目的进程或程序。
(4)远地主机端口:目的主机。
(5)协议:程序在网络上传输数据时使用的协议。
本应用程序就是使用Windows sockets编程设计的。
在接收电子邮件时,必然需要涉及到连接服务器,接收数据,接收响应以及断开等一系列操作.这就需要设计一个类来封装这些操作,在该应用程序中制定了一个CSMTP类。
该类的定义如下所示,#define SMTP_PORT 25#define RESPONSE_BUFFER_SIZE 1024class CSMTP{Public;CSMTP(LPCTSTR szSMTPServerName,UINT nPort=SMTP_PORT);virtual~CSMTP();void SetServerProperties(LPCTSTR szSMTPserverName,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 * 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_code{UINT nResponse;TCHAR * sMessage;};enum eResponse{GENERIC_SUCCESS = O,CONNECT_SUCCESS,DATA_SUCCESS,QUIT_SUCCESS,LAST_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列举了所有可能出现的错误。
因为电子邮件有其特殊的结构,不单简单地将其作为文本进行处理。
例如,邮件必须在邮件头和邮件体后发送,而在收信时,先需要解析邮件头和邮件体.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;}在这里调用AfxsocketInit函数以初始化Window Sockets类的使用,此外还验证其他类成员是否合法,或为其赋值。