pop邮件接收.docx
- 文档编号:6860976
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:24
- 大小:74.99KB
pop邮件接收.docx
《pop邮件接收.docx》由会员分享,可在线阅读,更多相关《pop邮件接收.docx(24页珍藏版)》请在冰豆网上搜索。
pop邮件接收
课程设计报告
(2010–2011年度第1学期)
名称:
网络软件程序设计课程设计
题目:
邮件接收程序
院系:
计算机系
班级:
网络工程
学号:
学生姓名:
指导教师:
设计周数:
1周
成绩:
日期:
2011年1月7日
《网络软件程序设计》课程设计
任务书
一、目的与要求
1.任务:
设计一个邮件接收程序,可以按照要求实现邮件接收器的功能。
2.目的:
使学生加深对网络通信协议、网络编程接口等基本概念、基本原理的理解,熟悉各种应用各种网络通信协议和网络编程接口编写网络应用程序的方法,拓宽学生的知识领域,锻炼学生的实践技能,培养学生科学的工作作风。
3.要求:
基本功能完善,界面美观,方便易用,操作无误;通过课程设计学生应该学会使用各种网络通信协议和网络编程接口编写不同类型的网络应用程序,具备初步分析、设计和开发网络应用软件的能力,具备分析与检查软件错误、解决和处理实验结果的能力。
4.学生要求人数:
1人。
二、主要内容
POP3协议是一个从邮件服务器的邮箱中取邮件到本地主机的协议。
邮件接收器是利用POP3原理实现接收邮件服务器上的邮件,并把邮件下载保存到本地计算机上。
三、进度计划
序号
设计内容
完成时间
备注
1
任务布置,资料查询,方案制定
周一
2
算法设计,程序实现
周二至周四
3
撰写报告,软件验收
周五
4
四、设计成果要求
1.完成规定的课程设计任务,所设计软件功能符合要求;
2.完成课程设计报告,要求格式规范,内容具体而翔实,应体现自身所做的工作,注重对设计思路的归纳和对问题解决过程的总结。
五、考核方式
1.平时成绩+验收答辩+实验报告;
2.五级分制。
学生姓名:
指导教师:
2011年1月3日
一、课程设计的目的与要求
5.任务:
设计一个邮件接收程序,可以按照要求实现邮件接收器的功能。
6.目的:
使学生加深对网络通信协议、网络编程接口等基本概念、基本原理的理解,熟悉各种应用各种网络通信协议和网络编程接口编写网络应用程序的方法,拓宽学生的知识领域,锻炼学生的实践技能,培养学生科学的工作作风。
7.要求:
基本功能完善,界面美观,方便易用,操作无误;通过课程设计学生应该学会使用各种网络通信协议和网络编程接口编写不同类型的网络应用程序,具备初步分析、设计和开发网络应用软件的能力,具备分析与检查软件错误、解决和处理实验结果的能力。
8.学生要求人数:
1人。
二、课程设计正文
一)主要的实验步骤
1.使用MFCAppWizard创建应用程序框架
工程名是pop3,应用程序的类型是基于对话框的,对话框的标题是“接收电子邮件客户端程序”,需要WindowsSockets的支持,其它部分接受系统的默认设置就可以。
向导自动为应用程序创建了两个类:
应用程序类:
CPop3App,基类是CWinApp,对应的文件是pop3.h和pop3.cpp。
对话框类:
CPop3Dlg,基类是CDialog,对应的文件是pop3Dlg.h和pop3Dlg.cpp。
2.为对话框添加控件
在程序的主对话框界面中按表添加相应的可视控件对象,并按修改控件的属性。
对话框中的控件属性
控件类型
控件ID
Caption
静态文本statictext
IDC_STATIC
pop3服务器地址
静态文本statictext
IDC_STATIC
用户名
静态文本statictext
IDC_STATIC
口令
编辑框editbox
IDC_EDIT_SERVER
编辑框editbox
IDC_EDIT_USER
编辑框editbox
IDC_EDIT_PASS
复选框CheckBox
IDC_CHECK_DEL
删除邮箱中的邮件
多文本框RichEditBox
IDC_RICH_INFO
组合选择框ComboBox
IDC_COMB_LIST
命令按钮button
IDC_BTN_CONN
连接
命令按钮button
IDC_BTN_DISC
断开
命令按钮button
IDC_BTN_VIEW
查看邮件
命令按钮button
IDC_BTN_SAVE
存储
3.定义控件的成员变量
按照表,用类向导(ClassWizard)为对话框中的控件对象定义相应的成员变量。
控件对象的成员变量
控件ID
ControlIDs
变量名称
MemberVariableName
变量类别
Category
变量类型
VariableType
IDC_EDIT_SERVER
m_strServer
Value
CString
IDC_EDIT_USER
m_strUser
Value
CString
IDC_EDIT_PASS
m_strPass
Value
CString
IDC_CHECK_DEL
m_bolDel
Value
BOOL
IDC_COMB_LIST
m_ctrList
Control
CComboBox
IDC_RICH_INFO
m_Info
Value
CString
m_ctrlnfo
Control
CRichEditCtrl
4.为对话框中的控件对象添加事件响应函数
按照表,用类向导(ClassWizard)为对话框中的控件对象添加事件响应函数。
对话框控件的事件响应函数
控件类型
对象标识ObjectID
消息Message
函数Memberfunctions
命令按钮
IDC_BTN_CONN
BN_CLICKED
OnBtnConn
命令按钮
IDC_BTN_DISC
BN_CLICKED
OnBtnDisc
命令按钮
IDC_BTN_VIEW
BN_CLICKED
OnBtnView
命令按钮
IDC_BTN_SAVE
BN_CLICKED
OnBtnSave
Cpop3Dlg类添加其它的成员
voidDisp(LONGflag);//在不同的会话阶段显示不同的信息
mySockpop3Socket;//套接字类对象实例
6.创建从CAsyncSocket类继承的派生类
为了能够捕获并响应socket事件,应创建用户自己的套接字类,可利用类向导添加。
ClassType选择MFCClass,类名为mySock,基类是CAsyncSocket类,创建后对应的文件是mysock.h和mysock.cpp。
在利用类向导为mysock类添加OnConnect,OnClose和OnReceive三个事件处理函数,并为它添加一般的成员函数和变量。
7.手工添加包含语句以及事件函数和成员函数的代码
8.分阶段编译执行,进行测试
二)程序的要点:
除了由MFC创建的应用程序类和对话框类以外,程序从CAsyncSocket类派生了自己的套接字类,并为它添加了OnConnect()、OnClose()和OnReceive()三个事件处理函数。
程序的会话过程几乎完全是由FD_READ消息驱动的。
建立连接后,服务器会返回信息,接到命令后,服务器也会返回信息。
当信息到达客户端套接字的接收缓冲区时,会触发FD_READ消息,并自动执行OnReceive()函数。
该函数接收服务器发来的信息,进行分析处理,然后再发送相应的命令。
这命令又会引来服务器的响应,又会触发客户端的FD_READ消息。
如此周而复始,完成POP会话的全过程。
程序定义了一个枚举类型STATE,并为套接字类定义了一个STATE类型的变量state,用来表示POP会话的实际状态。
容易看出,枚举的成员符号是客户端向POP3服务器发送的命令。
typedefenum
{FIRST=0,USER,PASS,STAT,LIST,RETR,ENDRETR,DELE,GOON}STATE;
STATEstate;
当用户点击“连接”按钮与服务器建立TCP连接时,将state置为初值FIRST;然后,每当收到服务器的信息,一方面根据会话的当前状态作响应的分析处理,决定应当继续发送哪条命令,另一方面发出下一个命令以后,改变state的值,将它置为该命令的状态对应的值,这就实现了会话过程中的状态转换,并保证会话按照既定的顺序进行。
程序定义了一个结构类型,用来缓存一封信件信息。
typedefstruct
{
CStringtext;//存储信件的文本
intmsgSize;//信件的大小
intretrSize;//信件实际下载的大小,在下载过程中动态变化
}MESSAGEPROP;
为套接字类定义了一个向量型的成员变量,相当于一个数组,其成员是上述的结构。
vector
在pop会话中,一次性地将信箱中所有信件的信息转入这个向量,然后可以查阅,存储到文件中,或者进行其他处理。
三、课程设计总结或结论
本次实验比较简单,用户可以利用某个网站的pop3电子邮件接收服务器来接收你在该网站的电子邮箱里的信件。
首先填入pop3服务器地址、邮箱用户名和口令,并决定是否要删除邮箱里的邮件;然后点击“连接”按钮,程序会与服务器建立TCP连接,然后发送用户名和口令,经过验证,进入POP3会话。
通过命令交互,将邮箱中的所有邮件取回。
在此过程中,左下方的多文本列表框会显示全部的会话信息。
信件全部下载完毕后,左上方的组合列表框中就有了所有信件的标题字段。
用户可以从中选择一封信件,查看或者存储。
然后可以断开连接。
这次试验完成的不是十分的好,我在测试实验的时候因为没能连接到服务器,所以只检查了连接按钮的功能,其他的功能没有能够很好的检验,但通过编写程序,我学会了很多东西,我是第一次实用MFC编写程序,通过课本以及参考资料的学习,我初步掌握了这类编程方法,并且进一步了解了pop3协议,进一步了解了邮件接收原理,通过此次试验,我学会了很多东西,对于一些理论知识掌握的更加扎实了。
但是连接服务器没有成功,连接时出现了一些小的错误,没有能过正常的接收邮件,我会继续修改,希望能过将错误改正,最后,感谢老师耐心的指导。
四、参考文献
[1]丁展,刘海英等.visualc++网络通信编程实用案例精选.北京:
人民邮电出版社
[2]鲁斌,李莉.网络程序设计与开发.北京:
清华大学出版社
附录(设计流程图、程序、表格、数据等)
主要添加的代码:
1.CPop3App应用程序类对应的文件
pop3.h不动,在pop3.cpp的InitInstance()函数中添加一句初始化多文本框控件的函数。
BOOLCPop3App:
:
InitInstance()
{
if(!
AfxSocketInit())
{
AfxMessageBox(“IDP_SOCKETS_INIT_FAILED”);
returnFALSE;
}
AfxEnableControlContainer();//MFC自动创建的代码
AfxInitRichEdit();//用户添加的
...............
}
2.CPop3Dlg对话框类对应的文件
(1)pop3Dlg.h包含文件
.........
#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("");//邮箱的用户名
m_strPass=_T("");//口令
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();
}
}
3.mySock套接字类对应的文件
(1)mysock.h包含文件
............
#include
#include
#include
#include"afxsock.h"
usingnamespacestd;
classCPop3Dlg;
//显示不同信息的标志
#defineS_CLOSE1//当关闭连接时,显示关闭信息
#defineS_CONNECT2//当连接成功时,显示连接信息
#defineS_RECEIVE3//当收到服务器发来的信息时,显示该信息
#defineS_GETNUM4//当所有信件下载完毕后,显示信箱中的信件总数
#defineS_GETSIZE5//当所有信件下载完毕后,显示信箱中的信件总大小
#defineS_ENDRETR6//当所有信件下载完毕后,显示相关信息
//描述pop3会话状态的枚举类型
typedefenum
{FIRST=0,USER,PASS,STAT,LIST,RETR,ENDRETR,DELE,GOON}STATE;
//用来缓存一封信件信息的结构
typedefstruct
{
CStringtext;//存储信件的文本
intmsgSize;//信件的大小
intretrSize;//信件实际下载的大小,在下载过程中动态变化
}MESSAGEPROP;
//自己的套接字类
classmySock:
publicCAsyncSocket
{
//Attributes
public:
CStringlastMsg;
CStringerror;
intnumMsg,sizeMsg,retrMsg;
vector
//Operations
public:
//获得基本的邮件信头字段:
From,To,Date,Subject,Body
CStringGetMsgStuff(inti);
CStringGetMsgBody(inti);//获得信件体
CStringGetMsgSubject(inti);//获得信件标题
CStringGetMsg(inti);//获得整封信的内容
voidClose();//退出服务器
voidSetParent(CPop3Dlg*pDlg);
mySock();
virtual~mySock();
//Overrides
public:
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(mySock)
public:
virtualvoidOnConnect(intnErrorCode);
virtualvoidOnClose(intnErrorCode);
virtualvoidOnReceive(intnErrorCode);
//}}AFX_VIRTUAL
//Generatedmessagemapfunctions
//{{AFX_MSG(mySock)
//NOTE-theClassWizardwilladdandremovememberfunctionshere.
//}}AFX_MSG
//Implementation
protected:
private:
voidReadLn(intindex,CStringsrc,CString&dst);
voidAnalyzeMsg();
CPop3Dlg*m_pDlg;
STATEstate;
intdelMsg;
};
..............
(2)mysock.cpp实现文件
#include"stdafx.h"
#include"pop3.h"
#include"mySock.h"
#include"pop3Dlg.h"//自己添加的包含语句
................
#defineMAX_BUFF20000
//构造函数,对某些成员变量初始化
mySock:
:
mySock()
{
m_pDlg=NULL;
state=FIRST;
error="Notconnectedtoserver\r\n";
}
mySock:
:
~mySock()
{
m_pDlg=NULL;
}
...................
//如果连接成功,执行此函数。
//接到此消息仅仅显示了一句话,开关了一些按钮连接成功后,服务器发来响应,因此
//又立即收到了OnReceive消息,后来的会话过程中,一来一往,程序总是收到
//OnReceive消息,所以真正的事情在那里作。
voidmySock:
:
OnConnect(intnErrorCode)
{
if(nErrorCode==0)m_pDlg->Disp(S_CONNECT);
}
//服务器端关闭连接
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pop 邮件 接收