当前位置:文档之家› pop3邮件客户端课程设计文档

pop3邮件客户端课程设计文档

青海民族大学课程设计报告课程类别:本科课程名称:TCP/IP协议原理课程设计课程代号:XXXXXX指导教师:***POP3邮件客户端姓名:***学号:**********院系:计算机学院专业:网络工程班级:14网本课程设计报告提交时间:2016 年12月日目录1课程设计内容 (1)2课程设计要求 (1)2.1功能要求 (1)3概要设计 (3)3.1功能模块图 (3)3.2功能模块描述 (4)4详细设计 (5)4.1功能流程图 (5)4.2重点设计 (7)5测试与调试 (11)6心得体会 (13)参考文献 (28)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操作系统环境中,建议使用Visual C++编程工具实现。

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是Visual C++进行开发的一种主要模式。

2.4 POP3协议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中添加如下全局变量:#define MAX_SIZE 65535再在MailClientDlg类中添加如下私有成员:bool RecvRespond();bool SendCommanf();char Command[MAX_SIZE];char Respond[MAX_SIZE];bool RespondStatue;SOCKET Socket;再按Ctrl+W进入MFC ClassWizard,选择Member Variable,为控件添加成员变量,如图所示步骤4:在资源视图中选择对话框,双击“链接”按钮,为之创建响应函数OnConnect(),双击“接收”按钮,为之创建响应函数OnReceive(),双击“删除”按钮,为之创建响应函数OnDelete()。

双击“退出”按钮,为之创建响应函数OnQuit().步骤5:添加相关代码。

5测试与调试5.1测试目的检查POP3邮件客户端程序是否能够与现有的邮件服务器如:163、QQ进行通信,是否从邮件服务器上下载邮件到本地主机上。

5.2测试环境Win XP系统visual C++6.05.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 : implementation file//#define MAX_SIZE 4096#include "stdafx.h"#include "MailClient.h"#include "MailClientDlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif/////////////////////////////////////////////////////////////////////////////// CAboutDlg dialog used for App Aboutclass CMailClientlg : public CDialog{public://{{AFX_DATA(CMailClientlg)enum { IDD = IDD_ABOUTBOX };enmu{IDD=IDD_MAILCLIENT_DIALOG};CString m_Address;CString m_Login;CString m_Mail;CString m_Password;CString m_Account;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTprotected://{{AFX_MSG(CAboutDlg)afx_msg void OnConnect();afx_msg void OnQuit();afx_msg void OnRecevice();adx_mag void Ondelete();//}}AFX_MSGDECLARE_MESSAGE_MAP()private:bool RecvRespond();bool SendCommand();char Command[MAX_SIZE];char Respond[MAX_SIZE];bool RespondStatue;SOCKET Socket;};//MailClientDlg.cpp:imlementation file#include "stdafx.h"#include "MailnClient.h"#include "MailnClientlg.h"#include "winsock.h"void CMailClientDlg::OnConnect(){UpdataData(true);WSADATA WSAData;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;}int IpAddress;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_in serveraddr;memset(&severaddr,0,sizeof(severaddr));severaddr.sin_family=AF_INET;severaddr.sin_port=htons(110);severaddr.sin_addr.s_addr=IpAddress;int nConnect;nConnect=connect(Socket,(sockaddr*)&severaddr,sizeof(severaddr)); if(nConnect==SOCKET_ERROR){MessageBox("链接建立失败!");closesocket(socket);WSACleanup();return;}m_Login+=Client: "Connect to";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);}void CAboutDlg::DoDataExchange(CDataExchange* pDX) {CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMailClientDlg dialogCMailClientDlg::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// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);}void CMailClientDlg::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_MAPEND_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////// CMailClientDlg message handlersBOOL CMailClientDlg::OnInitDialog(){CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog. The framework does this automatically// when the application's main window is not a dialogSetIcon(m_hIcon, TRUE); // Set big iconSetIcon(m_hIcon, FALSE); // Set small icon// TODO: Add extra initialization herereturn TRUE; // return TRUE unless you set the focus to a control}void CMailClientDlg::OnSysCommand(UINT nID, LPARAM lParam){if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}}// If you add a minimize button to your dialog, you will need the code below// to draw the icon. For MFC applications using the document/view model,// this is automatically done for you by the framework.void CMailClientDlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{CDialog::OnPaint();}}// The system calls this to obtain the cursor to display while the user drags // the minimized window.HCURSOR CMailClientDlg::OnQueryDragIcon(){return (HCURSOR) m_hIcon;}void CMailClientDlg::On(){// TODO: Add your control notification handler code here}void CMailClientDlg::OnConnect(){UPdateData(true);WSADATA WSAData;// TODO: Add your control notification handler code here }void CMailClientDlg::OnQuit(){// TODO: Add your control notification handler code here memset(Command,0,MAX_SIZE);memcpy(Command,"QUIT",strlen("QUIT"));memcpy(Command+strlen("QUIT"),"\r\n",2);if(!SendCommand)return;m_Login+="Client";m_Login+=Command;if(!RecvRespond())return;else{if(RespondStatue==true)m_Login+="Server:";m_Login+=Respond;m_Mail="";}else{MessageBox("QUIT响应错误!");closesocket(Socket);WSACleanup();return;}UpdateDate(false);closesocket(Socket);WSACleanup();}bool CMailentDlg::RecvRespond(){int nRecv;memset(Respond,0,MAX_SIZE);nRecv=recv(Socket,Respond,MAX_SIZE,0);if(Recv==SOCKET_ERROR){MessageBox("Socket接收失败!");closesocket(Socket);return false;}if(memamp(Respond,"+OK",3)==0)RespondStatue=true;elseRespondStatue=false;return true;}bool CMailClientDlg::SendCommand(){int nSend;nSend=send(Socket,Command,strlen(Command),0); if(nSend==SOCKET_ERROR){MessageBox("Socket发送失败!");closesocket("Socket");WSACleanup();return false;return true;}void CMailClientDlg::OnReceive(){// TODO: Add your control notification handler code here memset(Command,0,MAX_SIZE);memcpy(Command+strlen("STAT"),"\r\n",2)if(!SendCommand())return;m_Login+="Client: ";m+Login+=Command;if(!RecvRespond())return;else{if(RespondStatue==true){m_Login+="Sever: ";m_Login+=Respond;}else{MessageBox("STAT响应错误!");WSACleanup();return;}}memset(Command,0,MAX_SIZE);memcpy(Command,"RETR",strlen("RETR"));memcpy(Command+strLen("RETR"),"\r\n",3);if(!SendCommand())return;m_Login+="Client: ";m_LOgin+=Command;if(!RecvRespond())return;else{if(RespondStatue==ture){m_Login+="sever: ";m_Login+=Respond;}else{MessageBox("RETR响应错误!");closesocket(Socket);WSACleanup();return;}}while(true){char MailBuf[MAX_Size];memset(MailBuf,0,MAX_SIZE,0);int nRecv;nRecv=recv(Socket,MailBUf,MAX_SIZE,0);if(nRecv==SOCKET_ERROR){MessageBox("RETR接收错误!");closesocket(Socket);WSACleanup();return;}m_Mail+=MailBuf;if(strstr(MailBuf,"\r\n.\r\n"))break;}UpdateData(false);}void CMailClientDlg::Ondelete(){// TODO: Add your control notification handler code here memset(Command,0,MAX_SIZE);memcpy(Command,"DELE",strlen("DELE "));memcpy(Command+strlen("DELE "),"1\r\n",3);if(!OnSendCommand())return;m_Login+="Client: ";m_Login+=Command;of(!RecvRespond())return;else{if(RespondStatue==true){m_Login+="Server: "m_Login+=Respond;}else{MessageBox("DELE响应错误!");return;}}UpdateData(false);closesocket(Socket);WSACleanup();}参考文献[1]谭浩强. C程序设计(第4版). 清华大学出版社, 2010.[2]苏小红. C语言程序设计(第1版). 高等教育出版社, 2011.[3](美)H.M.Deitel & P.J.Deitel. C程序设计教程. 机械工业出版社, 2005.[4]朱岩、高伟编著标准Windows程序设计Visual C++与MFC及Win32API的应用,1997,北京,人民邮电出版社。

相关主题