基于C#邮件收发系统的设计
2.4 发送邮件类
是发送邮件的核心,类名为SmtpMail,隶属于命名空间MailSend。封装了发送邮件的具体实现方法,也是具体的RFC用代码实现的过程。而用户通过具体的操作接口,接口与SmtpMail类通过交互操作来实现用户发送信件的操作。
2.5 附加小功能类
是获取一些诸如系统时间,当前用户名,以及本机IP之类的类,类名为AddExtra,隶属于命名空间MailSend。
3 SMTP协议的研究
由于要开发的是邮件客户端程序,就不得不用到SMTP协议和POP协议。而我个人负责的是邮件发送功能的实现,因此就必然会涉及到SMTP(Simple Mail Transfer Protocol)协议。SMTP被用来在因特网上发送邮件,该协议规定了一些基本的命令和方法使客户端与服务器进行交互,以达到发送邮件的目的。
3.1 SMTP协议简介及工作原理
3.1.1 介绍
简单邮件传输协议(SMTP)的目标是可靠高效地传送邮件,它独立于传送子系统而且仅要求一条可以保证传送数据单元顺序的通道。
SMTP的一个重要特点是它能够在传送中接力传送邮件,传送服务提供了进程间通信环境(IPCE),此环境可以包括一个网络,几个网络或一个网络的子网。理解到传送系统(或IPCE)不是一对一的是很重要的。进程可能直接和其它进程通过已知的IPCE通信。邮件是一个应用程序或进程间通信。邮件可以通过连接在不同IPCE上的进程跨网络进行邮件传送。更特别的是,邮件可以通过不同网络上的主机接力式传送。
3.1.2 SMTP模型
SMTP设计基于以下通信模型:针对用户的邮件请求,发送SMTP建立与接收SMTP之间建立一个双向传送通道。接收SMTP可以是最终接收者也可以是中间传送者。SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。
一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答。
SMTP提供传送邮件的机制,如果接收方与发送方连接在同一个传送服务下时,邮件可以直接由发送方主机传送到接收方主机;或者,当两者不在同一个传送服务下时,通过中继SMTP服务器传送。为了能够对SMTP服务器提供中继能力,它必须拥有最终目的主机地址和邮箱名称。
MAIL命令参数是回复路径,它指定邮件从何处来;而RCPT命令的参数是转发路径的,它指定邮件向何处去。向前路径是源路径,而回复路径是返回路径(它用于发生错误时返回邮件)。
当同一个消息要发往不同的接收者时,SMTP遇到了向不同接收者发送同一份数据的复制品的问题,邮件命令和应答有一个比较奇怪的语法,应答也有一个数字代码。在下面,例子中可以看到哪些使用实际的命令和应答。完整的命令和应答在第四节。
命令与应答对大小写不敏感,也就是说,命令和应答可以是大写,小写或两者的混合,但这一点对用户邮件名称却不一定是对的,因为有的主机对用户名大小写是敏感的。这样SMTP实现中就将用户邮箱名称保留成初始时的样子,主机名称对大小写不敏感。
命令与应答由ASCII字母表组成,当传送服务提供8位字节传送通道,每7位字符正确传送,而最高位被填充为0。当指定一般的命令或应答格式后,参数会由一些类似于语言的字符串表示出来,如"<string>"或"<reverse-path>",这里尖括号表示这是一种类似于语言的变量。
3.2 SMTP协议的命令和应答
3.2.1 SMTP协议的命令
SMTP命令定义了邮件传输或由用户定义的系统功能。它的命令是由<CRLF>结束的字符串。而在带有参数的情况下,命令本身由<SP>和参数分开,如果未带参数可以直接和<CRLF>连接。邮箱的语法格式必须和接收站点的格式一致。下面讨论SMTP命令和应答。
发送邮件操作涉及到不同的数据对象,它们由不同的参数相互连接。回复路径就是MAIL命令的参数,而转发路径则是RCPT命令的参数,邮件日期是DATA命令的参数。这些参数或者数据对象必须跟在命令后。这种模式也就要求有不同的缓冲区来存储这些对象,也就是说,有一个回复路径缓冲区,一个转发路径缓冲区,一个邮件内容缓冲区。特定的命令产生自己的缓冲区,或使一个或多个缓冲的内容被清除。
目 录
1 引言 1
1.1 电子邮件介绍 1
1.2 开发背景 2
1.3 开发环境及运行环境 2
2 软件架构及系统用例图 3
2.1 系统架构 3
2.2 系统总体用例 3
2.4 发送邮件类 4
2.5 附加小功能类 4
3 SMTP协议的研究 4
3.1 SMTP协议简介及工作原理 5
3.2 SMTP协议的命令和应答 6
3.2.1 SMTP协议的命令 6
4 RFC822 14
4.1 RFC822简单介绍 14
4.2 信件的头部 14
5 命名控件MailSend 20
5.1 发送邮件类SmtpMail 20
5.2 AddExtra类 27
5.2.1 调用Windows API 所需的命名空间 28
5.2.3 在程序中具体的使用 28
6 软件运行时的界面 29
6.1 新建邮件帐号 29
7 系统测试 32
7.1 同一SMTP服务器发送邮件的测试 32
7.2 利用不同的SMTP服务器发送邮件的测试 32
8 结论 34
参考文献 35
致 谢 36
外文文献原文
译文
参考文献
[1] Simon Robinson, K.Scott Allen等.C#高级编程. 北京:清华大学出版社, 2002,3
[2] Tom /Archer. C#技术内幕. 北京:清华大学出版社, 2002,1
[3]沉舟.Microsoft.NET编程语言C#. 北京:希望电子出版社 2001,3
[4]罗军舟,黎波涛,杨明等.TCP/IP 协议及网络编程技术. 北京: 清华大学出版 2004,10
[5] Tim Parker .TCP/IP 协议及网络编程技术. 北京: 机械工业出版社 , 2000,7
[6] 周存杰 . Visual C#.NET网络核心编程. 北京:清华大学出版社, 2002,11
[7] 电脑编程技巧与维护杂志社.C#编程技巧典型案例解析. 北京:中国电力出版社,
2005,8
[8] 云颠工作室. Visual C#中文版全面剖析. 北京:中国水利水电出版社, 2003,5
[9] 叶树华 《电子协议与编程》,《电子邮件格式》,《电子邮件接收》,《mime 编码解码与发送附件》
[10] MSDN中文网站网络广播 C#设计模式纵谈
http://www.microsoft.com/china/msdn/events/webcasts/shared/Webcast/MSDNWebCast.aspx
[11] 滁州,马金虎,朱力勇. 编写基于SMTP网络应用程序. 电脑爱好者,2003,5:92~94
[12] 滁州,马金虎,朱力勇. 编写基于POP3网络应用程序. 电脑爱好者,2003,6:92~94
[13] 潘泰国. 新一代电子邮件系统. 电子技术应用. 1992,11
[14] 代继红. SMTP认证机制模块化设计及实现. 中南民族大学学报(自然科学版),
2005,4
[15] 胡安廷. 简单实现中文邮件. 中国计算机报, 2004,11