成都电子机械高等专科学校计算机工程系成都电子机械高等专科学校专周报告课程名称C#专周专周题目电子邮件客户端程序姓名邓建班级09531学号27指导教师杨勇设计时间2010-12-20—2010-12-24成都电子机械高等专科学校计算机工程系成都电子机械高等专科学校计算机工程系目录一、系统分析1.用户需求2.系统功能需求二、系统概要设计1.系统开发环境2.系统运行环境总结设计三、命名控件MailSend1.发送邮件类SmtpMail2.AddExtra类3.AccountHandle类4.TreeView显示四、邮件运行时的界面新建邮件帐1.发送邮件界面五、结论及总结六、参考文献成都电子机械高等专科学校计算机工程系电子邮件又称电子信箱,电子邮政,它是一种利用电子手段提供信息交换的通讯方式。电子邮件在当今社会中扮演了一个很重要的角色。越来越多的人在使用它。而且用它的人数势必会继续增加。一.系统分析1.用户需求电子邮件不是一种“终端到终端”的服务,是被称为“存贮转发式”服务。这正是电子信箱系统的核心,利用存贮转发可进行非实时通信,属异步通信方式。即信件发送者可随时随地发送邮件,不要求接收者同时在场,即使对方现在不在,仍可将邮件立刻送到对方的信箱内,且存储在对方的电子邮箱中。接收者可在他认为方便的时候读取信件,不受时空限制。在这里,“发送”邮件意味着将邮件放到收件人的信箱中,而“接收”邮件则意味着从自己的信箱中读取信件,信箱实际上是由档管理系统支持的—个实体。因为电子邮件是通过邮件服务器(mai1server)来传递档的。电子邮件的工作原理:(1)电子邮件系统是一种新型的信息系统,是通信技术和计算机技术结合的产物。电子邮件的传输是通过电子邮件简单传输协议(SimpleMailTransferProtocol,简称SMTP)这一系统软件来完成的,它是Internet下的一种电子邮件通信协议。(2)电子邮件的基本原理,是在通信网上设立“电子信箱系统”,它实际上是一个计算机系统。系统的硬件是一个高性能、大容量的计算机。硬盘作为信箱的存储介质,在硬盘上为用户分一定的存储空间作为用户的“信箱”,每位用户都有属于自己的—个电子信箱。并确定—个用户名和用户可以自己随意修改的口令。存储空间包含存放所收信件、编辑信件以及信件存档三部分空间,用户使用口令开启自己的信箱,并进行发信、读信、编辑、转发、存档等各种操作。系统功能主要由软件实现。(3)电子邮件的通信是在信箱之间进行的。用户首先开启自己的信箱,然后通过键入命令的方式将需要发送的邮件发到对方的信箱中。邮件在信箱之间进行传递和交换,也可以与另—个邮件系统进行传递和交换。收方在取信时,使用特定账号从信箱提取。我们开发的这个电子邮件客户端程序只是一个各种功能相对简单实用的邮件客户端程序,简化了许多不必要的功能。我们就利用SMTP和Pop协议从底层开发了这个软件。SMTP全称是简单邮件传输协议,它专门用来发送邮件用的。Pop全称是邮局协议,是专门用于接收邮件的。我主要是负责如何实现发送邮件功能的。MailSend命名空间是我整个程序的核心。它包括两个类。在SmtpMail的类中包含了一个SendMail的方法,它从底层详细地实现了和服务器的交互操作。你既可以用它发送一个纯文本邮件,也可以发送一个带有附件的邮件,理所当然地,你也可以使用不同的SMTP服务器。经过测试,证实此软件是一个支持多收信人,多附件的群发软件。虽然它没有FoxMail那么强大的功能,但是它容易掌握和使用。2.系统功能需求以FoxMail电子邮件客户端软件为模板,主要是实现电子邮件的发送这个功能。主要设计实现电子邮件的发送时需要的类。二.系统概要设计成都电子机械高等专科学校计算机工程系1.系统开发环境AMDAthlon(TM),512MB内存,80GB硬盘。Microsoft®WindowsTMXPProfessional。Microsoft®VisualStudio2003(CSharp)。Microsoft®DeveloperNetworkforVisualStudio.NET2003。2.系统运行环境Intel®Pentium®2及以上处理器,32MB以上内存,4GB以上硬盘。Microsoft®WindowsTM9x/NT操作系统。800х600或以上的屏幕分辨率。确保机器上安装有.NETFrameWork1.0或者以上版本。3.总体设计1)系统构架根据以上分析可以得到电子邮件客户端软件的总体构架,如同7.1所示。(1)系统总体用例图。根据系统需求和软件的架构图可以得到系统总体用例图如图7.2所示。接收邮件类发送邮件类主要功能选择用户主界面成都电子机械高等专科学校计算机工程系(2)程序功能框图。(3)发送邮件类,是发送邮件的核心,类名为SmtpMsil,隶属于命名空间MailSend。封装了发送邮件的具体实现方法,也是具体的RFC用代码实现的过程。而用户通过具体的操作接口,接口与SmtpMail类通过交互操作来实现用户发送信件的操作。(4)附加小功能类,是获取一些诸如系统时间、当前用户名以及本机IP之类的类,类名用户发送邮件新建账号接收邮件带附件邮件纯文本邮件客服端软件各种错误的提示附加功能电子邮件发送系统电子邮件接收系统通讯薄管理电子邮件的分类管理电子邮件编号带有附件的邮件发送简单邮件发送带有附件的邮件接收简单邮件接收成都电子机械高等专科学校计算机工程系AddExtra,隶属于命名空间MailSend。4.出错处理设计(1)系统应具有相当健壮性,避免或降低由系统错误所造成的数据损坏。(2)对关键性操作,如删除等提供竟高和确认机制。5.安全设计系统提供严格的身份验证机制和密码管理。6.维护设计系统严格按照设计规范进行设计,并保持各阶段文档的完整性,为以后对软件的维护打好基础。三命名控件MailSend由于在CSharp语言中,都是以命名控件来组织程序的。而所有的类都归属于一个特定的命名空间下。需要的命名空间系统本身自带了一部分,而且如果系统没有你需要的命名空间的话,就可以自己编写,本节中的这个命名空间就是由于需要而编写的。而调用某一个类中的某个变量成员的方法就是通过命名空间名.类名.变量成员来访问的,当然在CSharp中如果在程序开始通过Using命名空间名,就可以直接的象C++那样来访问成员变量,可以说相当的方便,这些都会在程序中体现出来,再次不再做过多的叙述。1发送邮件类SmtpMail1.1主要成员变量说明1)网络连接类及实例TcpClienttc为TCP网络服务提供客户端连接类TcpClient实例对象tc。TcpClient类提供了一些简单的方法,用于在同步阻塞模式下通过网络来连接、发送和接收流数据。而实例化的过程也是连接SMTP服务器的过程。它的重载方法之一的两个参数一个为服务器名称字符串,另一个为服务器的埠。2)提供用于网络访问的基础数据流及其实例NetworkStreamns此类提供访问网络的基础数据流的方法。其中最基本也是最重要的两个方法就是Write()和Read()方法,至于参数不再次赘述。3)一维字符串数组变量FilePath此字符串数组主要用来存放用户选择的附件的绝对路径名,并在发送带附件的邮件时用到。4)发送邮件所需的基本参数成都电子机械高等专科学校计算机工程系比如用于ESMTP等录检验用的用户名、密码,发送邮件需要的收信人,发信人地址以及主题等等在此不再赘述。1.2主要成员函数说明1)重载的构造函数SmtpMail()此函数主要用于在初始化过程中,把用户选择的附件的路径以参数的形式传给FilePath。2)添加附件的函数AddAttachment传给FilePath的路径,通过这样一个函数就可以循环的动态的添加到IList接口的一个对象中了,方便以后在具体的实现的过程中的使用。3)得到上传的附件的文件流GetStream由于在网络中的操作都是以网络流的形式来实现的,因此先将上传的附件转换成文件流,然后再用Write的方法把这些附件的文件流写入到网络中,来完成发送附件的操作。具体实现代码如下所示:privatestringGetStream(stringFilePath){//建立文件流对象System.IO.FileStreamFileStr=newSystem.IO.FileStream(FilePath,System.IO.FileMode.Open);byte[]by=newbyte[System.Convert.ToInt32(FileStr.Length)];FileStr.Read(by,0,by.Length);FileStr.Close();return(System.Convert.ToBase64String(by));}4)将字符串编码为Base64字符串的函数Base64Encode由于ESMTP的LOGIN认证机制是采用Base64编码,当用户发出AUTHLOGIN的命令后,服务器返回334的应答码等待用户输入。如果身份确认后服务器返回235的应答码,否则返回失败信息。所以要将用户名和密码转换成Base64编码然后再发给服务器。此函数的作用就是把给定的字符串转换成相应的Base64编码的字符串。5)发送SMTP命令的函数SendCommand成都电子机械高等专科学校计算机工程系这个函数的作用是把SMTP命令的字符串转换成对应的字节型值(C#中规定的Write方法只能写入字节型的数据)然后写入网络中,如果操作成功就返回一个标志为真的布尔型变量,如果操作失败或者发生异常就返回标志为假的布尔型变量。具体代码如下所示:privateboolSendCommand(stringstr){//定义一个数组byte[]WriteBuffer;//设定一个布尔类型的变量boolstate=false;WriteBuffer=Encoding.Default.GetBytes(str);//加入防错机制,可以有效提高程序运行的效率和捕获出错信息try{//向网络中写入数据ns.Write(WriteBuffer,0,WriteBuffer.Length);state=true;}catch(Exceptionex){//返回出错信息MessageBox.Show(ex.ToString());state=false;}//返回标志位returnstate;}6)接受服务器应答的函数RecvResponse它的作用就是从网络流中读取服务器返回的字节型的信息,将其转换成字符串型的变量,然后将其返回,可以通过其返回值来判断操作是否成功。具体实现代码如下所示:privatestringRecvResponse(){intStreamSize=0;stringReturnValue=;//定义一个字节型的数组byte[]ReadBuffer=newbyte[1024];try成都电子机械高等专科学校计算机工程系{//从网络流中读取数据,并返回读取的个数StreamSize=ns.Read(ReadBuffer,0,ReadBuffer.Length);}catch(Exceptionex){//返回异常信息MessageBox.Show(ex.ToString());}if(StreamSize!=0){//将当前读取的信息转换成字符串型然后返回ReturnValue=Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize);}returnReturnValue;}7)重载的函数Dialog它们的作用是与服务器交互,发送命令并接收回应。不同的是参数是字符串类型的那个函数,每次发送一条命令,并接受服务器的响应,根据响应的信息来判断交互的结果是否成功。而参数是字符串数组的函数每次发送的是一组命令,用于和服务器的交互,这个函数主要是用于ESMTP服务器的验证的功能,因为验证的过程是一个等待然后又输入的过程,因此将