




已阅读5页,还剩19页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学学 号:号: 068108210 南阳理工学院 毕业毕业设计论文设计论文 题题 目目 基于 pop3 协议的电子邮件接收程序的设计 学学 院院 软件学院 专专 业业 软件工程 班班 级级 08 级软件工程 7 班 姓姓 名名 指导教师指导教师 南阳理工软件学院 毕业设计(论文) 1 目 录 摘摘 要要.1 1、引 言.3 1.1 课程设计的内容3 1.2 课程设计的要求3 2、设计平台简介.3 2.1 vc+3 3、邮件接收协议.5 3.1 pop3 简介.5 4、设计原理.8 4.1 pop3 交互模型.8 5、课程设计步骤.9 5.1 函数构造.9 5.2 接收邮件的步骤15 6、测试19 6.1 测试目的.19 6.2 测试环境.19 6.3 测试结果.19 2012 年3月26日 南阳理工软件学院 毕业设计(论文) 2 6.4 结果分析.20 7、出现的问题及解决方法20 7.1 设计中出现的问题.20 7.2 解决方法20 参考文献参考文献21 摘摘 要要 电子邮件可以使人们有效地进行电子化的数据异地交换。internet 以电子 邮件服务推动着人类的通信行为不断发展,邮件的接收系统。本论文以 visual c#为开发平台,利用 socket 套接字编程,实现了基于 pop3 协议的邮件接收程 序,介绍了 pop3 协议的原理及电子邮件接收程序的设计与实现方法。 随着internet/intranet的迅猛发展,电子邮件(e-mail)已成为因特网上 非常流行、非常方便的通信方式。电子邮件技术不断进步,邮件协议也不断发 展。目前应用最广泛的电子邮件收件协议是pop3。本文采用微软最新的.net技 术,以visual c#为开发平台,利用socket套接字编程开发了基于pop3协议的邮 件接收程序,现对相关原理及具体设计进行讨论。 关键词关键词 课程设计;电子邮件;接收程序;pop3;socket;visual c# 南阳理工软件学院 毕业设计(论文) 3 1、引、引 言言 随着internet/intranet的迅猛发展,电子邮件(e-mail)已成为因特网上 非常流行、非常方便的通信方式。电子邮件技术不断进步,邮件协议也不断发 展。目前应用最广泛的电子邮件收件协议是pop3。本文采用微软最新的.net技 术,以visual c#为开发平台,利用socket套接字编程开发了基于pop3协议的邮 件接收程序,现对相关原理及具体设计进行讨论。 1.1 毕业设计的内容毕业设计的内容 运用 c#语言设计一个邮件程序实现邮件的接收 1.2 毕业设计的要求毕业设计的要求 (1)按要求编写课程设计报告书,能正确阐述设计结果。 (2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作 精神。 (3)学会文献检索的基本方法和综合运用文献的能力。 (4)在老师的指导下,要求每个学生独立完成课程设计的全部内容。 2、设计平台简介、设计平台简介 2.1 visual c# (1 1)背背景景 vc+是微软公司开发的一个 ide(集成开发环境),换句话说,就是使用 c+的 一个开发平台。vc+是 windows 平台上的 c+编程环境,学习 vc 要了解很多 windows 平台的特性并且还要掌握 mfc、atl、com 等的知识,难度比较大。 windows 下编程需要了解 windows 的消息机制以及回调(callback)函数的原 理;mfc 是 win32api 的包装类,需要理解文档视图类的结构,窗口类的结构, 南阳理工软件学院 毕业设计(论文) 4 消息流向等等;com 是代码共享的二进制标准,需要掌握其基本原理等等。 visual c#作为 visual studio 的一个组件,可以通过安装 visual studio 来获得。vc 作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人 却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的, 严格的来说 vc+不是门语言,虽然它和 c+之间有密切的关系,如果形象点比喻 的话,可以把 c+看作为一种“工业标准”,而 vc+则是某种操作系统平台下的 “厂商标准”,而“厂商标准”是在遵循“工业标准”的前提下扩展而来的。 (2 2)基基本本模模式式 visual c#应用程序的开发主要有两种模式,一种是 win api 方式,另一种 则是 mfc 方式。vc 基于 c,c+语言,主要由是 mfc 组成,是与系统联系非常紧 密的编程工具,它兼有高级,和低级语言的双重性,功能强大,灵活,执行效 率高,几乎可说 vc 在 windows 平台无所不能。最大缺点是开发效率不高。 (3 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+有不可比拟的优势。 南阳理工软件学院 毕业设计(论文) 5 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 所示。 南阳理工软件学院 毕业设计(论文) 6 图 3.2.1 pop3 的状态转换示意图 南阳理工软件学院 毕业设计(论文) 7 表 3.2.1 一些常用的 pop3 命令 pop3 服务器一般使用的是 tcp 的 110 号端口。当客户机与服务器建立 tcp 连接时,pop3 服务器向客户机发回一个问候,交互过程即进入确认状态。此时, 若客户机提供了自己的身份并成功确认,即由确认状态转入处理状态;在这个 状态,用户可用相应的命令处理自己的邮件。在完成相应的处理过程后客户机 发出 quit 命令,则进入更新状态;在此状态下,pop3 服务器释放邮件资源并 返回一个告别响应;最后关闭 tcp 连接。 通过 pop3 命令查询电子邮件时,客户机可以下载指定的邮件,然后对邮件 进行删除或修改操作都无需与服务器进一步交互。客户机向服务器发送命令并 等待响应,pop3 命令采用命令行形式,用 ascii 码表示。服务器响应是由一行 或多行组成,其中,第一行以 ascii 文本+ok, 或-err 开始,分别指出相应的 操作是成功还是失败。 pop3 命令包含一个大小写无关的关键字和一个或多个参量,所有的命令以 ( 回车换行符)作为其结束标志。关键字和参量必须是非控制符的 ascii 码字符。关键字和参量之间,参量和参量之间由一个空格字符分隔开。 关键字长不大于四个字符,每个参量最长可到 40 个字符。 pop3 响应包含一个状态标志和一个跟随其后的附加信息。响应也用 南阳理工软件学院 毕业设计(论文) 8 作为其结束标志。响应最长到 512 字节,其中包括协议定义 了两个状态标志:正确(“ +ok”)和错误(“ -err”)。服务器用大写格式 发送“ +ok”和“ -err”。如果响应是多行的,则每行以结束。当响 应的所有行被发送后,接着发送多行响应的结束标志行,该行仅包含一个句点 “.”和一个对【3】。 4、设计原理、设计原理 4.1 pop3 交互模型交互模型 pop3 发送者发送者 r e a d y “hello” “mail from” “rcpt to” “data”(reque st to get) o k 接接 收收 数数 据据 q u i t 断断 开开 连连 接接 该模型基本原理为:pop3 接收者对 pop3 发送者进行初始化连接,发送者 对接收者发送询问指令“ready”,接收者则向发送者提交所要接收数据的要求, 发送者做出回应,并发送数据。接收者则开始接收数据。发送者发送完数据后, 提出断开请求,并断开连接。数据接收过程完成。 pop3pop3 接收者接收者 初初 始始 化化 连连 接接 南阳理工软件学院 毕业设计(论文) 9 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 1024 class csmtp public; csmtp(lpctstr szsmtpservername,uint nport= smtp_port); virtualcsmtp(); void setserverproperties(lpctstr szsmtpservername, uint nport=smtp_port); cstring getlasterror(); uint getport(); bool disconnect(); bool connect(); virtual bool formatmailmessage(cmailmessage * msg 南阳理工软件学院 毕业设计(论文) 10 ); 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服 南阳理工软件学院 毕业设计(论文) 11 务器的主机名(地址);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类的使用,此外还验 证其他类成员是否合法,或为其赋值。 #include “mysock.h“ /添加套接字类的包含文件 . class cpop3dlg : public cdialog / construction public: void disp(long flag); /在不同的会话阶段显示不同的信息 mysock pop3socket; /套接字类对象实例 cpop3dlg(cwnd* pparent = null); / standard constructor . (2)pop3dlg.cpp实现文件 #include “stdafx.h“ #include “pop3.h“ 南阳理工软件学院 毕业设计(论文) 12 #include “pop3dlg.h“ #include “mysock.h“ /手工添加的包含语句 . bool cpop3dlg:oninitdialog() . / todo: add extra initialization here /用户在这里添加控件成员变量的初始化代码 m_strserver = _t(““); /pop3服务器地址 m_struser = _t(“example“); /邮箱的用户名 m_strpass = _t(“123456“); /口令 m_boldel = false; /下载邮件后不删除 m_info = _t(“); /多文本框清空 return true; / return true unless you set the focus to a control . /以下是事件处理函数和其他成员函数的代码 /当用户点击“连接“按钮时,执行此函数 void cpop3dlg:onbtnconn() /设定pop3类的对话框指针变量,使之指向本对话框,以便传递信息 pop3socket.setparent(this); updatedata(true); /取来用户在对话框中输入的数据 pop3socket.create(); /创建套接字对象的底层套接字 pop3socket.connect(lpcstr)m_strserver,110); /连接pop3服务器 m_info = “; /多文本列表框清空 updatedata(false); /更新用户界面 /当用户点击“断开“按钮时,执行此函数 void cpop3dlg:onbtndisc() 南阳理工软件学院 毕业设计(论文) 13 pop3socket.close(); /当用户点击“查看邮件“按钮时,执行此函数 void cpop3dlg:onbtnview() int i; i = m_ctrlist.getcursel(); /获得用户在组合框中的选择 /获得并显示指定信件的基本属性及信件内容 m_info += pop3socket.getmsgstuff(i); m_info += pop3socket.getmsgbody(i); /在不同的情况下,向用户显示不同的信息 void cpop3dlg:disp(long flag) cstring s; switch(flag) case s_connect: /已连接到服务器,显示信息 s = “已连接到“+m_strserver+“.rn“; m_info+=s; /禁用连接按钮 getdlgitem(idc_btn_conn)-enablewindow(false); /启用断开按钮 getdlgitem(idc_btn_disc)-enablewindow(true); /禁用查看邮件按钮 getdlgitem(idc_btn_view)-enablewindow(false); break; case s_receive:/收到服务器发来的响应,显示它的内容 南阳理工软件学院 毕业设计(论文) 14 m_info+=pop3socket.lastmsg; break; case s_close: /显示关闭连接的信息 m_info+=pop3socket.error; s = “连接已经关闭rn“; m_info+=s; /启用连接按钮 getdlgitem(idc_btn_conn)-enablewindow(true); /禁用断开按钮 getdlgitem(idc_btn_disc)-enablewindow(false); break; case s_getnum: /已经知道了邮箱中信件的总数 s.format(“邮箱中共有 %d 封信rn“,pop3socket.nummsg); m_info+=s; break; case s_getsize: /显示信件的大小 s.format(“信箱中信件大小为:%d字节rn“,pop3socket.sizemsg); m_info+=s; break; case s_endretr: /所有信件已下载完毕,显示信息 s.format(“共下载了 %d 封信件rn“,pop3socket.msgs.size(); m_info+=s; /如果有信件下载,启用查看邮件按钮 if(pop3socket.msgs.size()0) getdlgitem(idc_btn_view)-enablewindow(true); break; updatedata(false); /更新用户界面 /当点击“存储”按钮时,执行此函数。 南阳理工软件学院 毕业设计(论文) 15 void cpop3dlg:onbtnsave() int i; cstring s; i = m_ctrlist.getcursel(); /获得指定信件的基本属性及信件内容 s = pop3socket.getmsgstuff(i); s += pop3socket.getmsgbody(i); cfiledialog dlg(false); if(dlg.domodal()=idok) cfile file(dlg.getpathname(), cfile:modecreate | cfile:modewrite | cfile:typebinary); file.write(lpcstr)s,s.getlength(); file.close(); 5.2 接收邮件的步骤接收邮件的步骤 (1). 建立与服务器的连接。具体工作由 connect 函数完成。部分 connect 函数代码如下所示: bool csmtp:; connect() if(! m_wssmtpservercreate() m_serror=_t(“无法创建套接字!”); delete response_buf; response_buf = null; return false;) if(! m_wssmtpserverconnect(getserverhostname (),getport() 南阳理工软件学院 毕业设计(论文) 16 m_serror = _t(“无法连接到服务器”); m_ssmtpserverclose(); delete response_but; response-buf = null; return falsei; if(! get_response(connect_success) m_serror = _t(“服务器投有响应”); m_wssmtpserverclose(); delete response_buf; response_buf = null; return false;) shelloformat(_t(“helosrn”),local_host); m_wssmtpserverget(lpctstr)shello,shello getlength(); (2)建立连接后从服务器接收邮件。这个工作由 getmessage 函数完成。 getmessage 函数代码如下: bool csmtp:getmessage(cmailmessage * msg) if(! m_bconnected) m_serror = _t(“必须首先创建连接!”); return false;) if(formatmailmessage(msg)=false) return false;) if(transmit_message(msg)=false) return false;) return true;) 前面介绍过电子邮件有其特殊的格式,在这里 formatmailmessage 函数就 是用于格式化邮件信息的。transmit_message 函数将邮件进到服务器上。部分 transmit_message 函数代码如下所示: bool csmtp:transmit_message(cmailmessage * msg) 南阳理工软件学院 毕业设计(论文) 17 sfromformat_t(“mail from:rn” ),(lpctstr)msg 一m_sfrom); m_wssmtpserverget(lpctstr)sfrom,sfrom gctlength(); if(! get_response(generic_success) return falsel; for(int i=o;igetnumrecipients(); i+) msg 一getrecipient(semail,stemp,i); stoformat(_t(“rcpt to;rn”),(lpct str)semail); m_wssmtpserverget( (lpctstr)stemp,stemp getlength(); get_response(generic_success);) stemp=_t(“datarn”); m_wssmtpserverget(lpctstr)stemp,stemp getlength(); if(! get_response(data_success) return false; m_wssmtpserverget(lpctstr)msg 一m_ sheader,g 一m_sheadergetlength(); stemp = cook_body(msg); m_wssmtpserverget(lpctstr)stemp,stemp getlength(); stemp = _t(“rn.rn”); m_wssmtpserverget(lpctstr)stemp,stemp. getlength(); if! get_response(generic_success) return false; return true; 在此函数中,首先发送 mail 命令,通知服务器收信人的邮箱地址。然后发 进 rcpt 命令,通知服务器发信人的邮箱地址。需要注意的是,在有多个发信人 南阳理工软件学院 毕业设计(论文) 18 时,必须为每个发信人都发送一次 rcpt 命令,通知服务器将要进行邮件数据的 传输。此后,分别将邮件头和邮件体从服务器上接收下来。这里需要注意一点: 当邮件数据接收完毕后,需要额外发送一个“回车换行回车/换行”信号, 以通知邮件数据传输完毕 (3). 当邮件接收完毕后,一般不需要保持与 smtp 服务器的连接,而断 开的工作由 disconnect 函数完成。disconnect 代码如下:
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 买社保劳务合同标准文本
- 二建解聘合同样本
- 以店面入股合同样本
- 做门订购合同样本
- 供应石子合同样本
- 买卖肉牛合同标准文本
- 七年级下册生物复习提纲
- 仙桃花卉租赁合同样本
- 上海境外旅游合同标准文本
- 书法报名合作合同样本样本
- 浙江省温州市2025届高三下学3月二模试题 英语 南瓜雕刻比赛故事续写 讲义
- 县人民医院开展产前筛查技术服务可行性研究报告
- 小红书运营:小红书账号运营培训课件
- 2025年上半年上海青浦新城发展(集团)限公司自主招聘9名易考易错模拟试题(共500题)试卷后附参考答案
- 墙纸墙布施工工艺标准化流程
- 水泥混凝土路面翻修施工方案详解
- 《射雕英雄传》好书读后感
- DB51T 2049-2015 建筑消防设施检测规范
- 【MOOC】风景背后的地貌学-华中师范大学 中国大学慕课MOOC答案
- 2024版《安全生产法》考试题库附答案(共90题)
- 企业天然气转让协议书范文范本
评论
0/150
提交评论