




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、邮件发送程序设计与实现学生姓名:XX 指导老师: XX摘 要 本程序是在了解RFC底层协议的SMTP协议和POP协议基础上,通过C#编程从SMTP协议规定的底层命令做起一步步的与服务器进行交互操作,最终实现发送多邮件功能其中,具体的和服务器的交互操作,都封装了在SmtpMail.dll这个动态链接库里面了。关键词 C#;SMTP;RFC;邮件;POP1前 言电子邮件(简称E-mai1)又称电子信箱、电子邮政,它是种用电子手段提供信息交换的通信方式。它是全球多种网络上使用最普遍的一项服务。这种非交互式的通信,加速了信息的交流及数据传送,它是个简易、快速的方法。通过连接全世界的Internet,实
2、现各类信号的传送、接收、存贮等处理,将邮件送到世界的各个角落。到目前为止,可以说电子邮件是Internet资源使用最多的一种服务,E-mai1不只局限于信件的传递,还可用来传递文件、声音及图形、图像等不同类型的信息。电子邮件不是一种“终端到终端”的服务,是被称为“存贮转发式”服务。这正是电子信箱系统的核心,利用存贮转发可进行非实时通信,属异步通信方式。即信件发送者可随时随地发送邮件,不要求接收者同时在场,即使对方现在不在,仍可将邮件立刻送到对方的信箱内,且存储在对方的电子邮箱中。接收者可在他认为方便的时候读取信件,不受时空限制。在这里,“发送”邮件意味着将邮件放到收件人的信箱中,而“接收”邮件
3、则意味着从自己的信箱中读取信件,信箱实际上是由文件管理系统支持的个实体。因为电子邮件是通过邮件服务器(mai1 server)来传递档的。通常mail server是执行多任务操作系统UNIX的计算机,它提供24小时的电子邮件服务,用户只要向 mail server管理人员申请个信箱账号,就可使用这项快速的邮件服务。1.1课程设计的内容 运用C#语言设计一个邮件程序实现邮件发送1.2课程设计的要求(1)按要求编写课程设计报告书,能正确阐述设计结果。(2)通过课程设计培养学生严谨的科学态度,认真的工作作风和团队协作精神。(3)学会文献检索的基本方法和综合运用文献的能力。(4)在老师的指导下,要求
4、每个学生独立完成课程设计的全部内容。1.3开发环境处理器:Intel(R) Pentium(R) M 786MHz 2.13GHz硬盘空间:160GB内存:1GB显示器:8600GT 2 设计平台简介C#编程环境简介20世纪80年代以来,C/C+语言一直是使用最广泛的商业化开发语言。但在带来强大控制能力和高度灵敏性的同时,其代价是相对较长的学习周期和较低下的开发效率,同时对控制能力的滥用也给程序的安全性带来了潜在的威胁。C+语言过度的功能扩张也破坏了面向对象的设计理念。因此,软件行业迫切需要一种全新的现代程序设计语言,他能够在控制能力与生产效率之间达到良好的平衡,特别是将高端应用开发与底层平台
5、访问紧密结合在一起,并与Web标准保持同步,C#(读作C-Sharp)语言就是这一使命的承担着。C#语言是从C/C+语言发展而来的,他汲取了包括C+、Java、Delphi在内的多种语言精华,是一种简单易学、类型安全和完全面向对象的高级程序设计语言。它的设计目标就是在继承C/C+强大功能的用时,兼有RAD(快速应用程序开发)语言的高效性。作为.NET的核心编程语言,c#充分享受了CLR所提供的优势,能够与其他应用程序方便的集成和交互。下面是对它几个突出特点的描述。>语法简洁:C#取消了指针、也不定义繁琐的伪关键字;它使用有限地指令、修饰符合操作符,语法上几乎不存在任何冗余,整个语言结构十
6、分清晰。初学者通常能够快速掌握C#基本特性,而C/C+程序员转入C#则几乎不会有什么障碍。>完全面向对象:C#具有面向对象的语言所应有的基本特性:封装、继承和多态性。它禁止多继承,禁止各种全局方法、全局变量和常量。C#以类为基础来构建所有的类型,并通过命名空间对代码进行层次化的组织和管理。许多精巧的对象设计模式都在C#语言中得到了有效的应用。>与Web紧密结合:借助Web服务框架,C#使得网络开发和本地开发几乎一样简单。开发人员无需了解网络的细节,可以用统一的方式来处理本地的和远程的C#对象,而C#组件能够方便的转为Web服务,并被其他平台上的各种编程语言调用。>目标软件的安
7、全性:C#符合通用类型系统的类型安全性要求,并用CLR所提供的代码访问安全特性,从而能够在程序中方便的配置安全等级和用户权限。此外,垃圾收集机制自动管理对象的生命周期,这是的开发人员无需再负担内存管理的任务,应用程序的可靠性进一步得到提高。>版本管理技术:C#语言中内置了版本控制功能,并通过接口和继承来实现应用的可扩展性。应用程序的维护和升级更加易于管理。>灵活性与兼容性:C#中允许使用非托管代码来与其他程序(包括COM组件、WIN32API等)进行集成和交互。它还可以通过委托(delegate)来模拟织针的功能,通过接口来模拟多继承的实现。 3设计原理基本
8、原理3.1软件总体架构总体架构如图3.1: 图3.1软件总架构3.2软件总体用例图3.2软件总体用例3.3程序功能框架图 程序功能框架图3.33.4发送邮件类是发送邮件的核心,类名为SmtpMail,隶属于命名空间MailSend。封装了发送邮件的具体实现方法,也是具体的RFC用代码实现的过程。而用户通过具体的操作接口,接口与SmtpMail类通过交互操作来实现用户发送信件的操作。3.5附加小功能类是获取一些诸如系统时间,当前用户名,以及本机IP之类的类,类名为AddExtra,隶属于命名空间MailSend。3.6 SMTP协议研究由于要开发的是邮件客户端程序,就不得不用到SMTP协议和PO
9、P协议。而我个人负责的是邮件发送功能的实现,因此就必然会涉及到SMTP(Simple Mail Transfer Protocol)协议。SMTP被用来在因特网上发送邮件,该协议规定了一些基本的命令和方法使客户端与服务器进行交互,以达到发送邮件的目的。36.1 SMTP协议简介及工作原理简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。SMTP的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络的子网。理解到传送系统(或IPCE)不是一对一的是很重要
10、的。进程可能直接和其它进程通过已知的IPCE通信。邮件是一个应用程序或进程间通信。邮件可以通过连接在不同IPCE上的进程跨网络进行邮件传送。更特别的是,邮件可以通过不同网络上的主机接力式传送。3.6.2 SMTP模型基于以下通信模型:针对用户的邮件请求,发送SMTP建立与接收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中间传送者。SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SM
11、TP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答。SMTP提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传送服务下时,通过中继SMTP服务器传送。为了能够对SMTP服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。MAIL命令参数是回复路径,它指定邮件从何处来;而RCPT命令的参数是转发路径的,它指定邮件向何处去。向前路径是源路径,而回复路径是返回路径(它用于发
12、生错误时返回邮件)。当同一个消息要发往不同的接收者时,SMTP遇到了向不同接收者发送同一份数据的复制品的问题,邮件命令和应答有一个比较奇怪的语法,应答也有一个数字代码。在下面,例子中可以看到哪些使用实际的命令和应答。完整的命令和应答在第四节。命令与应答对大小写不敏感,也就是说,命令和应答可以是大写,小写或两者的混合,但这一点对用户邮件名称却不一定是对的,因为有的主机对用户名大小写是敏感的。这样SMTP实现中就将用户邮箱名称保留成初始时的样子,主机名称对大小写不敏感。命令与应答由ASCII字母表组成,当传送服务提供8位字节传送通道,每7位字符正确传送,而最高位被填充为0。当指定一般的命令或应答格
13、式后,参数会由一些类似于语言的字符串表示出来,如"<string>"或"<reverse-path>",这里尖括号表示这是一种类似于语言的变量。4 课程设计步骤4.1函数构造1重载的构造函数 SmtpMail()此函数主要用于在初始化过程中,把用户选择的附件的路径以参数的形式传给FilePath。2添加附件的函数AddAttachment传给FilePath的路径,通过这样一个函数就可以循环的动态的添加到IList接口的一个对象中了,方便以后在具体的实现的过程中的使用。3得到上传的附件的文件流GetStream由于在网络中的操作都
14、是以网络流的形式来实现的,因此先将上传的附件转换成文件流,然后再用Write的方法把这些附件的文件流写入到网络中,来完成发送附件的操作。具体实现代码如下所示:private string GetStream(string FilePath) /建立文件流对象 System.IO.FileStreamFileStr=new System.IO.FileStream(FilePath,System.IO.FileMode.Open); byte by=new byteSystem.Convert.ToInt32(FileStr.Length); FileStr.Read(by,0,by.Lengt
15、h); FileStr.Close(); return(System.Convert.ToBase64String(by); 4将字符串编码为Base64字符串的函数Base64Encode由于ESMTP的LOGIN认证机制是采用Base64编码,当用户发出AUTHLOGIN的命令后,服务器返回334的应答码等待用户输入。如果身份确认后服务器返回235的应答码,否则返回失败信息。所以要将用户名和密码转换成Base64编码然后再发给服务器。此函数的作用就是把给定的字符串转换成相应的Base64编码的字符串。5发送SMTP命令的函数SendCommand这个函数的作用是把SMTP命令的字符串转换成
16、对应的字节型值(C中规定的Write方法只能写入字节型的数据)然后写入网络中,如果操作成功就返回一个标志为真的布尔型变量,如果操作失败或者发生异常就返回标志为假的布尔型变量。具体代码如下所示:private bool SendCommand(string str) /定义一个数组byte WriteBuffer; /设定一个布尔类型的变量bool state=false; WriteBuffer = Encoding.Default.GetBytes(str);/加入防错机制,可以有效提高程序运行的效率和捕获出错信息try/向网络中写入数据ns.Write(WriteBuffer,0,Writ
17、eBuffer.Length); state=true;catch(Exception ex)/返回出错信息MessageBox.Show (ex.ToString ();state=false;/返回标志位return state; 6接受服务器应答的函数RecvResponse它的作用就是从网络流中读取服务器返回的字节型的信息,将其转换成字符串型的变量,然后将其返回,可以通过其返回值来判断操作是否成功。具体实现代码如下所示:private string RecvResponse() int StreamSize=0; string ReturnValue ="" /定义
18、一个字节型的数组byte ReadBuffer = new byte1024 ; try /从网络流中读取数据,并返回读取的个数StreamSize=ns.Read(ReadBuffer,0,ReadBuffer.Length); catch (Exception ex) /返回异常信息MessageBox.Show(ex.ToString (); if (StreamSize!=0) /将当前读取的信息转换成字符串型然后返回ReturnValue= Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize); return R
19、eturnValue;7重载的函数 Dialog它们的作用是与服务器交互,发送命令并接收回应。不同的是参数是字符串类型的那个函数,每次发送一条命令,并接受服务器的响应,根据响应的信息来判断交互的结果是否成功。而参数是字符串数组的函数每次发送的是一组命令,用于和服务器的交互,这个函数主要是用于ESMTP服务器的验证的功能,因为验证的过程是一个等待然后又输入的过程,因此将他们放在一个数组中有利于理解和操作。而他们的实现主要是通过调用上面的发送SMTP命令函数SendCommand以及接受SMTP服务器响应的函数RecvResponse来实现的。具体的代码如下所示:private bool Dial
20、og(string str,string errstr) bool flag=false;if(str=null|str.Trim()="") flag=true; if(SendCommand(str) string RR=RecvResponse(); /从返回的数据中截取前三位string RRCode=RR.Substring(0,3); /然后用这前三位与哈希表中正确的回应码比较if(RightCodeHTRRCode!=null) flag=true; else flag=false; else flag=false; return flag;发送一组命令主要用
21、于服务器验证的重载函数为:private bool Dialog(string str,string errstr) for(int i=0;i<str.Length;i+) /循环调用单个的与服务器的交互过程if(!Dialog(stri,"") return false; return true; 8邮件发送程序SendMail这是整个程序的核心部分。具体的实现SMTP协议的程序正是通过它一步一步实现并最终实现发送简单邮件甚至带附件的邮件的功能。而它的实现是调用以上给出的各个函数的结果。以下就简单的通过几个SMTP命令的格式来实现private bool Send
22、Email() /连接网络 try /建立一个TCP连接tc=new TcpClient(mailserver,mailserverport); catch MessageBox.Show ("连接失败","请确认");return false; /获取当前流的资料ns = tc.GetStream(); SMTPCodeAdd(); /验证网络连接是否正确 if(RightCodeHTRecvResponse().Substring(0,3)=null) return false; string SendBuffer; string SendBuffe
23、rstr; /进行SMTP验证 /具体的SMTP命令与代码的结合if(ESmtp) SendBuffer=new String4; SendBuffer0="EHLO " + mailserver + enter; SendBuffer1="AUTH LOGIN" + enter; SendBuffer2=Base64Encode(username) + enter; SendBuffer3=Base64Encode(password) + enter; if(!Dialog(SendBuffer,"SMTP服务器验证失败,请核对用户名和密码。
24、") return false; else SendBufferstr="HELO " + mailserver + enter; if(!Dialog(SendBufferstr,"") return false; SendBufferstr="MAIL FROM:<" + From + ">" + enter; if(!Dialog(SendBufferstr,"发件人地址错误,或不能为空") return false; /把传过来的收件人的地址分割然后提交给服务器st
25、ring split=""string address=Regex.Split (Recipient,split);SendBuffer=new string address.Length;for(int i=0;i<SendBuffer.Length;i+)SendBufferi="RCPT TO:<" +addressi+">" + enter;if(!Dialog(SendBuffer,"收件人地址有误") return false; SendBufferstr="DATA&quo
26、t; + enter; if(!Dialog(SendBufferstr,"") return false; SendBufferstr="From:" + FromName + "<" + From +">" +enter;SendBufferstr += enter + "." + enter; if(!Dialog(SendBufferstr,"错误信件信息") return false; SendBufferstr="QUIT" + e
27、nter; if(!Dialog(SendBufferstr,"断开连接时错误") return false; /关闭流对象ns.Close(); /关闭连接tc.Close();FilePath=null;return true; 以上即为发送不带附件的邮件SMTP命令用代码实现的过程。4.2 Addextra类这个附加的小类只是提供一些返回当前系统时间,获取主机名,主机IP,有关帮助等小的功能,在此仅对帮助信息中的“关于”操作函数稍加说明。因为它说明了在C Sharp 中调用 Windows API 函数所需如下几个步骤:4.2.1调用Windows API 所需的命名
28、空间-using System.Runtime.InteropServices;而调用显示关于对话框的函数ShellAbout还需要用到两个命名空间如下所示-using System.Reflection;-using System.Diagnostics ;4.2.2在程序中声明所需的API函数DllImport("shell32.dll")static extern int ShellAbout(IntPtr hWnd, string szApp, string szOtherStuff,IntPtr hIcon);4.2.3具体的使用Assembly ass=Assembly.GetExecutingAssembly();FileVersionInfo myVersion=FileVersionInfo.GetVersionInfo(ass.Location );ShellAbout(this.Handle ,"邮件收发系统#","版本"+myVersion.FileMajorPart +"."+myVersion.FileMinorPart+"." +myVersio
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年国网河南电力招聘高校毕业生笔试真题
- 2024年鞍山海城市招聘医疗岗位笔试真题
- 法律文化在社会中的表现试题及答案
- 网络管理员考试准备清单2025试题及答案
- 企业战略执行案例试题及答案
- 网络管理员培训指南试题及答案
- 网络服务监控与调优试题及答案
- 企业网管案例分析试题及答案
- 材料力学性能测试疲劳韧性重点基础知识点
- 江西省抚州市金溪县2025年八年级数学第二学期期末质量跟踪监视模拟试题含解析
- 服饰搭配艺术(山东联盟)智慧树知到期末考试答案章节答案2024年德州学院
- 船舶避碰 第十七条直航船的行动
- 绿色矿山造林施工合同
- 中国绝经管理与绝经激素治疗指南(2023版)解读
- 开休闲书吧创业计划书
- 人体常见病智慧树知到期末考试答案章节答案2024年
- 《石油行业安全生产标准化-陆上采油实施规范》
- 异常产程的识别和处理
- 危险化学品“两重点一重大”简介(刘卓)省公开课一等奖全国示范课微课金奖课件
- 完整版购销合同范本(标准版)-2024多场合版
- 生物教学中的跨学科教学设计和实施
评论
0/150
提交评论