基于POP3协议的电子邮件接收程序的设计论文.docx

上传人:b****2 文档编号:24374298 上传时间:2023-05-26 格式:DOCX 页数:22 大小:157.96KB
下载 相关 举报
基于POP3协议的电子邮件接收程序的设计论文.docx_第1页
第1页 / 共22页
基于POP3协议的电子邮件接收程序的设计论文.docx_第2页
第2页 / 共22页
基于POP3协议的电子邮件接收程序的设计论文.docx_第3页
第3页 / 共22页
基于POP3协议的电子邮件接收程序的设计论文.docx_第4页
第4页 / 共22页
基于POP3协议的电子邮件接收程序的设计论文.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

基于POP3协议的电子邮件接收程序的设计论文.docx

《基于POP3协议的电子邮件接收程序的设计论文.docx》由会员分享,可在线阅读,更多相关《基于POP3协议的电子邮件接收程序的设计论文.docx(22页珍藏版)》请在冰豆网上搜索。

基于POP3协议的电子邮件接收程序的设计论文.docx

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

学号:

200840420142

 

课外设计论文

 

题目

基于POP3协议的电子邮件接收程序的设计

教学院

计算机学院

专业

网络工程

班级

08级

(1)班

姓名

李清平

指导教师

严伟

 

2011

6

24

 

目录

摘要1

1、引言3

1.1课程设计的内容3

1.2课程设计的要求3

2、设计平台简介3

2.1VC++3

3、邮件接收协议5

3.1POP3简介5

4、设计原理8

4.1POP3交互模型8

5、课程设计步骤9

5.1函数构造9

5.2接收邮件的步骤15

6、测试19

6.1测试目的19

6.2测试环境19

6.3测试结果19

6.4结果分析20

7、出现的问题及解决方法20

7.1设计中出现的问题20

7.2解决方法20

参考文献21

 

摘要

电子邮件可以使人们有效地进行电子化的数据异地交换。

Internet以电子邮件服务推动着人类的通信行为不断发展。

本文以VC++为开发平台,利用Socket套接字编程,实现了基于POP3协议的邮件接收程序,介绍了POP3协议的原理及电子邮件接收程序的设计与实现方法。

随着Internet/Intranet的迅猛发展,电子邮件(E-Mail)已成为因特网上非常流行、非常方便的通信方式。

电子邮件技术不断进步,邮件协议也不断发展。

目前应用最广泛的电子邮件收件协议是POP3。

本文采用微软最新的.NET技术,以VC++为开发平台,利用Socket套接字编程开发了基于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.1VC++

(1)背景

VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用C++的一个开发平台。

VC++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。

Windows下编程需要了解Windows的消息机制以及回调(callback)函数的原理;MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。

VC++作为VisualStudio的一个组件,可以通过安装VisualStudio来获得。

VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,如果形象点比喻的话,可以把C++看作为一种“工业标准”,而VC++则是某种操作系统平台下的“厂商标准”,而“厂商标准”是在遵循“工业标准”的前提下扩展而来的。

(2)基本模式

VC++应用程序的开发主要有两种模式,一种是WINAPI方式,另一种则是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.1POP3简介

POP3(PostOfficeProtocolVersion3),即邮局办公协议,该协议用于接收邮件的双方(客户机、POP3服务器)进行通信。

使用该协议,用户可以脱机阅读信件,而不必把客户机长期连接到网络上,以减少网络费用。

POP3协议允许用户以一定的方式从保存邮件的服务器(即POP3服务器)上取走自己的邮件。

 

3.2POP3协议工作原理【2】

POP3提供了一种客户机/服务器脱机模型,客户机通过向服务器发送一些命令来完成相应的操作。

客户机能够发送的命令与它所处的状态有关。

协议中定义了三种状态:

即确认状态(AuthorizationState)、处理状态(TransactionState)和更新状态(UpdateState)。

在不同的状态下,客户机可以向服务器发送的命令是有区别的,某些命令还会导致状态的转换。

POP3交互过程中的常用命令和状态转换如图3.2.1和表3.2.1所示。

 

图3.2.1POP3的状态转换示意图

 

表3.2.1一些常用的POP3命令

POP3服务器一般使用的是TCP的110号端口。

当客户机与服务器建立TCP连接时,POP3服务器向客户机发回一个问候,交互过程即进入确认状态。

此时,若客户机提供了自己的身份并成功确认,即由确认状态转入处理状态;在这个状态,用户可用相应的命令处理自己的邮件。

在完成相应的处理过程后客户机发出QUIT命令,则进入更新状态;在此状态下,POP3服务器释放邮件资源并返回一个告别响应;最后关闭TCP连接。

通过POP3命令查询电子邮件时,客户机可以下载指定的邮件,然后对邮件进行删除或修改操作都无需与服务器进一步交互。

客户机向服务器发送命令并等待响应,POP3命令采用命令行形式,用ASCII码表示。

服务器响应是由一行或多行组成,其中,第一行以ASCII文本+OK,或-ERR开始,分别指出相应的操作是成功还是失败。

POP3命令包含一个大小写无关的关键字和一个或多个参量,所有的命令以(回车换行符)作为其结束标志。

关键字和参量必须是非控制符的ASCII码字符。

关键字和参量之间,参量和参量之间由一个空格字符分隔开。

关键字长不大于四个字符,每个参量最长可到40个字符。

POP3响应包含一个状态标志和一个跟随其后的附加信息。

响应也用作为其结束标志。

响应最长到512字节,其中包括协议定义了两个状态标志:

正确(“+OK”)和错误(“-ERR”)。

服务器用大写格式发送“+OK”和“-ERR”。

如果响应是多行的,则每行以结束。

当响应的所有行被发送后,接着发送多行响应的结束标志行,该行仅包含一个句点“.”和一个对【3】。

4、设计原理

4.1POP3交互模型

 

该模型基本原理为:

POP3接收者对POP3发送者进行初始化连接,发送者对接收者发送询问指令“READY”,接收者则向发送者提交所要接收数据的要求,发送者做出回应,并发送数据。

接收者则开始接收数据。

发送者发送完数据后,提出断开请求,并断开连接。

数据接收过程完成。

 

5、课程设计步骤

5.1函数构造

WindowsSocket类是对WindowsSocketAPI的封装,其中包括,CSocket和cAsyncSocket类,使用它们能够大大简化网络通信程序的编写。

套接字的数据结构中包括下面五种数据:

(1)本机主机端口:

接收报文或数据报的进程。

(2)本机主机地址:

接收数据包的主机。

(3)远地协议端口:

目的进程或程序。

(4)远地主机端口:

目的主机。

(5)协议:

程序在网络上传输数据时使用的协议。

本应用程序就是使用Windowssockets编程设计的。

在接收电子邮件时,必然需要涉及到连接服务器,接收数据,接收响应以及断开等一系列操作.这就需要设计一个类来封装这些操作,在该应用程序中制定了一个CSMTP类。

该类的定义如下所示,

#defineSMTP_PORT25

#defineRESPONSE_BUFFER_SIZE1024

classCSMTP

{

Public;

CSMTP(LPCTSTRszSMTPServerName,UINTnPort=

SMTP_PORT);

virtual~CSMTP();

voidSetServerProperties(LPCTSTRszSMTPserverName,

UINTnPort=SMTP_PORT);

CStringGetlastError();

UINTGetPort();

BOOLDisconnect();

BOOLConnect();

virtualBOOLFormatMAilMessage(CMailMessage*msg

);

BOOLgetMessage(CMailMessage*msg);

CStringGetserverHostName();

Private;

BOOLget_response(UINTresponse_expected);

CStringcook_body(CMailMessage*msg);

CStringm_serror;

BOOLm_bconnected;

UINTm_nPort;

CStringm_sSMTPServerHostName;

CSocketm_wsSMTPServer;

protected;

virtuaIBOOLtransmit_message(CMailMessage*msg

);

structresponse_code

{

UINTnResponse;

TCHAR*sMessage;

};

enumeResponse

{

GENERIC_SUCCESS=O,

CONNECT_SUCCESS,

DATA_SUCCESS,

QUIT_SUCCESS,

LAST_RESPONSE

);

TCHAR*response_buf;

staticresponse_coderesponse_table[];);

其中,m_sError成员代表错误信息,m_bConnected表示是否建立连接;m_bPort表示SMTP服务器所使用的端口号,m_sSMTPserverHostName表示SMTP服务器的主机名(地址);m_waSMTPserver则为将与SMTP服务器建立连接的套接字对象;response_table表示由服务器返回的响应,而eResponse列举了所有可能出现的错误。

因为电子邮件有其特殊的结构,不单简单地将其作为文本进行处理。

例如,邮件必须在邮件头和邮件体后发送,而在收信时,先需要解析邮件头和邮件体.CMailMessage类是对邮件进行格式化编码的一个类【4】。

CSMTP类的构造函数如下所示:

CSMTP:

;CSMTP(LPCTSTRszSMTPServerName,

UINTnPort)

{ASSERT(szSMTPServerNamel=NULL);

AfxSocketInit();

m_sSMTPserverHostName=azSMTPServerName;

m_nPort=nPort;

m_bConnected=FALSE;

m_sError=_T(“OK”);

response_buf=NULL;}

在这里调用AfxsocketInit函数以初始化WindowSockets类的使用,此外还验证其他类成员是否合法,或为其赋值。

#include"mySock.h"//添加套接字类的包含文件

.........

classCPop3Dlg:

publicCDialog

{

//Construction

public:

voidDisp(LONGflag);//在不同的会话阶段显示不同的信息

mySockpop3Socket;//套接字类对象实例

CPop3Dlg(CWnd*pParent=NULL);//standardconstructor

...........

(2)pop3Dlg.cpp实现文件

#include"stdafx.h"

#include"pop3.h"

#include"pop3Dlg.h"

#include"mySock.h"//手工添加的包含语句

...................

BOOLCPop3Dlg:

:

OnInitDialog()

{

.............

//TODO:

Addextrainitializationhere

//用户在这里添加控件成员变量的初始化代码

m_strServer=_T("");//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+=pop3Socket.error;

s="连接已经关闭\r\n";

m_Info+=s;

//启用连接按钮

GetDlgItem(IDC_BTN_CONN)->EnableWindow(TRUE);

//禁用断开按钮

GetDlgItem(IDC_BTN_DISC)->EnableWindow(FALSE);

break;

caseS_GETNUM:

//已经知道了邮箱中信件的总数

s.Format("邮箱中共有%d封信\r\n",pop3Socket.numMsg);

m_Info+=s;

break;

caseS_GETSIZE:

//显示信件的大小

s.Format("信箱中信件大小为:

%d字节\r\n",pop3Socket.sizeMsg);

m_Info+=s;

break;

caseS_ENDRETR:

//所有信件已下载完毕,显示信息

s.Format("共下载了%d封信件\r\n",pop3Socket.msgs.size());

m_Info+=s;

//如果有信件下载,启用查看邮件按钮

if((pop3Socket.msgs.size())>0)

GetDlgItem(IDC_BTN_VIEW)->EnableWindow(TRUE);

break;

}

UpdateData(FALSE);//更新用户界面

}

//当点击“存储”按钮时,执行此函数。

voidCPop3Dlg:

:

OnBtnSave()

{

inti;

CStrings;

i=m_ctrList.GetCurSel();

//获得指定信件的基本属性及信件内容

s=pop3Socket.GetMsgStuff(i);

s+=pop3Socket.GetMsgBody(i);

CFileDialogdlg(FALSE);

if(dlg.DoModal()==IDOK)

{

CFilefile(dlg.GetPathName(),

CFile:

:

modeCreate|CFile:

:

modeWrite|CFile:

:

typeBinary);

file.Write((LPCSTR)s,s.GetLength());

file.Close();

}

}

5.2接收邮件的步骤

(1).建立与服务器的连接。

具体工作由Connect函数完成。

部分Connect函数代码如下所示:

BOOLCSMTP:

;Connect()

{……

if(!

m_wsSMTPServer.Create())

{m_sError=_T(“无法创建套接字!

”);

deleteresponse_buf;

response_buf=NULL;

returnFALSE;)

if(!

M_wsSMTPserver.Connect(GetServerHostName

(),GetPort()))

{m_sError=_T(“无法连接到服务器”);

M_sSMTPserver.Close();

deleteresponse_but;

response-buf=NULL;

returnFALSEI;}

if(!

Get_response(CONNECT_SUCCESS))

{m_sError=_T(“服务器投有响应”);

M_wsSMTPServer.Close();

deleteresponse_buf;

response_buf=NULL;

returnFALSE;)

sHello.Format(_T(“HELO%s\r\n”),local_host);

m_wsSMTPServer.Get((LPCTSTR)sHello,sHello.

Getlength());

……}

(2).建立连接后从服务器接收邮件。

这个工作由GetMessage函数完成。

GetMessage函数代码如下:

BOOLCSMTP:

GetMessage(CMailMessage*msg)

{if(!

m_bConnected)

{m_sError=_T(“必须首先创建连接!

”);

returnFALSE;)

if(FormatMailMessage(msg)==FALSE)

{returnFALSE;)

if(transmit_message(msg)==FALSE)

{returnFALSE;)

returnTRUE;)

前面介绍过电子邮件有其特殊的格式,在这里FormatMailMessage函数就是用于格式化邮件信息的。

Transmit_message函数将邮件进到服务器上。

部分Transmit_message函数代码如下所示:

BOOLCSMTP:

:

transmit_message(CMailMessage*

msg)

{……sFrom.Format_T(“MAILFrom:

<%s>\r\n”

),(LPCTSTR)msg一>m_sFrom);

M_wsSMTPServer.Get((LPCTSTR)sFrom,sFrom.

GctLength());

if(!

Get_response(GENERIC_SUCCESS))

returnFALSEl;

for(inti=O;iGetNumRecipients();i++)

{msg一>GetRecipient(sEmail,sTemp,i);

sTo.Format(_T(“RCPTTO;<%s>\r\n”),(LPCT

STR)sEmail);

m_wsSMTPServer.Get((LPCTSTR)sTemp,sTemp.

GetLength());

Get_response(GENERIC_SUCCESS);)

sTemp=_T(“DATA\r\n”);

m_wsSMTPServer.Get((LPCTSTR)sTemp,sTemp.

GetLength());

if(!

Get_response(DATA_SUCCESS))

{returnFAL

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 表格类模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1