pop3邮件客户端课程设计大学论文.docx
《pop3邮件客户端课程设计大学论文.docx》由会员分享,可在线阅读,更多相关《pop3邮件客户端课程设计大学论文.docx(31页珍藏版)》请在冰豆网上搜索。
pop3邮件客户端课程设计大学论文
青海民族大学课程设计报告
课程类别:
本科
课程名称:
TCP/IP协议原理课程设计
课程代号:
XXXXXX
指导教师:
昝风彪
POP3邮件客户端
姓名:
卢国祥
学号:
1410030010
院系:
计算机学院
专业:
网络工程
班级:
14网本
课程设计报告提交时间:
2016年12月日
目录
1课程设计内容1
2课程设计要求1
2.1功能要求1
3概要设计1
3.1功能模块图1
3.2功能模块描述1
4详细设计2
4.1功能流程图2
4.2重点设计2
5测试与调试2
6心得体会2
参考文献2
POP3邮件客户端
1课程设计内容
设计并实现POP3邮件客户端系统,要求能够向POP服务器发送命令,并接受POP服务器返回的响应和数据,程序设计具备以下功能模块:
(1)功能模块1要求实现的程序为图形化界面,可以输入POP服务的相关信息(包括POP服务器名、用户和密码),输出交互过程中的POP命令与响应信息,以及从POP服务器的制定邮箱中获得的邮件信息。
(2)功能模块2要求遵循RFC1939的相关POP3协议规定可以登录到任意一个标准的POP3服务器。
只要求实现USER、PASS、STAT、RETR、DELE和QUIT命令。
点击链接按钮,实现USER与PASS命令;单机删除按钮,实现DELE命令;单击退出按钮,实现QUIT命令。
2课程设计要求
2.1设计要求
(1)要求有良好的编程规范与详细的注释信息。
(2)要求有详细的说明文档,包括程序的设计思想、工作流程、关键问题等。
(3)要求在Windows操作系统环境中,建议使用VisualC++编程工具实现。
2.2功能要求
所设计的的程序经调试后能与现有的邮件服务器系统(如:
163、126、sina、sohu、QQ)等进行通信,并能查看邮件服务器上的邮件并下载到本机上。
2.3设计平台介绍
VC++是微软公司开发的一个IDE(集成开发环境),换句话说就是使用C++的一个开发平台。
VC++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大,Windows下编程需要了解其消息机制以及回调(callback)函数的原理,MFC是Win32API的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等。
MFC是VisualC++进行开发的一种主要模式。
2.4POP3协议
POP邮局协议负责从邮件服务器中检索电子邮件。
它要求邮件服务器完成下面几种任务:
从邮件服务器中检索邮件并从服务器中删除这个邮件;从邮件服务器中检索邮件但不删除它;不检索邮件,只是询问是否有新邮件到达。
Pop协议支持多用户互联网邮件扩展,实际上这样就可以传输任何格式的文件。
Pop3协议即邮局协议的第三个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。
它是Internet电子邮件的第一个离线协议标准,pop3允许用户从服务器上把邮件存储到本地主机上,同时删除保存在邮件服务器上的邮件,而pop3服务器则是遵循pop3协议的接收邮件服务器,用来接收电子邮件。
2.5实验步骤
1、新建MFC程序,选择合适的位置保存工程项目;
2、绘制MFC程序界面,熟悉所使用的控件。
3、定义控件所对应的变量。
4、编写程序的功能实现部分代码,并调试运行。
5、分析实验结果,编写课程设计文档。
3概要设计
3.1功能模块图
3.2功能模块描述
1)与现有服务器的连接
2)用户从邮件服务器上下载邮件到本地主机上
4详细设计
4.1功能流程图
4.2重点设计
实现步骤
1.在visual中创建一个工程
2.设计基于对话框的图形界面,添加组件和按钮
步骤3
先在MailClientDlg.h中添加如下全局变量:
#defineMAX_SIZE65535
再在MailClientDlg类中添加如下私有成员:
boolRecvRespond();
boolSendCommanf();
charCommand[MAX_SIZE];
charRespond[MAX_SIZE];
boolRespondStatue;
SOCKETSocket;
再按Ctrl+W进入MFCClassWizard,选择MemberVariable,为控件添加成员变量,如图所示
步骤4:
在资源视图中选择对话框,双击“链接”按钮,为之创建响应函数OnConnect(),双击“接收”按钮,为之创建响应函数OnReceive(),双击“删除”按钮,为之创建响应函数OnDelete()。
双击“退出”按钮,为之创建响应函数OnQuit().
步骤5:
添加相关代码。
5测试与调试
5.1测试目的
检查POP3邮件客户端程序是否能够与现有的邮件服务器如:
163、QQ进行通信,是否从邮件服务器上下载邮件到本地主机上。
5.2测试环境
WinXP系统visualC++6.0
5.3测试结果
客户端建立之后,连接国内现有的服务器系统,证明能够与主流服务器系统进行通信,具体的通信界面如下图所示
与服务器取得联系之后,对目标邮件进行下载接收,证明邮件可以正常下载到本地主机,具体的接收界面如下图所示。
5.4结果分析
经过测试,该邮件客户端各个功能均能实现,POP3端口能与国内现有的主流服务器系统(如:
163、126、sina、sohu、QQ)等进行通信,并能查看邮件服务器上的邮件并下载到本机上。
此次邮件客户端设计成功。
6出现的问题及解决方法
6.1设计中出现的问题
1)设计初没有接触尝试过相似系统的设计;
2)设计时编写程序不是很顺利;
3)调试程序时出现很多错误;
4)软件界面过于简洁。
6.2解决方法
1)找来相关资料,经过本小组的一番讨论研究,对该邮件客户端有了较清晰的认识,才开始着手于正式设计。
2)经过一段时间的研究,找到了可行的函数模式。
3)不断地耐心调试,直至出现满意的结果。
4)经过相应的修改,终于达到了较好的效果。
7心得体会
7.1总结
通过此次课程设计对现今流行的邮件系统现状有了一定的了解,针对基本的邮件服务器设计进行了分析,选择了相应的编程语言及相关的协议及技术,通过编程实现简单的邮件的收发,主要完成了以下工作:
(1)在明确邮件收发系统的概念及原理的基础上对邮件服务器模块进行整体分析,确定编程思路及大体框架;
(2)理解并应用Socket接口及网络编程技术,分析协议通信的整个过程,学会用编程语言实现其功能;
(3)对代码中存在的bug进行调试及分析,深入理解服务器与客户端之间的通信过程,及怎样利用协议来实现对话;
(4)由于所编写的邮件系统不仅只是给予发送简单的文本信息而已,而且还能够发送添加附件的邮件,所以他有很大的实用性。
(5)当然,随着网络技术的飞速发展,邮件服务器系统已经产生了很多功能非常完善的邮件客户端,本客户端只实现了一些基本功能,有些功能需要进一步完善和改进。
7.2发展需求
在邮件收发系统能给我们带来很多方便的同时,用户对它的功能需求也在不断的提高,现在通过电子油件传播的病毒很多(大多通过附件传播)。
系统该应加入对附件的安全性检查功能,对SMTP,POP,IMTP,LDAP,HTTP可以支持SSL/TLS加密传输,防止网络侦听,通信更安全。
为了给生活带来更多的方便,邮箱应该可以和手机绑定,支持短信提醒,有新邮件到达时,可以在手机上获得通知。
提供快速设置向导,只需输入几个简单参数,让您一分钟内设置好邮件系统。
可以同时发送多个附件,超大附件,提供网络磁盘功能,并且可以设置共享。
提供网络记事本服务。
8程序清单
源代码:
//MailClientDlg.cpp:
implementationfile
//
#defineMAX_SIZE4096
#include"stdafx.h"
#include"MailClient.h"
#include"MailClientDlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCMailClientlg:
publicCDialog
{
public:
//{{AFX_DATA(CMailClientlg)
enum{IDD=IDD_ABOUTBOX};
enmu{IDD=IDD_MAILCLIENT_DIALOG};
CStringm_Address;
CStringm_Login;
CStringm_Mail;
CStringm_Password;
CStringm_Account;
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRT
protected:
//{{AFX_MSG(CAboutDlg)
afx_msgvoidOnConnect();
afx_msgvoidOnQuit();
afx_msgvoidOnRecevice();
adx_magvoidOndelete();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
boolRecvRespond();
boolSendCommand();
charCommand[MAX_SIZE];
charRespond[MAX_SIZE];
boolRespondStatue;
SOCKETSocket;
};
//MailClientDlg.cpp:
imlementationfile
#include"stdafx.h"
#include"MailnClient.h"
#include"MailnClientlg.h"
#include"winsock.h"
voidCMailClientDlg:
:
OnConnect()
{
UpdataData(true);
WSADATAWSAData;
if(WSAStartup(MAKEWORD(2,2),&WSAData)!
=0)
{
MessageBox("初始化Winsock失败!
");
return;
}
Socket=socket(AF_INET,SOCK_STREAM,0);
if(Socket==INVAID_SOCKET)
{
MessageBox("创建Socket失败!
");
WSACleanup();
return;
}
intIpAddress;
IpAddress=inet_addr(m_Address);
if(IpAddress==INADDR_NONE)
{
hostent*pHostent=gethostbyname(m_Address);
if(pHostent)
IpAddress(*(in_addr*)pHostent->h_addr).s_addr;
}
sockaddr_inserveraddr;
memset(&severaddr,0,sizeof(severaddr));
severaddr.sin_family=AF_INET;
severaddr.sin_port=htons(110);
severaddr.sin_addr.s_addr=IpAddress;
intnConnect;
nConnect=connect(Socket,(sockaddr*)&severaddr,sizeof(severaddr));
if(nConnect==SOCKET_ERROR)
{
MessageBox("链接建立失败!
");
closesocket(socket);
WSACleanup();
return;
}
m_Login+=Client:
"Connectto";
m_Login+=m_Address;
m_Login+="...\r\n";
if(!
RecvRespond())
return;
else
{
if(!
RecvRespond())
{
m_Login+="Sever:
";
m_Login+=Respond;
}
else
{
MessageBox("链接响应错误!
");
closesocket(Socket);
WSACleanup();
return;
}
}
memset(Command,0,MAX_SIZE);
memcpy(Command,"USER",strlen("USER"));
memcpy(Command+strlen("USER"),m_Account,strlen(m_Account));
memcpy(Command+strlen("USER")+strlen(m_Account),"\r\n",2);
if(!
SendCommand())
return;
m_Login+="Client:
";
m_Login+=Command;
if(!
RecvRespond())
return;
else
{
if(RespondStatue==true)
{
m_Login+="Servere:
";
m_Login+=Respond;
}
else
{
MesssageBox("USER响应错误!
");
closesocket(Socket);
WSACleanup();
return;
}
}
memset(Command,0MAX_SIZE);
memcpy(Command,"PASS",strlen("PASS"));
memcpy(Command+strlen("PASS"),m_Password,strlen(m_Password));
memcpy(Command+strlen("PASS")+strlen(m_Password),"\r\n",2);
if(!
SendCommand());
return;
m_Login+="Client:
PASS******\r\n";
if(RecvRespond())
return;
else
{
if(RespondStatue==true)
{
m_Login+="Server";
m_Login+=Respond;
}
else
{
MessageBox("PASS响应错误!
");
closesocket(Socket);
WSACleanup();
return;
}
}
UpdateData(false);
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMailClientDlgdialog
CMailClientDlg:
:
CMailClientDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CMailClientDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CMailClientDlg)
m_Mail=_T("");
m_address=_T("");
m_Login=_T("");
m_password=_T("");
m_Account=_T("");
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCMailClientDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMailClientDlg)
DDX_Text(pDX,IDC_EDIT3,m_Mail);
DDX_Text(pDX,IDC_EDIT1,m_address);
DDX_Text(pDX,IDC_EDIT10,m_Login);
DDX_Text(pDX,IDC_EDIT4,m_password);
DDX_Text(pDX,IDC_EDIT9,m_Account);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMailClientDlg,CDialog)
//{{AFX_MSG_MAP(CMailClientDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_LBN_SELCHANGE(IDC_LIST4,On)
ON_BN_CLICKED(IDC_BUTTON2,OnConnect)
ON_BN_CLICKED(IDC_BUTTON5,OnQuit)
ON_BN_CLICKED(IDC_BUTTON3,OnReceive)
ON_BN_CLICKED(IDC_BUTTON4,Ondelete)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CMailClientDlgmessagehandlers
BOOLCMailClientDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCMailClientDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCMailClientDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);