Linux中国 Linux中国门户站!
设为主页 设为主页
收藏本站 收藏本站
 
当前位置 :首页 ->网络应用 ->邮件服务器 ->正文

使用C# 创建邮件发送组件(SMTP)

来源:Linuxdby.com 作者:Webmaster 时间:2007-05-31 点击: [收藏] [投稿]
邮件发送在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邮件接收程序

文章评论】 【收藏本文】 【推荐好友】 【打印本文】 【我要投稿】 【论坛讨论
更多相关文章
Power by linux-cn.com 粤ICP备05006655号