电子邮件系统的设计方案与实现.pdf

上传人:tbuqq 文档编号:4658427 上传时间:2019-11-24 格式:PDF 页数:22 大小:842.12KB
返回 下载 相关 举报
电子邮件系统的设计方案与实现.pdf_第1页
第1页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《电子邮件系统的设计方案与实现.pdf》由会员分享,可在线阅读,更多相关《电子邮件系统的设计方案与实现.pdf(22页珍藏版)》请在三一文库上搜索。

1、1 / 22 第一章前言1.1 课题来源当前流行的各大邮件客 户端软件除了最主要的收发信件之外,功能越来越复杂,但是人们平常真正用到的功能很 少,很多功能尤其对于那些计算机知识相对缺乏的人来说,更加显得太过于华丽而不太实 用。有鉴于此,在了解RFC 底层协议的基础上,本人开发了这个各种功能相对简单实用的 邮件客户端程序,简化了很多不必要的功能。 1.2 电子邮件介绍电子邮件 , 512 内存,80G 硬盘 Microsoft0 接受全部的邮件 保留服务器上 的邮件? 删除邮件 关闭连接 退出 5 / 22 图 5 发送邮件流程图 3.2 SMTP协议的研究 由于要开发的是邮件客服端程序,就不得

2、不用到SMTP 协议和 POP协议。而我个人负责 的是邮件发送功能的实现,因此就必然会涉及到SMTP” 或“ ”,这里尖括号表示这是一种类似 于语言的变量。 3.3SMTP协议的命令和应答 3.3.1SMTP 协议的命令 SMTP 命令定义了邮件传输或用户定义的系统功能。它的命令是由 结束的字符 串。而在带有参数的情况下,命令本身由和参数分开,如果未带参数可以直接和 连接。邮箱的语法格式必须和接收站点的格式一致。 3.3.2SMTP 的应答码 对 SMTP 命令的响应是多样的,它确定了在邮件传输过程中请求和处理的同步,也保 证了发送SMTP 知道接收SMTP 的状态。每个命令必须有且只有一个响

3、应。 SMTP 响应由三位数字组成,其后跟一些文本。数字帮助决定下一个应该进入的状 态,而文本对人是有意义的。三位的响应已经包括了足够的信息,不用再阅读文本,文本 7 / 22 可以直接抛弃或者传递给用户。特别的是,文本是与接收和环境相关的,所以每次接收到 的文本可能不同。正规的情况下,响应由下面序列构成:三位的数字,,一行文本和一 个, 或者也可以是一个多行响应。只有EXPN 和 HELP ,命令可以导致多行应答, 然而,对所有命令,多行响应都是允许的。 REPLY CODES BY FUNCTION GROUPS 500格式错误,命令不可识别方法,至于参数不再次描述。 3)一维字符串数组变

4、量FilePath 此字符串数组主要用来存放用户选择的附件的绝对路径名,并在发送带附件的邮件时 用到。 4发送邮件所需的基本参数 比如用于ESMTP 登录检验用的用户名、密码,发送邮件需要的收信人,发信人地址 以及主题等等在此不再陈述。 5.1.2主要成员函数说明 1)重载的构造函数SmtpMail / 得到上传附件的文件流 / /附件的绝对路径 Private string GetStream(string FilePath Try /新建文件流对象 System.IO.FileStream FileStr =new System.IO.FileStream(FilePath, System

5、.IO.FileMode.Open 。 Byteby=new byteSystem.Convert.ToInt32(FileStr.Length。 FileStr.Read(by, 0, by.Length 。 FileStr.Close( 。 Return(System.Convert.ToBase64String(by 。 Catch MessageBox.Show(“ 可能你要打开的文件的属性是只读的!” ,“请检查权限”。 Return null 。 4将字符串编码为Base64字符串的函数Base64Encode 由于 ESMTP 的 LOGIN认证机制是采用Base64 编码,当用

6、户发出AUTHLOGIN的命令 后,服务器返回334 的应答码等待用户输入。如果身份确认后服务器返回235 的应答码, 否则返回失败信息。所以要将用户名和密码转换Base64编码然后再发给服务器。此函数的 作用就是把给定的字符串转换成相应的Base64 编码的字符串。 5)发送 SMTP 命令的函数 SendCommand 的函数作用是把SMTP 命令的字符串转换成对应的字节型值 / 发送 SMTP 命令 / private bool SendCommand(string str 11 / 22 ByteWriteBuffer 。 If(str=null |str.Trim=String.Em

7、pty return true。 WriteBuffer=Encoding.Default.GetBytes(str。 try ns.Write(WriteBuffer,0,WriteBuffer.Length。 Catch Errmsg=” 网络链接错误” ; Return false; return true。 6接受服务器应答的函数RecvResponse 它的作用就是从网络流中读取服务器返回的字节型的信息,将其转换成字符串型的变 量,然后将其返回,可以通过其返回值来判断操作是否成功。具体实现代码如下所示: / / 接受 SMTP 服务器回应 / private string RecvR

8、esponse( int StreamSize。 string ReturnValue=string.Empty 。 byte ReadBuffer=new byte1024。 try StreamSize = ns.Read(ReadBuffer,0,ReadBuffer.Length 。 catch (Exception ex MessageBox.Show(ex.ToString( 。 return “ false” 。 if (StreamSize =0 return ReturnValue 。 else 12 / 22 ReturnValue = Encoding.Default.G

9、etString(ReadBuffer.Substring(0, StreamSize。 return ReturnV alue。 7重载的函数Dialog 它们的作用是与服务器交互,发送命令并接收回应。不同的是参数是字符串类型的那 个函数,每个发送一条命令,并接受服务器的响应,根据响应的信息来判断交互的结果是 否成功。而参数是字符串数组的函数每次发送的是一组命令,用于和服务器的交互,这个 函数主要是用于ESMTP 服务器的验证的功能,因为验证的过程是一个等待然后又输入的 过程,因此将它们放在一个数组中有利于理解和操作。而它们的实现主要是通过调用上面 的发送 SMTP 命令函数SendComm

10、and 以及接受SMTP 服务器响应的函数RecvResponse 来 实现的。具体的代码如下所示: / / 与服务器交互,发送一条命令并接收回应。 / /一个要发送的命令 /如果错误,要反馈的信息 private bool Dialog(string str ,string errstr if (str =null | str.Trim( =” return true。 if (SendCommand(str string RR = RecvResponse(。 if(RR = false” return false。 try string RRCode = RR.Substring(0,

11、3 。 if(RightCodeHTRRCode!=null return true。 else if (ErrCodeHTRRCode!=null 13 / 22 errmsg+=(RRCode+ErrCodeHTRRCode.ToString(。 errmsg+=enter。 else errmsg+=RR 。 errmsg+=errstr。 return false。 catch MessageBox.Show(“ 请检查附件的大小” ; ruturn false; else return false; 发送一组命令主要用于服务器验证的重载函数为: / / 与服务器交互,发送一条命令并接

12、收回应。 / private bool Dialog(string str ,string errstr for (int I = 0 。i /如果在身份验证阶段有一个不成功,就返回错误标志位 if(!dialog(stri,” errmsg +=enter。 errmsg +=enter。 return false。 /身份验证全部正确的话,则返回正确标志位 return true; 8邮件发送程序 SendMail 这是整个程序的核心部分。具体的实现SMTP 协议的程序正是通过它一步一步实现并最 终实现发送简单邮件甚至带附件的邮件的功能,而它的实现是调用以上给出的各个函数的 14 / 22

13、 结果。以下就是简单的通过几个SMTP 命令的格式来实现: private bool SendEmail( /连接网络 try /建立一个TCP 连接 tc=new TcpClient(mailserver,mailserverport。 catch MessageBox.Show( “ 连接失败 ” ,” 请确认 ” 。 return false; /获取当前流的资料 ns = tc.Getream( 。 SMTPCodeADD( 。 /验证网络连接是否正确 if.Substring(0,3=null) return false 。 string SendBuffer 。 string Se

14、ndBuffer 。 /进行 SMTP 验证 /具体的 SMTP 命令与代码的结合 if+enter SendBuffer3=Base64Encode(password+enter if(!Dialog(SendBuffer, ” SMTP 服务器验证失败,请核对用户和,密码。” return false。 else sendBufferstr= ” HELO ” +mailserver+enter 。 if(!Dialog(SendBufferstr, ” return false。 SendBufferstr= ”MAIL FROM:” +enter。 if(!Dialog(SendBuf

15、ferstr,” 发件人地址错误,或不能为空“ 15 / 22 return false。 /把传过来的收件人的地址分割然后提交给服务器 string split= ” ,” 。 string address=Regex.Split(Recipient,split。 SendBuffer=new stringaddress.Length 。 for(int i=0 。i SendBufferi= ” RCPTTO:” +enter。 if(!Dialog(SendBuffer, ” 收件人地址有误” return false 。 SendBufferstr= ” DATA” +enter。 i

16、f(!Dialog(SendBuffer, ” return false 。 SendBufferstr= ” From:” +FromName+” ” +enter。 SendBufferstr+=enter+ ” ,” +enter。 if(!Dialog(SendBuffer, ” 错误信件信息” return false 。 SendBufferstr= ” QUIT ” +ENTER 。 if(!Dialog(SendBuffer, ” 断开连接时错误” return false。 /关闭流对象 ns.Close(。 /关闭连接 tc.Close( 。 FilePath=null 。

17、 return true; 以上即为发送不带附件的邮件SMTP 命令用代码实现的过程。 5.2 接收邮件类 5.2.1主要成员变量说明 1)网络连接类的实例popClient,该实例用于连接POP3服务器。 2)int 变量 count 是用来记录接收邮件的数目。 3)定义字符串string POPServer,port,login ,password 分别代表服务器名,服务器端口 号,用户帐号,用户密码。 5.2.2主要成员函数说明 1)连接服务器函数connect 在 接 收 邮 件 前 , 首 先 要 调 用connect方法获得需要接收邮件的数目。返回值为要接收的邮件数目,如果为0 表

18、示邮件没有接收。其实现的代码如下所示: public int connect( /连接 POP3服务器 OpenPOP.POP3.Utility.Log=true 。 16 / 22 popClient.Disconnect( 。 popClient.Connect(POPServer,int,Parse(port 。 popClientAuthenticate(login,password 。 /得到邮件总数 count =popClientGetMessageCount( 。 msgs.Clear(。 return count。 2接收邮件函数receiveMail 当读取出邮件总数时,就

19、进行接收邮件操作,同时也进行接收附件。代码如下所示为: public void receivMail(int beginIndex,int endIndex /收取邮件 for(int i=beginIndex 。i receiveMail(i 。 public void receivMail(int index if(indexcount index=count 。 OpenPOP.MIMEParser.Message m = popClientGetMessageCount(index,false 。 try msgs.Add(index,m 。 catch(ArgumentExcepti

20、on public Arraylist getAttachmentName( Arraylist AttachmentName = new Arraylist(。 int count =m. AttachmentCount 。 for(int i =0 。 i if(m.GetAttachment(i.NotAttachment continue。 AttachmentName.ADD(m.GetAttachmentFileName(m.GETAttachment(i。 return AttachmentName 。 17 / 22 public void get Attachments(st

21、ring savePath m.SaveAttachments(savePath。 3判断邮件内容格式函数 showMessage 。 TextBos txtBox=new TextBox( 。 txtBox.Multiline =true。 txtBox.Text=txtmessage 。 txtBox.ReadOnly=true 。 txtPanel.Controls.ADD(txtBox。 txtBox.Dock=DockStyle.Fill。 changeButton.Text= ” 切换至 HTML 格式 ” 。 else txtPanel.Controls.Clear( 。 Web

22、Browser txtBox=new WebBrowser(。 txtBox.DocumentText=txtmessage 。 txtPanel.Controls.ADD(txtBox。 txtBox.Dock=DockStyle.Fill。 changeButton.Text= ” 切换至文本格式” 。 textFrom.Text=m.From+ ” ” 。 text To.Text=m.to0 。 5.3AddExtra 类 这个附加的小类提供一些返回当前系统时间,获取主机名,主机IP,及有关帮助的功 能,在此仅对帮助信息中的“关于”操作函数稍加说明。因为它说明了在C Sharp 中调用

23、 window API 函数所需如下几个步骤: 5.3.1调用 window 中 API 所需的命名空间 using systemruntime.interopservices ; 而调用显示关于对话的函数ShellAbout 还需要用到两个命名空间如下所示 18 / 22 using systemReflection ; using system.。Diagnostics ; 5.3.2在程序中声明所需的API 函数 D|Import( “ shell3.dll ” Static extern int shellabout(intPtr h wnd,string szApp,string s

24、zOtherStuff,IntPtr hicon。 5.3.3在程序中具体的使用 Assenbly ass=Assembly.GetExecutingAssembly( 。 FileVersionInfo myVersion=FileVersionInfo.GetVersionInfo(ass.Location。 ShellAbout(this.Handle, ”邮件收发系统#”,”版 本” +myVersion.FileMajorPart+ ” .” +myVersion.FileMajorPart+ ” .” myVersion.CompanyName,This. Icon.Handle

25、。 至此就完成了在C Sharp 中调用 window API 函数的过程。 第六章系统运行界面 6.1 系统的主界面 主界面显示用户名,主机名,相关的注册信息以及使用时间。该界面的代码保存在 SystemManage.cs和 SystemManage.resx 文件中。 创建界面时主要使用mainMenul ,imageaccount,imagelistl ,timerl 控件。 6.2 新用户注册页面 注册用户时。在相应的位置输入邮箱地址,用户名,密码,帐号名称等信息数输入完毕 后。进行检测账户名。确认正确是执行下一步操作。当你邮箱地址输入错误或者帐号名已 经存在。系统会检测到错误。并且给

26、出相应的提示! 在实现检查帐号名是否存在代码中调用了Accountoperate 类的检查帐号是否占用 的函数,并返回一个标志位。 6.3 新用户设置界面 19 / 22 图 8 设置界面 完成新用户注册后执行下一步操作是设置POP3 服务器和SMTP 服务器设置。以及端 口号的设置。设置完这个步骤后。就能创建一个新用户邮件收发操作。 首先调用Dispose)方法进行清空所有正在使用的资源,然后用SmtpPop 方法来调用 有关信息,完成设置后进行数据库插入操作。 6.4 发送邮件界面 6.4.1发送不带附件的邮件 在新建帐号的过程中已经制定了邮件地址和帐号名称,所有默认的以这些参数来发送邮

27、件。通过调用参数的不同程序会自动的调用相应的代码来执行不同的操作。该界面主要使 用 了mainMenul , openfiledialogl, imlsendmail , savefiledialogl, imlattachment , conattachment 等控件发送简单的邮件运行界面如下。 20 / 22 图 9 发送纯文本邮件 6.4.2发送带附件的邮件 和简单的邮件不同之处在于多了发送附件的功能,软件模拟FoxMail里面发送邮件时, 在程序的下面自动显示增添的附件的名称,以及图标等信息。并且邮件支持添加,删除, 排列图标等功能。运行界面如下所示: 图 10 发送带有附件的邮件

28、6.5 验证邮件发送是否成功 邮件发送出去之后,弹出对话框,提示信件发送成功: 图 11验证发送的邮件是否成功 6.6 邮件接收功能 选择用户,点击接收,可以接收邮箱中的邮件。 第七章系统测试 7.1 测试的目的 软件的目的就是为了更快,更早地将软件产品或软件系统中所存在的各种问题找出来, 并促使程序员尽快地解决这些问题,最终及时地向客户提供高质量地软件产品。要做到这 一点,确保找出系统中所有或绝大部分的软件缺陷,必须建立在软件测试非常有用的基本 方法之上。 软件测试的基本原则是站在用户角度,对产品进行全面测试,尽早尽可能多地发现缺 21 / 22 陷,就是说软件测试的目的就是发现错误,发现的

29、越多测试的质量越高。发现错误后并且 负责跟踪和分析产品中的问题,对不足之处提出质疑和改进一件零件缺陷是一种思想,足 够好是测试的原则。 7.2 同一 SMTP 服务器发送邮件的测试 这个方面测试的是,用户登录一个服务器来发送一封邮件的测试。 7.3 利用不同的 SMTP 服务器发送邮件的测试 这个方面的测试是指利用不同的邮箱来发送邮件,至于测试的分类雷同于利用同一服务 器发送邮件的测试,所以不在陈述。 7.4 同一 POP3 服务器接收邮件的测试 首先选择账户登录服务器来接收邮件。当接收完邮件时系统会显示服务器名,用户名, 接收人,发送人,邮件数以及邮件的主题和内容。该软件能接收到所有正确无误

30、的邮件。 经过这些验证可以证明软件支持接收同一服务器的邮件。 7.5 不同的 POP 服务器接收邮件的测试 通过发送邮件。软件一样能接收到邮件内容并且正确无误。通过这次验证可以证明该 软件支持接收不同服务器的邮件。 总之,通过以上的各方面的测试,使我改正了代码中的许多不合理以及错误之处,最 终也证明了,我们的软件系统是支持多种服务器,支持多附件发送的群发软件。 第八章 总结 这篇邮件客户端系统,我负责的是邮件发送功能。在熟悉了专门用于发送邮件的SMTP 协议以及RFC 规定的邮件的格式的基础上,运用了微软推出的C#这一新型的面向对象语 言的便利性和灵活性,从SMTP 协议规定的底层命令做起,一

31、步步的与服务器进行交互操 作,最终实现发送多附件多接收人的功能。其中,具体的和服务器的交互操作,都封装了 在 SmtpMail.dll这个动态链接库里面了。而为了方便最终的调用和整合,所有的有关后台 操作发送邮件的类以及其他的附加功能的类,全部都归属于MailSend 这个命名空间了。在 力求达到FoxMail功能的同时,又加了一点个人的思想并把它体现到了这一软件上。最主 要的体现就新建帐号的提前检测这一特色上,这一功能类似于很多Web 页面的“检测新帐 号”的功能,这样就免去了用户一直到确定注册完成时,才因为账户已经被使用而注册失 败的麻烦。总之,通过这次的编程,使我对网络编程有了一个很好的

32、认识和锻炼,也使我 对 C Sharp 这一语言的掌握程度又上了一个新台阶,虽然编出来的软件不能和功能强大的FoxMail相 提并论,但是相信它简单,易操作性,更多了几分实用性。在以后的日子,随着我的技术 提高和思想的成熟,我一定会把它做的更好,更趋近于完美。 22 / 22 参考文献 1 Simon Robinson, K.Scott Allen等.C#高级编程 M. 清华大学出版社,2002 2 Tom Archer.C# 技术内幕 M. 清华大学出版社,2002 3 沉舟 .Microsoft.NET 编程语言C#M. 希望电子出版社, 2001 4 罗军舟,杨明等。TCP/IP 协议及

33、网络编程技术M. 清华大学出版社,2004 5Tim Parker. TCP/IP 协议及网络编程技术M. 机械工业出版社,2000 6 周存杰 . Visual C#.NET 网络核心编程M. 清华大学出版社, 2002 7 电脑编程技巧与维护杂志社.C#编程技巧典型案例解读J . 中国电力出版社, 2005 8 马金虎,朱力勇。编写基于SMTP 网络应用程序J. 电脑爱好者, 2003 9 代继红 .SMTP 认证机制模块化设计及实现N. 中南民族大学学报,2005 致谢 本次毕业设计是在罗老师的精心指导下完成的。我借此机会向他表示衷心的感谢! 同时,也对计算机科学与技术系的全体老师的帮助和指导表示感谢!另外,还要感谢 在我进行毕业设计过程中给予我帮助的同学。 最后,对阅读和评审本论文的各位专家表示衷心的感谢!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1