还剩20页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
第一章前言
1.1课题来源当前流行的各大邮件客户端软件除了最主要的收发信件之外,功能越来越复杂,但是人们平常真正用到的功能很少,很多功能尤其对于那些计算机知识相对缺乏的人来说,更加显得太过于华丽而不太实用有鉴于此,在了解RFC底层协议的基础上,本人__了这个各种功能相对简单实用的邮件客户端程序,简化了很多不必要的功能
1.2____介绍____(简称E-__il)又称____、电子邮政,它是一种用电子手段提供信息交换的通信方式它是全球多种网络上使用最普遍的一项服务这种非交互式的通信,加速了信息的交流及数据传送,它是一个简易、快速的方法通过连接全世界的Internet,实现各类__的传送、接收、存储等处理,将邮件送到世界的各个角落到目前为止,可以说____是Internet资源使用最多的一种服务,E-__il不只局限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息____不是一种“终端到终端”的服务,是被称为“存储转发式”服务这正是____系统的核心,利用存储转发可进行非实用时通信,属异步通信方式即信件发送者可随时随地发送邮件,不要求接收者同时在场,即使对方现在不在,仍可将邮件读取信件,不受时空限制在这里,“发送”邮件意味着将邮件放到收件人的信箱中,而“接收”邮件则意味着从自己的信箱中读取信件,信箱实际上是由文件管理系统支持是一个实体因为____是通过邮件服务器(__il server)来传递的通常__il server 是执行多任务操作系统UNIX的计算机,它提供24小时的____服务,用户只要向__il server管理人员申请一个信箱账号,就可使用这项快递的邮件服务
1.3____的工作原理____的发送是通过____简单传速协议(______ __il Transfer Protocol,简称__TP)来完成的,____的接受是通过POP3协议来实现它是Internet下的一种____通信协议____的基本原理,是在通信网上设立“____系统”,它实际上是一个计算机系统系统的硬件是一个高性能、大容量的计算机硬盘作为信箱的存储介质,在硬盘上为用户分一定的存储空间作为用户的“信箱”,每位用户都有属于自己的一个____并确定一个用户和用户可以随意修改的口令存储空间包含存放所收信件、编辑信件以及信件存盘三部分空间,用户使用口令开启自己的信箱,并进行发信、读信、编辑、转发、存档等各种操作系统功能主要由软件实现
1.4__环境及运行环境__环境 AMD AthlomTM 512 内存,80G 硬盘 Microsoft(R)Windows XP Professional Micosoft Visual Studio 2003 (C Sharp) Micosoft Developer Network for Visual Studio.NET 2003Internet pentium 2及以上处理器,32M以上内存,4G以上硬盘Micosoft windows 9X/NT操作系统800*600或以上的屏幕分辨率确保机器上__有.Net FrameWork
1.0或者以上版本第二章系统需求分析
2.1系统功能需求分析____系统需求实现的功能包括新建用户的帐号,接受简单邮件或带附件的邮件,发送简单邮件或发送带附件的邮件,____编号,____分类管理,通信薄管理为了使用通信薄,于是添加了对用户资料的增加,修改,取消操作软件的总体架构图1软件构架图系统功能图2系统功能图系统总体用例图图3系统总体用例图
2.2数据库需求分析在对系统进行系统需求分析的基础上,可以得到系统在处理数据时会用到下面所示的数据项和数据结构1)用户信息帐号名称,用户名,__,____地址,__TP服务器,__TP端口号,POP3服务器,POP3端口号2)通信薄信息姓名,邮箱地址,__号码,__号,手机号码,通信地址第三章系统设计
3.1系统的流程设计邮件客户端最重要的两个功能就是接收邮件和发送邮件,其中接收邮件的流程图如图4所示从流程图中可以看出,接收邮件时首先要创建一个TCP连接到POP3服务器如果连接不成功就退出执行,连接成功后再发送USER和PASS命令进行身份验证,身份验证通过后再通过STAT命令获得要接收的邮件数,当邮件数大于0时,通过RETR命令逐个接收邮件接收邮件完毕后,检查帐号中是否保留服务器上的邮件设置,如果是就不作任何操作,否则从服务器上删除已经接受的邮件最后关闭连接完成邮件接收图4接收邮件流程图发送邮件的流程图,先检查“发信箱”目录中是否有待发邮件,如果有就逐个发送这些邮件,流程图如图5所示其发送过程,首先需要创建一个TCP连接,连接到__TP服务器,如果连接不成功就退出程序连接成功后发送USER和PASS命令进行身份验证身份验证通过后发送邮件,如果发送成功就关闭连接,更新数据库,完成邮件发送任务图5发送邮件流程图
3.2__TP协议的研究由于要__的是邮件客服端程序,就不得不用到__TP协议和POP协议而我个人负责的是邮件发送功能的实现,因此就必然会涉及到__TP(______ __il Transfer Protocol)协议__TP被用来在因特网上发送邮件,该协议规定了一些基本的命令和方法使客服端与服务器进行交互,以达到发送邮件的目的__TP介绍简单邮件传输协议(__TP)的目标是可靠高效地传送邮件,它__于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道__TP的一个重要特点是它能够在传送中接力传送邮件,传送服务器提供了进程间通信环境(IP__),此环境可以包括一个网络,几个网络或一个网络的子网理解到传输送系统(或IP__)不是一对一的是很重要的进程可能直接和其它进程通过已知的IP__通信邮件是一个应用程序或进程间通信邮件可以通过连接在不同IP__上的进程跨网络进行邮件传送更特别是,邮件可以通过不同网络上的主机接力式传送__TP模型__TP设计基于以上通信模型针对用户的邮件请求,发送__TP建立于接收__TP之间建立一个双向传送通道接收__TP可以是最终接收者也可以是中间传送者__TP命令由发送__TP发出,由接收__TP接收,而应答则反方面传送一旦传送通道建立,__TP发送者发送__IL命令指明邮件发送者如果__TP接收者可以接收邮件则返回OK应答__TP发送者再发出RCRT命令确认邮件是否接收到如果__TP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次当接收者到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答__TP提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者在不同一个传送服务下时,通过中继__TP服务器传送为了能够对__TP服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称__IL命令参数是回复路径,它指定邮件从何处来;而RCPT命令的参数是转发路径的,它指定邮件向何处去向前路径是源路径,而回复路径是返回路径(它用于发生错误时返回邮件)当同一个消息要发往不同的接收者时,__TP遇到了向不同接收者发送同一份数据的__品的问题,邮件命令和应答有一个比较奇怪的语法,应答也有一个数字代码在下面,例子中可以看到哪些使用实际的命令和应答完整的命令和应答在第四节命令与应答对大小写不敏感,也就是说,命令和应答可以是大写,小写或两者的混合,但这一点对用户邮件名称却不一定是对的,因为有的主机对用户名大小写是敏感的这样__TP实现中就将用户邮箱名称保留成初始时的样子,主机名称对大小写不敏感命令与应答由ASCII字母表组成,当传送服务提供8位子节传送通道,每7位字符正确传送,而最高位被填充为0当指定一般的命令或应答格式后,参数会由一些类似于语言的字符串表示出来,如“string”或“reverse-path”,这里尖括号表示这是一种类似于语言的变量
3.3__TP协议的命令和应答__TP协议的命令__TP命令定义了邮件传输或用户定义的系统功能它的命令是由CRLF结束的字符串而在带有参数的情况下,命令本身由SP和参数分开,如果未带参数可以直接和CRLF连接邮箱的语法格式必须和接收站点的格式一致__TP的应答码对__TP命令的响应是多样的,它确定了在邮件传输过程中请求和处理的同步,也保证了发送__TP知道接收__TP的状态每个命令必须有且只有一个响应__TP响应由三位数字组成,其后跟一些文本数字帮助决定下一个应该进入的状态,而文本对人是有意义的三位的响应已经包括了足够的信息,不用再阅读文本,文本可以直接抛弃或者传递给用户特别的是,文本是与接收和环境相关的,所以每次接收到的文本可能不同正规的情况下,响应由下面序列构成三位的数字,SP一行文本和一个CRLF或者也可以是一个多行响应只有EXPN和HELP,命令可以导致多行应答,然而,对所有命令,多行响应都是允许的REPLYCODESBYFUNCTIONGROUPS500格式错误,命令不可识别(此错误也包括命令行过长)第四章RFC822说到发送和接收邮件,就不得不提RFC822了RFC822的全称是“ARPA因特网文信件格式的标准”(StandardfortheFor__tofARPAInternetTextMessages)该标准提供了邮件内容的格式和相关语义
4.1RFC822简单介绍RFC822规定的____内容全部由ASCII字符组成,就是通常所说的文本文件,因而标准将它称为Internet文本信件(InternetTextMessages)从直观上看,信件非常简单,就是一系列由ASCII字符组成的文本行,每一行以回车换形符结束从组织上看,信件内容结构分为两大部分,中间用一个空白行(只有CRLF符的行)来分隔第一部分称为信件的头部,包括有关发送方、接收方、发送日期等信息第二部分称为信件的体部,包括信件内容的正文文体信头是必需的,信体是可选的,即信体可有可无如果不存在信体,用作分隔的空白行也就不需要在信体中,也可以有用作分隔的空白行这样设计的信件便于进行语法分析,提取信件的基本信息在RFC822中规定,信件体就是一系列的向收信人表达信息的文本行,比较简单,可以包括任意文本并没有附加的结构信件头则具有比较复杂的结构,在下一小节中详述
4.2信件的头部信头一般格式信头的结构比较复杂,信头由若干信头字段(headerfield)组成,这些字段为用户和程序提供了关于信件的信息要了解信头的结构就要弄清楚各种信头字段所有的信头字段都具有相同的语法结构,从逻辑上说,包括四部分,字段名(fieldname)紧跟冒号“”(colon),后跟字段体(fieldbody),最后以回车换形符(CRLF)终止即信头字段=字段名字段体CRLF字段名必须由除了冒号和空格以外的可打印US—ASCII字符(其值在33和126之间)组成,大多数字段的字段名称由一系列字母,数字组成,中间经常插入横线符字段名告诉____软件如何翻译该行中剩下的内容字段体可以包括除了CR和LF之外的任何ASCII字符但是其中的格式的空格,加括号的注释,引号和多行都比较复杂,另外,字段体的语法和语义依赖于字段名,每个类型的字段有特定的格式结构化字段和非结构化字段每个字段包含的信息不同,字段大体可以分为结构化字段和非结构化字段结构化字段有特定的格式,由语法分析程序检测Sender字段就是一个很好的例子,它的字段内容是信箱,有一个离散的结构非结构化的字段含有任意的数据,没有固定格式例如,Su__ect字段可以含有任意的文字,并且没有固定格式非结构化的字段数量较少,只有Su__ect、Comments、扩展字段、非标准字段、IN—Reply和Referen__s等所有其它字段都是结构化的尽管E__il信件的总体结构非常简单,但一些信头字段的结构是很复杂的下面介绍一些大多数字段共有的元素
(1)空白符像其它文本文件一样,空白符包括空格符(ASCII码32)和制表符TAB(ASCII码19)此外,行末的回车换形符CRLF也应算是空白符使用空白符可以对字段进行格式化,增加它的可续性例如,每个字段间用CRLF来分离,在字段内用空格来分隔字段名和字段内容在Su__ect后面的冒号和内容之间插入空格字符,会使字段结构更加清晰在E__il中空白符的使用并没有固定的规则,但应当正确地使用,仅在需要时才使用空白符,以便接收软件进行语法分析
(2)注解注解是由括号括起来的一系列字符,例如,(这份礼物)注解一般用在非结构化的信头字段中,没有语法语义,仅为人提供了一些附加的信息如果在加引号的字符串中包括在括号中的字符,那是字符串的一部分,不是注解在解释信件的时候,会将注解忽略,可以用一个空格字符代替它们,这样就什么也不会破坏
(3)字段折叠每个信头字段从逻辑上说应当是一个由字段名、冒号、字段体和CRLF组成的单一的行,但为了书写与显示的方便,增加可续行,也为了符号1000/80的行字符数的限制,可以将超过80个字符的信头字段分为多行,即对于比较长的字段,可以分割成几行,形成折叠在结果化和非结构化字段中都允许折叠,第一行后面的行称为信头字段的续行续行都以一个空白符开始,这种方法称为折叠(folding),例如标题字段Su__ect Thisisatest可以表示为Su__ect Thisisatest反之,将一个被折叠成多行的信头字段恢复到它的单行表示的过程叫做去折叠,只要简单地移除后面跟着空格的CRLF,将折叠空白符CRLF转换成空格字符,就可以完成折叠在分析被折叠的字段的语法时,要把一个多行的折叠字段展开为一行,根据它的非折叠的形式来分析它的语法与语义
(4)字段大小写字段名称是不区分大小写的,所以Su__ect、su__ect或SU__ECT都一样不过字段名称大小写有习惯的常用形式,如主题字段的大小写形式通常为Su__ect字段体的大小写稍微复杂点,要视情况而定比如Su__ect后面的字段体,其中的大写可能就是缩写的专用名词,不能改动
(5)扩展字段如果想在信头中加入RFC822中没有规定的字段,就需要创建非标准字段方法非常简单,只要在自定义的信头字段名的前面使用X-前缀RFC822将这种方法称为扩展字段事实上已经有许多扩展字段被广泛应用,但没有标准定义例如X—LOOP字段X—LOOP字段用来防止邮件的循环传送过滤或邮件列表处理程序,可以给它处理的每个信件增加一个X—LOOP字段,以后就可以根据这个字段中含有的特别值,判断一个信件是否被循环传送如果确认邮件发生了循环,过滤或邮件列表处理程序就可以用不同的方式处理该信件◆X—__iler字段X—__iler字段用于指示什么样的程序产生了这个信件,它是使用最广泛的扩展字段产生邮件的软件可以为所有发送的信件增加合适的X—__iler字段,该字段不仅含有软件的名称,还包含软件的版本号例如软件名为Littlefox__iler,版本为V
1.0,可以将“X—__iler Littlefox__ilerV
1.0”加到邮件信头中去图6列出了一些在因特网____可以找到的普通关键字,以及使用它们的目的关键字含义From发送方地址TO接收方地址Cc__副本地址Date信息创建日期Su__ect信息主题Reply—To回复地址X—Charset使用的字符集(通常为ASCII)X—__iler发送信息所使用的软件X—Sender发送方地址的副本X—Fa__经编码的发送方面孔的图像整个系统的核心是收发信件的操作,因此为了方便维护,以后的升级,故将这两个最主要的操作写成类库(.dll)的形式,以组件的形式加载到主程序中,而且其它的功能如果需要的话,也可以通过这样的组件的形式增加到主程序中这也体现了CSharp这一新的微软主推语言的方便和高效而且这样做也方便了我们小组的程序的顺利结合第五章系统实现
5.1发送邮件类__tp__il是发送邮件的核心,类名为__tp__il,隶属于命名空间__ilSend封装了发送邮件的具体实现方法,也是具体的RFC用代码实现的过程而用户通过具体的操作接口,接收与__tp__il类通过交互操作来实现用户发送信件的操作1)网络连接类及实例TcpClienttc为TCP网络服务提供客户端连接类TcpClient实例对象tcTcpClient类提供了一些简单的方法,用于在同步阻塞模式下通过网络来连接、发送和接收流数据而实例化的过程也是连接__TP服务器的过程它的重载方法之一的两个参数一个为服务器名称字符串,另一个为服务器的埠2)提供用于网络访问的基础数据流及其实例NetworkStreamns此类提供访问网络的基础数据流的方法其中最基本也是最重要的两个方法就是Write()和Read方法,至于参数不再次描述3)一维字符串数组变量FilePath此字符串数组主要用来存放用户选择的附件的绝对路径名,并在发送带附件的邮件时用到4发送邮件所需的基本参数比如用于E__TP登录检验用的用户名、__,发送邮件需要的收信人,发信人地址以及主题等等在此不再陈述1)重载的构造函数__tp__il()此函数主要用于在初始化过程中,把用户选择的附件的路径以参数的形式传给FilePath2)添加附件的函数AddAttachment传给FilePath的路径,通过这样一个函数就可以循环的动态的添加到LIST接口的一个对象中了,方便以后在具体的实现过程中使用3)得到上传的附件的文件流GetStream由于在网络中的操作都是以网络流的形式来实现的,因此先将上传的附件转换成文件流,然后再用Write的方法把这些附件的文件流写入到网络中,来完成发送附件的操作具体实现代码如下所示///sum__ry///得到上传附件的文件流////sum__ry///paramname=”FilePath”附件的绝对路径/paramPrivatestringGetStreamstringFilePath{Try{//新建文件流对象BFileStr.Length];FileStr.Readby0by.Length;FileStr.Close;R}Catch{MessageBox.Show“可能你要打开的文件的属性是只读的!”,“请检查权限”;Returnnull;}}4将字符串编码为Base64字符串的函数Base64Encode由于E__TP的LOGIN认证机制是采用Base64编码,当用户发出AUTHLOGIN的命令后,服务器返回334的应答码等待用户输入如果身份确认后服务器返回235的应答码,否则返回失败信息所以要将用户名和__转换Base64编码然后再发给服务器此函数的作用就是把给定的字符串转换成相应的Base64编码的字符串5)发送__TP命令的函数SendCom__nd的函数作用是把__TP命令的字符串转换成对应的字节型值(C#中规定的Write方法只能写入字节型的数据)然后写入网络中,如果操作成功就返回一个标志为真的布尔型变量,如果操作失败或者发生异常就返回标志为假的布尔型变量具体代码如下所示///sum__ry///发送__TP命令////sum__ryprivateboolSendCom__ndstringstr{Byte[]WriteBuffer;Ifstr==null||str.Trim==String.Empty{returntrue;}try{ns.WriteWriteBuffer0WriteBuffer.Length;}Catch{Errmsg=”网络链接错误”;Returnfalse;}returntrue;}6接受服务器应答的函数RecvResponse它的作用就是从网络流中读取服务器返回的字节型的信息,将其转换成字符串型的变量,然后将其返回,可以通过其返回值来判断操作是否成功具体实现代码如下所示///sum__ry///接受__TP服务器回应////sum__ryprivatestringRecvResponse{intStreamSize;stringReturnValue=string.Empty;byte[]ReadBuffer=newbyte
[1024];try{StreamSize=ns.ReadReadBuffer0ReadBuffer.Length;}catchEx__ptionex{MessageBox.Showex.ToString;return“false”;}ifStreamSize==0{returnReturnValue;}else{returnReturnValue;}}7重载的函数Dialog它们的作用是与服务器交互,发送命令并接收回应不同的是参数是字符串类型的那个函数,每个发送一条命令,并接受服务器的响应,根据响应的信息来判断交互的结果是否成功而参数是字符串数组的函数每次发送的是一组命令,用于和服务器的交互,这个函数主要是用于E__TP服务器的验证的功能,因为验证的过程是一个等待然后又输入的过程,因此将它们放在一个数组中有利于理解和操作而它们的实现主要是通过调用上面的发送__TP命令函数SendCom__nd以及接受__TP服务器响应的函数RecvResponse来实现的具体的代码如下所示///sum__ry///与服务器交互,发送一条命令并接收回应////sum__ry///paramname=”str”一个要发送的命令/param///paramname=”errstr”如果错误,要反馈的信息/paramprivateboolDialogstringstrstringerrstr{ifstr==null||str.Trim==””{returntrue;}ifSendCom__ndstr{stringRR=RecvResponse;ifRR==’’false”{returnfalse;}try{stringRRCode=RR.Substring03;ifRightCodeHT[RRCode]!=null{returntrue;}else{ifErrCodeHT[RRCode]!=null{errmsg+=RRCode+ErrCodeHT[RRCode].ToString;errmsg+=enter;}else{errmsg+=RR;}errmsg+=errstr;returnfalse;}}catch{MessageBox.Show“请检查附件的大小”;ruturnfalse;}}else{returnfalse;}}发送一组命令主要用于服务器验证的重载函数为///sum__ry///与服务器交互,发送一条命令并接收回应////sum__ryprivateboolDialogstring[]strstringerrstr{forintI=0;istr.Length;i++{//如果在身份验证阶段有一个不成功,就返回错误标志位if!dialogstr[i]””{errmsg+=enter;errmsg+=enter;returnfalse;}}//身份验证全部正确的话,则返回正确标志位returntrue;}8邮件发送程序Send__il这是整个程序的核心部分具体的实现__TP协议的程序正是通过它一步一步实现并最终实现发送简单邮件甚至带附件的邮件的功能,而它的实现是调用以上给出的各个函数的结果以下就是简单的通过几个__TP命令的格式来实现privateboolSendE__il{//连接网络try{//建立一个TCP连接tc=newTcpClient__ilserver__ilserverport;}catch{MessageBox.Show“连接失败””请确认”;returnfalse;}//获取当前流的资料ns=tc.Getream;__TPCodeADD;//验证网络连接是否正确if(RightCodeHT[RecvResponse.Substring03]==null){returnfalse;}string[]SendBuffer;stringSendBuffer;//进行__TP验证//具体的__TP命令与代码的结合if(E__tp){SendBuffer=newString
[4];SendBuffer
[0]=”EHLO”+__ilserver+enterSendBuffer
[1]=”AUTHLOGIN”+enterSendBuffer
[2]=Base64Encodeusername+enterSendBuffer
[3]=Base64Encodepassword+enterif!DialogSendBuffer”__TP服务器验证失败,请核对用户和,__”returnfalse;}else{sendBufferstr=”HELO”+__ilserver+enter;if!DialogSendBufferstr””returnfalse;}SendBufferstr=””__ILFROM:”+From+””+enter;if!DialogSendBufferstr”发件人地址错误,或不能为空“returnfalse;//把传过来的收件人的地址分割然后提交给服务器stringsplit=””;string[]address=Regex.SplitRecipientsplit;SendBuffer=newstring[address.Length];forinti=0;iSendBuffer.Length;i++{SendBuffer[i]=”RCPTTO:”+address[i]+””+enter;}if!DialogSendBuffer”收件人地址有误”returnfalse;SendBufferstr=”DATA”+enter;if!DialogSendBuffer””returnfalse;SendBufferstr=”From:”+FromName+””+From+””+enter;SendBufferstr+=enter+””+enter;if!DialogSendBuffer”错误信件信息”returnfalse;SendBufferstr=”QUIT”+ENTER;if!DialogSendBuffer”断开连接时错误”returnfalse;//关闭流对象ns.Close;//关闭连接tc.Close;FilePath=null;returntrue;}以上即为发送不带附件的邮件__TP命令用代码实现的过程
5.2接收邮件类1)网络连接类的实例popClient,该实例用于连接POP3服务器2)int变量count是用来记录接收邮件的数目3)定义字符串stringPOPServerport,login,password分别代表服务器名,服务器端口号,用户帐号,用户__1)连接服务器函数connect在接收邮件前,首先要调用connect()方法连接POP3服务器,并调用GetMessageCount方法获得需要接收邮件的数目返回值为要接收的邮件数目,如果为0表示邮件没有接收其实现的代码如下所示publicintconnect{//连接POP3服务器popClient.Disconnect;popClient.ConnectPOPServerintParseport;popClient..Authenticateloginpassword;//得到邮件总数count=popClient..GetMessageCount;msgs.Clear;returncount;}2接收邮件函数re__ive__il当读取出邮件总数时,就进行接收邮件操作,同时也进行接收附件代码如下所示为publicvoidre__iv__ilintbeginIndexintendIndex{//收取邮件forinti=beginIndex;i=endIndex;i++{re__ive__ili;}}publicvoidre__iv__ilintindex{ifindexcountindex=count;OpenPOP.MIMEParser.Messagem=popClient..GetMessageCountindexfalse;try{msgs.Addindexm;}catchArgumentEx__ption{}}publicArraylistgetAttachmentName{ArraylistAttachmentName=newArraylist;intcount=m.AttachmentCount;forinti=0;icount;i++{ifm.GetAttachmenti.NotAttachmentcontinue;AttachmentName.ADDm.GetAttachmentFileNamem.GETAttachmenti;}returnAttachmentName;}publicvoidgetAttachmentsstrings__ePath{m.S__eAttachmentss__ePath;}3判断邮件内容格式函数showMessage()该函数的功能是在阅读邮件内容时提供两种格式给用户选择,一种是HTML格式,另一种是文本格式用户可以根据要求来选择适当格式阅读邮件代码实现如下privatevoidshowMessage(boolHTML){if(!HTML){TextBos___Box=newTextBox;___Box.Multiline=true;___Box.Text=___message;___Box.ReadOnly=true;___Panel.Controls.ADD___Box;___Box.Dock=DockStyle.Fill;changeButton.Text=”切换至HTML格式”;}else{WebBrowser___Box=newWebBrowser;___Box.DocumentText=___message;___Panel.Controls.ADD___Box;___Box.Dock=DockStyle.Fill;changeButton.Text=”切换至文本格式”;}textFrom.Text=m.From+””+m.FromE__il+””;textTo.Text=m.to
[0];}
5.3AddExtra类这个附加的小类提供一些返回当前系统时间,获取主机名,主机IP,及有关帮助的功能,在此仅对帮助信息中的“关于”操作函数稍加说明因为它说明了在CSharp中调用windowAPI函数所需如下几个步骤——usingsystem..runtime.interopservi__s;而调用显示关于对话的函数ShellAbout还需要用到两个命名空间如下所示——usingsystem..Reflection;——usingsystem.Diagnostics;[D||Import“shell
3.dll”]StaticexternintshellaboutintPtrhwndstringszAppstringszOtherStuffIntPtrhicon;Assenblyass=Assembly.GetExecutingAssembly;FileVersionInfomyVersion=FileVersionInfo.GetVersionInfoass.Location;ShellAboutthis.Handle”邮件收发系统#”,”版本”+myVersion.File__jorPart+”.”+myVersion.File__jorPart+”.”至此就完成了在CSharp中调用windowAPI函数的过程第六章系统运行界面
6.1系统的主界面主界面显示用户名,主机名,相关的注册信息以及使用时间该界面的代码保存在System__nage.cs和System__nage.resx文件中创建界面时主要使用__i__enul,i__geaccount,i__gelistl,timerl控件
6.2新用户注册页面注册用户时在相应的位置输入邮箱地址,用户名,__,帐号名称等信息数输入完毕后进行检测账户名确认正确是执行下一步操作当你邮箱地址输入错误或者帐号名已经存在系统会检测到错误并且给出相应的提示!在实现检查帐号名是否存在代码中调用了Accountoperate类的检查帐号是否占用的函数,并返回一个标志位
6.3新用户设置界面图8设置界面完成新用户注册后执行下一步操作是设置POP3服务器和__TP服务器设置以及端口号的设置设置完这个步骤后就能创建一个新用户邮件收发操作首先调用Dispose()方法进行清空所有正在使用的资源,然后用__tpPop方法来调用有关信息,完成设置后进行数据库插入操作
6.4发送邮件界面在新建帐号的过程中已经制定了邮件地址和帐号名称,所有默认的以这些参数来发送邮件通过调用参数的不同程序会自动的调用相应的代码来执行不同的操作该界面主要使用了__i__enul,openfiledialogl,imlsend__il,s__efiledialogl,imlattachment,conattachment等控件发送简单的邮件运行界面如下图9发送纯文本邮件和简单的邮件不同之处在于多了发送附件的功能,软件模拟Fox__il里面发送邮件时,在程序的下面自动显示增添的附件的名称,以及图标等信息并且邮件支持添加,删除,排列图标等功能运行界面如下所示图10发送带有附件的邮件
6.5验证邮件发送是否成功邮件发送出去之后,弹出对话框,提示信件发送成功图11验证发送的邮件是否成功
6.6邮件接收功能选择用户,__接收,可以接收邮箱中的邮件第七章系统测试
7.1测试的目的软件的目的就是为了更快,更早地将软件产品或软件系统中所存在的各种问题找出来,并促使程序员尽快地解决这些问题,最终及时地向客户提供高质量地软件产品要做到这一点,确保找出系统中所有或绝大部分的软件缺陷,必须建立在软件测试非常有用的基本方法之上软件测试的基本原则是站在用户角度,对产品进行全面测试,尽早尽可能多地发现缺陷,就是说软件测试的目的就是发现错误,发现的越多测试的质量越高发现错误后并且负责跟踪和分析产品中的问题,对不足之处提出质疑和改进一件零件缺陷是一种思想,足够好是测试的原则
7.2同一__TP服务器发送邮件的测试这个方面测试的是,用户登录一个服务器来发送一封邮件的测试
7.3利用不同的__TP服务器发送邮件的测试这个方面的测试是指利用不同的邮箱来发送邮件,至于测试的分类雷同于利用同一服务器发送邮件的测试,所以不在陈述
7.4同一POP3服务器接收邮件的测试首先选择账户登录服务器来接收邮件当接收完邮件时系统会显示服务器名,用户名,接收人,发送人,邮件数以及邮件的主题和内容该软件能接收到所有正确无误的邮件经过这些验证可以证明软件支持接收同一服务器的邮件
7.5不同的POP服务器接收邮件的测试通过发送邮件软件一样能接收到邮件内容并且正确无误通过这次验证可以证明该软件支持接收不同服务器的邮件总之,通过以上的各方面的测试,使我改正了代码中的许多不合理以及错误之处,最终也证明了,我们的软件系统是支持多种服务器,支持多附件发送的____第八章总结这篇邮件客户端系统,我负责的是邮件发送功能在熟悉了专门用于发送邮件的__TP协议以及RFC规定的邮件的格式的基础上,运用了微软推出的C#这一新型的面向对象语言的便利性和灵活性,从__TP协议规定的底层命令做起,一步步的与服务器进行交互操作,最终实现发送多附件多接收人的功能其中,具体的和服务器的交互操作,都封装了在__tp__il.dll这个动态链接库里面了而为了方便最终的调用和整合,所有的有关后台操作发送邮件的类以及其他的附加功能的类,全部都归属于__ilSend这个命名空间了在力求达到Fox__il功能的同时,又加了一点个人的思想并把它体现到了这一软件上最主要的体现就新建帐号的提前检测这一特色上,这一功能类似于很多Web页面的“检测新帐号”的功能,这样就免去了用户一直到确定注册完成时,才因为账户已经被使用而注册失败的麻烦总之,通过这次的编程,使我对网络编程有了一个很好的认识和锻炼,也使我对CSharp这一语言的掌握程度又上了一个新台阶,虽然编出来的软件不能和功能强大的Fox__il相提并论,但是相信它简单,易操作性,更多了几分实用性在以后的日子,随着我的技术提高和思想的成熟,我一定会把它做的更好,更趋近于______
[1]SimonRobinsonK.ScottAllen等.C#高级编程[M].清华大学出版社,2002
[2]TomArcher.C#技术__[M].清华大学出版社,2002
[3],2001
[4]罗军舟,杨明等TCP/IP协议及网络编程技术[M].清华大学出版社,2004
[5]TimParker.TCP/IP协议及网络编程技术[M].机械工业出版社,2000
[6]周存杰.VisualC#.NET网络核心编程[M].清华大学出版社,2002
[7]电脑编程技巧与维护__社.C#编程技巧典型案例解析[J].中国电力出版社,2005
[8]马金虎,朱力勇编写基于__TP网络应用程序[J].电脑爱好者,2003
[9]代继红.__TP认证机制模块化设计及实现[N].中南民族大学学报,2005致谢本次毕业设计是在罗老师的精心指导下完成的我借此机会向他表示衷心的感谢!同时,也对计算机科学与技术系的全体老师的帮助和指导表示感谢!另外,还要感谢在我进行毕业设计过程中给予我帮助的同学最后,对阅读和评审本论文的各位专家表示衷心的感谢!发送邮件接收主要功能选择主界面用户通讯薄管理客户端软件____接收系统____接收系统附加功能各种错误的提示简单邮件接收带有附件的邮件接收简单邮件发送带有附件的邮件发送____编写____的分类管理用户新建帐号发送邮件纯文本邮件带附件邮件接收邮件开始连接服务器连接成功?登录服务器登陆成功获得邮件数目邮件数0接受全部的邮件保留服务器上的邮件?删除邮件关闭连接退出开始检查发信箱中的待发邮件待发邮件?连接服务器连接成功__TP服务器需要身份验证?身份验证身份验证成功?发送待发邮件发送成功关闭连接更新数据库获得下一个邮件退出。