《2022年电子邮件系统的设计方案与实现 .docx》由会员分享,可在线阅读,更多相关《2022年电子邮件系统的设计方案与实现 .docx(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选学习资料 - - - - - - - - - 第一章前言1.1 课题来源 当前流行的各大邮件客户端软件除了最主要的收发信件之外,功能越来越复杂,但是人们平常真正用到的功能很少,很多功能特殊对于那些运算机学问相对缺乏的人来说,更加显得太过于华丽而不太实用;有鉴于此,在明白RFC 底层协议的基础上,本人开发了这个各种功能相对简洁有用的;邮件客户端程序,简化了很多不必要的功能1.2 电子邮件介绍 电子邮件 简称 E-mail )又称电子信箱、电子邮政,它是一种用电子手段供应信息交换的通信方式;它是全球多种网络上使用最普遍的一项服务;这种非交互式的通信,加速了信息的沟通及数据传送,它是一个简易、快
2、速的方法;通过连接全世界的Internet,实现各类信号的传送、接收、储备等处理,将邮件送到世界的各个角落;到目前为止,可以说电子邮件是Internet 资源使用最多的一种服务,E-mail 不只局限于信件的传递 , 仍 可 用 来 传 递 文 件 、 声 音 及 图 形 、 图 像 等 不 同 类 型 的 信 息 ;电子邮件不是一种“终端到终端 ” 的服务,是被称为“储备转发式 ” 服务;这正是电子信箱系统的核心,利用储备转发可进行非有用时通信,属异步通信方式;即信件发送者可随时随地发送邮件,不要求接收者同时在场,即使对方现在不在,仍可将邮件读取信件,不受时空限制;在这里,“发送 ”邮件意味
3、着将邮件放到收件人的信箱中,而“ 接收 ” 邮件就意味着从自己的信箱中读取信件,信箱实际上是由文件治理系统支持是一个实体;由于电子邮件是通过邮件服务器 mail server)来传递的;通常 mail server 是执行多任务操作系统 UNIX的运算机,它供应 24 小时的电子邮件服务,用户只要向 mail server 治理人员申请一个信箱账 号,就 可 使 用 这 项 快 递 的 邮 件 服 务;1.3 电 子 邮 件 的 工 作 原 理 : 电 子 邮 件 的 发 送 是 通 过 电 子 邮 件 简 单 传 速 协 议, 512 内存),80G 硬盘 MicrosoftWindows
4、XP Professional Micosoft Visual Studio 2003 0 接受全部的邮件保留服务器上的邮件?删除邮件关闭连接 退出图 4 接收邮件流程图发送邮件的流程图,先检查“ 发信箱” 目录中是否有待发邮件,假如有就逐个发送这些邮件,流程图如图5 所示;其发送过程,第一需要创建一个TCP 连接,连接到SMTP 服务器,假如连接不胜利就退出程序;连接胜利后发送USER 和 PASS 命令进行身份验证;身份验证通过后发送邮件,假如发送胜利就关闭连接,更新数据库,完成邮件发送任务;4 / 22 名师归纳总结 - - - - - - -第 4 页,共 22 页精选学习资料 - -
5、 - - - - - - - 开头检查发信箱中的待发邮件待发邮件?连接服务器连接胜利SMTP 服 务 器 需 要 身份身份验证身 份 验 证胜利?发送待发邮件发送胜利关闭连接更新数据库获得下一个邮件 退出图 5 发送邮件流程图3.2 SMTP协议的讨论由于要开发的是邮件客服端程序,就不得不用到SMTP 协议和 POP 协议;而我个人负责的是邮件发送功能的实现,因此就必定会涉及到SMTPSimple Mail Transfer Protocol)协议; SMTP 被用来在因特网上发送邮件,该协议规定了一些基本的命令和方法使客服端与服务器进行交互,以达到发送邮件的目的;5 / 22 名师归纳总结
6、- - - - - - -第 5 页,共 22 页精选学习资料 - - - - - - - - - 3.2.1SMTP 介绍 简洁邮件传输协议 SMTP )的目标是牢靠高效地传送邮件,它独立于传送子系统而 且仅要求一条可以保证传送数据单元次序的通道;SMTP 的一个重要特点是它能够在传送中接力传送邮件,传送服务器供应了进程间通 信环境 IPCE),此环境可以包括一个网络,几个网络或一个网络的子网;懂得到传输送 系统 或 IPCE)不是一对一的是很重要的;进程可能直接和其它进程通过已知的 IPCE 通信;邮件是一个应用程序或进程间通信;邮件可以通过连接在不同IPCE 上的进程跨网络进行邮件传送;
7、更特殊是,邮件可以通过不同网络上的主机接力式传送;3.2.2SMTP 模型SMTP 设计基于以上通信模型:针对用户的邮件恳求,发送 SMTP 建立于接收 SMTP 之间建立一个双向传送通道;接收 SMTP 可以是最终接收者也可以是中间传送者;SMTP命令由发送 SMTP 发出,由接收 SMTP 接收,而应答就反方面传送;一旦传送通道建立,SMTP 发送者发送 MAIL 命令指明邮件发送者;假如 SMTP 接收者可以接收邮件就返回 OK 应答; SMTP 发送者再发出 RCRT 命令确认邮件是否接收到;假如 SMTP 接收者接收,就返回 OK 应答;假如不能接收到,就发出拒绝接收应答 但不中止整
8、个邮件操作),双方将如此重复多次;当接收者到全部邮件后会接收到特殊的序列,假如接收者胜利处理了邮件,就返回 OK 应答;SMTP 供应传送邮件的机制,假如接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者在不同一个传送服务下时,通过中继 SMTP 服务器传送;为了能够对 机地址和邮箱名称;SMTP 服务器供应中继才能,它必需拥有最终目的主MAIL 命令参数是回复路径,它指定邮件从何处来;而 RCPT 命令的参数是转发路径的,它指定邮件向何处去;向前路径是源路径,而回复路径是返回路径 它用于发生错误时返回邮件);当同一个消息要发往不同的接收者时,SMT
9、P 遇到了向不同接收者发送同一份数据的复制品的问题,邮件命令和应答有一个比较古怪的语法,应答也有一个数字代码;在下 面,例子中可以看到哪些使用实际的命令和应答;完整的命令和应答在第四节;命令与应答对大小写不敏锐,也就是说,命令和应答可以是大写,小写或两者的混 合,但这一点对用户邮件名称却不肯定是对的,由于有的主机对用户名大小写是敏锐的;这样 SMTP 实现中就将用户邮箱名称保留成初始时的样子,主机名称对大小写不敏锐;命令与应答由ASCII 字母表组成,当传送服务供应8 位子节传送通道,每7 位字符正确传送,而最高位被填充为0;当指定一般的命令或应答格式后,参数会由一些类似于语言的字符串表示出来
10、,如“ ” 或“” ,这里尖括号表示这是一种类似于语言的变量;3.3SMTP协议的命令和应答 3.3.1SMTP 协议的命令SMTP 命令定义了邮件传输或用户定义的系统功能;它的命令是由 终止的字符串;而在带有参数的情形下,命令本身由和参数分开,假如未带参数可以直接和 连接;邮箱的语法格式必需和接收站点的格式一样;3.3.2SMTP 的应答码 对 SMTP 命令的响应是多样的,它确定了在邮件传输过程中恳求和处理的同步,也保 证了发送 SMTP 知道接收 SMTP 的状态;每个命令必需有且只有一个响应;SMTP 响应由三位数字组成,其后跟一些文本;数字帮忙打算下一个应当进入的状 态,而文本对人是
11、有意义的;三位的响应已经包括了足够的信息,不用再阅读文本,文本6 / 22 名师归纳总结 - - - - - - -第 6 页,共 22 页精选学习资料 - - - - - - - - - 可以直接抛弃或者传递给用户;特殊的是,文本是与接收和环境相关的,所以每次接收到的文本可能不同;正规的情形下,响应由下面序列构成:三位的数字,一行文本和一个, 或者也可以是一个多行响应;只有 然而,对全部命令,多行响应都是答应的;EXPN 和 HELP ,命令可以导致多行应答,REPLY CODES BY FUNCTION GROUPS 500格式错误,命令不行识别此错误也包括命令行过长)第四章 RFC822
12、 说到发送和接收邮件,就不得不提 RFC822 了; RFC822 的全称是“ARPA 因特网文信件格式的标准”Standard for the Format of ARPA Internet Text Messages );该标准供应了邮件内容的格式和相关语义;4.1 RFC822 简洁介绍RFC822 规定的电子邮件内容全部由 ASCII 字符组成,就是通常所说的文本文件,因而标准将它称为 Internet 文本信件 Internet Text Messages);从直观上看,信件特别简洁,就是一系列由 换形符终止;ASCII 字符组成的文本行,每一行以回车从组织上看,信件内容结构分为两大
13、部分,中间用一个空白行 只有 CRLF 符的行)来 分隔;第一部分称为信件的头部,包括有关发送方、接收方、发送日期等信息;其次部分 称为信件的体部,包括信件内容的正文文体;信头是必需的,信体是可选的,即信体可有 可无;假如不存在信体,用作分隔的空白行也就不需要;在信体中,也可以有用作分隔的 空白行;这样设计的信件便于进行语法分析,提取信件的基本信息;在 RFC822 中规定,信件体就是一系列的向收信人表达信息的文本行,比较简洁,可 以包括任意文本;并没有附加的结构;信件头就具有比较复杂的结构,在下一小节中详 述;4.2 信件的头部 4.2.1 信头一般格式信头的结构比较复杂,信头由如干信头字段
14、header field )组成,这些字段为用户和程序供应了关于信件的信息;要明白信头的结构就要弄清晰各种信头字段;全部的信头字段都具有相同的语法结构,从规律上说,包括四部分,字段名 field name)紧跟冒号“ :”colon ),后跟字段体 field body),最终以回车换形符 CRLF )终止;即信头字段 =字段名:字段体 CRLF 字段名必需由除了冒号和空格以外的可打印USASCII 字符 其值在 33 和 126 之间)组成,大多数字段的字段名称由一系列字母,数字组成,中间常常插入横线符;字段名告 诉电子邮件软件如何翻译该行中剩下的内容;字段体可以包括除了CR 和 LF 之外
15、的任何ASCII 字符;但是其中的格式的空格,加括号的注释,引号和多行都比较复杂,另外,字段体的语法和语义依靠于字段名,每个类型 的字段有特定的格式;4.2.2 结构化字段和非结构化字段 每个字段包含的信息不同,字段大体可以分为结构化字段和非结构化字段;结构化字段有特定的格式,由语法分析程序检测;是信箱,有一个离散的结构;Sender 字段就是一个很好的例子,它的字段内容非结构化的字段含有任意的数据,没有固定格式;例如,Subject 字段可以含有任意的7 / 22 名师归纳总结 - - - - - - -第 7 页,共 22 页精选学习资料 - - - - - - - - - 文字,并且没有
16、固定格式;非结构化的字段数量较少,只有Subject、Comments、扩展字段、非标准字段、INReply 和 References 等;全部其它字段都是结构化的;4.2.3 信头字段的元素尽管 Email 信件的总体结构特别简洁,但一些信头字段的结构是很复杂的;下面介绍一些大多数字段共有的元素;1)空白符像其它文本文件一样,空白符包括空格符ASCII码 32)和制表符TABASCII码19)此外,行末的回车换形符CRLF 也应算是空白符;使用空白符可以对字段进行格式化,增加它的可续性;例如,每个字段间用 CRLF 来分别,在字段内用空格来分隔字段名和字段内容;在 Subject 后面的冒号
17、和内容之间插入空格字符,会使字段结构更加清晰;在 Email 中;空白符的使用并没有固定的规章,但应当正确地使用,仅在需要时才使用空白符,以便接收软件进行语法分析;2)注解注解是由括号括起来的一系列字符,例如,这份礼物);注解一般用在非结构化的信头字段中,没有语法语义,仅为人供应了一些附加的信息;假如在加引号的字符串中 包括在括号中的字符,那是字符串的一部分,不是注解;在说明信件的时候,会将注解 忽视,可以用一个空格字符代替它们,这样就什么也不会破坏;3)字段折叠 每个信头字段从规律上说应当是一个由字段名、冒号、字段体和 CRLF 组成的单一的行,但为了书写与显示的便利,增加可续行,也为了符号
18、1000/80 的行字符数的限制,可以将超过 80 个字符的信头字段分为多行,即对于比较长的字段,可以分割成几行,形成折叠;在结果化和非结构化字段中都答应折叠,第一行后面的行称为信头字段的续行;续行都以一个空白符开头,这种方法称为折叠folding ),例如标题字段Subject:This is a test 可以表示为: Subject: This is a test 反之,将一个被折叠成多行的信头字段复原到它的单行表示的过程叫做去折叠,只要简洁地移除后面跟着空格的CRLF ,将折叠空白符CRLF 转换成空格字符,就可以完成折叠;在分析被折叠的字段的语法时,要把一个多行的折叠字段绽开为一行,
19、依据它的非折叠的形式来分析它的语法与语义;4)字段大小写字段名称是不区分大小写的,所以Subject、subject 或 SUBJECT 都一样;不过字段名称大小写有习惯的常用形式,如主题字段的大小写形式通常为 Subject;字段体的大小写稍微复杂点,要视情形而定;比如 词,不能改动;5)扩展字段Subject 后面的字段体,其中的大写可能就是缩写的专用名假如想在信头中加入 RFC822 中没有规定的字段,就需要创建非标准字段;方法特别简洁,只要在自定义的信头字段名的前面使用X- 前缀; RFC822 将这种方法称为扩展字段;事实上已经有很多扩展字段被广泛应用,但没有标准定义;例如:X LO
20、OP 字段 X LOOP 字段用来防止邮件的循环传送;过滤或邮件列表处理程序,可以给它处理 的每个信件增加一个 X LOOP 字段,以后就可以依据这个字段中含有的特殊值,判定一 个信件是否被循环传送;假如确认邮件发生了循环,过滤或邮件列表处理程序就可以用不同的方式处理该信件; XMailer 字段8 / 22 名师归纳总结 - - - - - - -第 8 页,共 22 页精选学习资料 - - - - - - - - - X Mailer 字段用于指示什么样的程序产生了这个信件,它是使用最广泛的扩展字段;产生邮件的软件可以为全部发送的信件增加合适的X Mailer 字段,该字段不仅含有软件的名
21、称,仍包含软件的版本号;例如软件名为 Littlefox Mailer ,版本为 V1.0,可以将“ X Mailer : Littlefox Mailer V1.0”加到邮件信头中去;图 6 列出了一些在因特网电子邮件可以找到的一般关键字,以及使用它们的目的;关键字 含义 From 发送方地址 TO 接收方地址 Cc 复制副本地址 Date 信息创建日期 Subject 信息主题 ReplyTo 回复地址 XCharset 使用的字符集 通常为 ASCII ) XMailer 发送信息所使用的软件 XSender 发送方地址的副本 XFace 经编码的发送方面孔的图像 整个系统的核心是收发信
22、件的操作,因此为了便利保护,以后的升级,故将这两个最 主要的操作写成类库 .dll )的形式,以组件的形式加载到主程序中,而且其它的功能假如 需要的话,也可以通过这样的组件的形式增加到主程序中;这也表达了 C Sharp 这一新的 微软主推语言的便利和高效;而且这样做也便利了我们小组的程序的顺当结合;第五章系统实现5.1 发送邮件类SmtpMail 是发送邮件的核心,类名为SmtpMail ,隶属于命名空间MailSend ;封装了发送邮件的详细实现方法,也是详细的RFC 用代码实现的过程;而用户通过详细的操作接口,接收与 SmtpMail 类通过交互操作来实现用户发送信件的操作;5.1.1
23、主要成员变量说明1)网络连接类及实例 TcpClient tc 为 TCP 网络服务供应客户端连接类 TcpClient 实例对象 tc; TcpClient 类供应了一些简单的方法,用于在同步堵塞模式下通过网络来连接、发送和接收流数据;而实例化的过程也是连接 SMTP 服务器的过程;它的重载方法之一的两个参数一个为服务器名称字符串,另一个为服务器的埠;2)供应用于网络拜访的基础数据流及其实例 NetworkStream ns 此类供应拜访网络的基础数据流的方法;其中最基本也是最重要的两个方法就是Write方法,至于参数不再次描述;3)一维字符串数组变量 FilePath 此字符串数组主要用来
24、存放用户挑选的附件的肯定路径名,并在发送带附件的邮件时用到;4发送邮件所需的基本参数比如用于 ESMTP 登录检验用的用户名、密码,发送邮件需要的收信人,发信人地址以及主题等等在此不再陈述;5.1.2 主要成员函数说明 1)重载的构造函数 SmtpMail )此 函 数 主 要 用 于 在 初始 化 过 程 中 , 把 用 户 挑选 的 附 件 的 路 径 以 参 数的 形 式 传 给9 / 22 名师归纳总结 - - - - - - -第 9 页,共 22 页精选学习资料 - - - - - - - - - FilePath; 2)添加附件的函数 AddAttachment 传给 FileP
25、ath 的路径,通过这样一个函数就可以循环的动态的添加到 LIST 接口的一个 对象中了,便利以后在详细的实现过程中使用; 3)得到上传的附件的文件流 GetStream 由于在网络中的操作都是以网络流的形式来实现的,因此先将上传的附件转换成文件 流,然后再用 Write 的方法把这些附件的文件流写入到网络中,来完成发送附件的操作;详细实现代码如下所示:/ / 得到上传附件的文件流 / /附件的肯定路径 Private string GetStreamstring FilePath Try /新建文件流对象 System.IO.FileStream FileStr =new System.IO
26、.FileStreamFilePath, System.IO.FileMode.Open ;Byteby=new byteSystem.Convert.ToInt32FileStr.Length;FileStr.Readby, 0, by.Length ; FileStr.Close ;ReturnSystem.Convert.ToBase64Stringby ; Catch MessageBox.Show “ 可能你要打开的文件的属性是只读的!” ,“ 请检查权限”;Return null ; 4将字符串编码为 Base64字符串的函数 Base64Encode 由于 ESMTP 的 LOG
27、IN 认证机制是采纳 Base64 编码,当用户发出 AUTHLOGIN 的命令 后,服务器返回 334 的应答码等待用户输入;假如身份确认后服务器返回 235 的应答码,否就返回失败信息;所以要将用户名和密码转换Base64编码然后再发给服务器;此函数的作用就是把给定的字符串转换成相应的 Base64 编码的字符串;5)发送 SMTP 命令的函数SendCommand 的函数作用是把SMTP 命令的字符串转换成对应的字节型值C#中规定的 Write 方法只能写入字节型的数据)然后写入网络中,假如操作胜利就返回一个标志为 真的布尔型变量,假如操作失败或者发生反常就返回标志为假的布尔型变量;详细
28、代码如 下所示:/ / 发送 SMTP 命令 / private bool SendCommandstring str 10 / 22 名师归纳总结 - - - - - - -第 10 页,共 22 页精选学习资料 - - - - - - - - - ByteWriteBuffer ;Ifstr=null |str.Trim=String.Empty return true; WriteBuffer=Encoding.Default.GetBytesstr;try ns.WriteWriteBuffer,0,WriteBuffer.Length; Catch Errmsg=”网络链接错误 ”
29、;Return false;return true; 6接受服务器应答的函数 RecvResponse 它的作用就是从网络流中读取服务器返回的字节型的信息,将其转换成字符串型的变 量,然后将其返回,可以通过其返回值来判定操作是否胜利;详细实现代码如下所示:/ / 接受 SMTP 服务器回应 / private string RecvResponse int StreamSize; string ReturnValue=string.Empty ; byte ReadBuffer=new byte1024 try StreamSize = ns.ReadReadBuffer,0,ReadBuff
30、er.Length ; catch Exception ex MessageBox.Showex.ToString ; return “false” ; if StreamSize =0 return ReturnValue ; else 11 / 22 名师归纳总结 - - - - - - -第 11 页,共 22 页精选学习资料 - - - - - - - - - ReturnValue = Encoding.Default.GetStringReadBuffer.Substring0, StreamSize; return ReturnV alue; 7重载的函数 Dialog 它们的作
31、用是与服务器交互,发送命令并接收回应;不同的是参数是字符串类型的那 个函数,每个发送一条命令,并接受服务器的响应,依据响应的信息来判定交互的结果是 否胜利;而参数是字符串数组的函数每次发送的是一组命令,用于和服务器的交互,这个 函数主要是用于 ESMTP 服务器的验证的功能,由于验证的过程是一个等待然后又输入的 过程,因此将它们放在一个数组中有利于懂得和操作;而它们的实现主要是通过调用上面的发送 SMTP 命令函数SendCommand 以及接受SMTP 服务器响应的函数RecvResponse 来实现的;详细的代码如下所示:/ / 与服务器交互,发送一条命令并接收回应; / /一个要发送的命
32、令 /假如错误,要反馈的信息 private bool Dialogstring str ,string errstr if str =null | str.Trim =” ” return true; if SendCommandstr string RR = RecvResponse ;ifRR = false” return false; try string RRCode = RR.Substring0, 3 ;ifRightCodeHTRRCode.=null return true; else if ErrCodeHTRRCode.=null 12 / 22 名师归纳总结 - -
33、- - - - -第 12 页,共 22 页精选学习资料 - - - - - - - - - errmsg+=RRCode+ErrCodeHTRRCode.ToString;errmsg+=enter; else errmsg+=RR ; errmsg+=errstr ;return false; catch MessageBox.Show “ 请检查附件的大小”;ruturn false;else return false;发送一组命令主要用于服务器验证的重载函数为:/ / 与服务器交互,发送一条命令并接收回应; / private bool Dialogstring str ,string
34、 errstr for int I = 0 ;i /假如在身份验证阶段有一个不胜利,就返回错误标志位 if.dialogstri,” ” errmsg +=enter; errmsg +=enter;return false; /身份验证全部正确的话,就返回正确标志位 return true ;8邮件发送程序 SendMail 这是整个程序的核心部分;详细的实现SMTP 协议的程序正是通过它一步一步实现并最终实现发送简洁邮件甚至带附件的邮件的功能,而它的实现是调用以上给出的各个函数的13 / 22 名师归纳总结 - - - - - - -第 13 页,共 22 页精选学习资料 - - - - - - - - - 结果;以下就是简洁的通过几个 SMTP 命令的格式来实现: private bool SendEmail /连接网络 try /建立一个 TCP 连接 tc=new TcpClientmailserver,mailserverport; catch MessageBox.Show “ 连接失败 ” ,” 请确认 ” ; return false ; /猎取当前流的资料 ns = tc.Getream ; SMTPCodeADD ; /验证网络连接是否正确 if.Substring0,3