使用C# 创建邮件发送组件(SMTP)
邮件发送在web应用中是屡见不鲜的,在asp时代大家多是利用一些第三方提供的组件如JMAIL、ASPMAIL等进行邮件发送。自从微软推出Asp.net后,很多程序员开始转向采用C#作为主要的开发语言。asp.net提供了更加强大的功能,同时也提供给了大家一个SMTP类作为邮件发送之用。但是,随着垃圾邮件的广泛传播,很多邮件服务提供商纷纷增加了SMTP 的认证手续,也就是ESMTP,而微软提供的SMTP类居然不支持认证发送。当然现在网上也出现了一些解决方案,利用其他的一些手段来发出认证信息。但我想,是不是还有更好的呢?为了解决这个问题,笔者两日茶饭不思,日以继夜,终于找到了一个方法:)。下面,我们将利用TCPCLIENT这个类直接与SMTP服务器通讯进行邮件的发送。
实际上原理也就是利用套接字(Socket)和服务器进行对话通讯,按照SMTP协议的规范,和服务器建立联系。我们以往用的一些邮件组件都是这么做的。 在开始之前,我们要对SMTP协议及其扩展ESMTP有个初步的了解。 SMTP和ESMTP的一些主要命令格式有以下一些: HELO <信息发送端的名称> 例如:HELO Localhost 这相当于和服务器打个招呼,你好,我是某某 EHLO <信息发送端的名称> 例如:EHLO Localhost 这是针对ESMTP服务器的接触方式,必须输入这个命令,系统才会开始认证程序 AUTH LOGIN 输入这个命令,系统的认证程序将会启动,同时系统会返回一个经过Base64处理过的字符串,意思是"请输入用户名"。接着必须发送用户名给服务器,用户名也必须经过Base64编码转换,服务器在通过用户名的认证之后会要求输入密码,此时输入经过Base64编码转换后的密码。成功后,即可运行下面的命令了。 MAIL FROM:<发件人地址> 例如:MAIL FROM: webmaster@sina.com 这是告诉服务器发件人的邮件地址 RCPT TO:<收件人地址> 例如:RCPT TO: webmaster@sina.com 这是告诉服务器收件人的邮件地址 DATA 输入这个命令后,服务器正式开始接受数据 . 数据输入完成后,必须输入命令".",服务器就会停止数据的接受. QUIT 退出系统 上面是一些基本命令的描述,如果大家还有什么不懂的地方,可以参考TCP/IP有关的书籍,也可以到这个网站看看RFC文档:http://210.25.132.18/rfc/index.html 现在我们正式开始,看看在C# 中如何来进行工作。 第一步:创建一个类,命名为MailSend,这个类继承System.Net.Sockets.TcpClient using System; using System.Net.Sockets;//用于处理网络连接 using System.IO; //用于处理附件的包 using System.Text;//用于处理文本编码 using System.Data; using System.Net; public class MailSend:TcpClient { public MailSend() { } } 在这里我要讲讲TcpClient这个类,它的主要作用就是为TCP网络服务提供客户端的连接,大家可以看到,他来源于Sockets这个包,实际上是基于 Socket 类构建。不过他以更高的抽象程度提供 TCP 服务,操作起来也更简单。 第二步:建立一些基本的变量及连接方法 1、基本变量 private String server;//SMTP服务器域名 private int port;//端口 private String username;//用户名 private String password;//密码 private String subject;//主题 private String body;//文本内容 private String htmlbody;//超文本内容 private String from;//发件人地址 private String to;//收件人地址 private String fromname;//发件人姓名 private String toname;//收件人姓名 private String content_type;//邮件类型 private String encode;//邮件编码 private String charset;//语言编码 private DataTable filelist;//附件列表 private int priority;//邮件优先级 以上定义的都是邮件发送所需的一些基本信息,可以将上述变量做为属性来传递。 如: public String SMTPServer { set{this.server=value;} } 其余的也可如此. 2、向服务器写入命令的方法 变量strCmd为需要输入的命令或数据的字符串 变量charset为数据的字符语言编码,一般可以设置为GB2312 private void WriteStream(String strCmd,String charset) { Stream TcpStream;//定义操作对象 strCmd = strCmd + "\r\n"; //加入换行符 TcpStream =this.GetStream();//获取数据流 //将命令行转化为byte[] byte[] bWrite = Encoding.GetEncoding(charset).GetBytes(strCmd.ToCharArray()); //由于每次写入的数据大小是有限制的,那么我们将每次写入的数据长度定在75个字节,一旦命令长度超过了75,就分步写入。 int start=0; int length=bWrite.Length; int page=0; int size=75; 上一篇:Javamail操作指南:实例代码解析 下一篇:运用C#实现POP3邮件接收程序 更多相关文章
|
推荐文章
精彩文章
|