基本信息
源码名称:c#发送邮件类(含接收邮件和发送邮件源码)
源码大小:6.83KB
文件格式:.rar
开发语言:C#
更新时间:2014-09-02
×
请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
源码介绍
实现发送邮件的类,同时包含POP3接收邮件类
实现发送邮件的类,同时包含POP3接收邮件类
using System; using System.Net.Sockets;//用于处理网络连接 using System.IO; //用于处理附件的包 using System.Text;//用于处理文本编码 using System.Data; using System.Net; namespace Email { public class MailSend:TcpClient { /*SMTP服务器域名*/ private string strServer; public string server { get { return strServer; } set { if(strServer!=value) { strServer=value; } } } /*SMTP服务器端口*/ private int strPort; public int port { get { return strPort; } set { if(strPort!=value) { strPort=value; } } } /*用户名*/ private string strUse=null; public String username { get { return strUse; } set { if(strUse!=value) { strUse=value; } } } /*密码*/ private string strPass=null; public String password { get { return strPass; } set { if(strPass!=value) { strPass=value; } } } /*主题*/ private string strSub=""; public String subject { get { return strSub; } set { if(strSub!=value) { strSub=value; } } } /*文本内容*/ private string strBody=""; public String body { get { return strBody; } set { if(strBody!=value) { strBody=value; } } } /*超文本内容*/ private string strHtm=""; public String htmlbody { get { return strHtm; } set { if(strHtm!=value) { strHtm=value; } } } /*发件人地址*/ private string strFrom=""; public String from { get { return strFrom; } set { if(strFrom!=value) { strFrom=value; } } } /*收件人地址*/ private string strTo=""; public String to { get { return strTo; } set { if(strTo!=value) { strTo=value; } } } /*发件人姓名*/ private string strFName=""; public String fromname { get { return strFName; } set { if(strFName!=value) { strFName=value; } } } /*收件人姓名*/ private string strTName=""; public String toname { get { return strTName; } set { if(strTName!=value) { strTName=value; } } } /*邮件编码*/ private string strEncode="8bit"; public String encode { get { return strEncode; } set { if(strEncode!=value) { strEncode=value; } } } /*邮件优先级*/ private int intPriority=0; public int priority { get { return intPriority; } set { if(intPriority!=value) { intPriority=value; } } } /*语言编码*/ private string strCharset="gb2312"; public String charset { get { return strCharset; } set { if(strCharset!=value) { strCharset=value; } } } /*html邮件标志*/ private bool isHtml=false; public bool html { get { return isHtml; } set { if(isHtml!=value) { isHtml=value; } } } private DataTable filelist;//附件列表 public MailSend() { } /*发送邮件*/ public void Send() { filelist = new DataTable();//已定义变量,初始化操作 filelist.Columns.Add(new DataColumn("filename",typeof(string)));//文件名 filelist.Columns.Add(new DataColumn("filecontent",typeof(string)));//文件内容 /*准备发送*/ WriteStream("mail From: " strFrom); WriteStream("rcpt to: " strTo); WriteStream("data"); /*发送邮件头*/ WriteStream("Date: " DateTime.Now);//时间 WriteStream("From: " strFName "<" strFrom ">");//发件人 WriteStream("Subject: " strSub);//主题 WriteStream("To:" strTName "<" strTo ">");//收件人 //邮件格式 WriteStream("Content-Type: multipart/mixed; boundary=\"unique-boundary-1\""); WriteStream("Reply-To:" strFrom);//回复地址 WriteStream("X-Priority:" intPriority);//优先级 WriteStream("MIME-Version:1.0");//MIME版本 //数据ID,随意 WriteStream("Message-Id: " DateTime.Now.ToFileTime() "@security.com"); WriteStream("Content-Transfer-Encoding:" strEncode);//内容编码 WriteStream("X-Mailer:DS Mail Sender V1.0");//邮件发送者 WriteStream(""); WriteStream(AuthStream("This is a multi-part message in MIME format.")); WriteStream(""); //从此处开始进行分隔输入 WriteStream("--unique-boundary-1"); //在此处定义第二个分隔符 WriteStream("Content-Type: multipart/alternative;Boundary=\"unique-boundary-2\""); WriteStream(""); if(!isHtml) { //文本信息 WriteStream("--unique-boundary-2"); WriteStream("Content-Type: text/plain;charset=" strCharset); WriteStream("Content-Transfer-Encoding:" strEncode); WriteStream(""); WriteStream(strBody); WriteStream("");//一个部分写完之后就写如空信息,分段 WriteStream("--unique-boundary-2--");//分隔符的结束符号,尾巴后面多了-- WriteStream(""); } else { //html信息 WriteStream("--unique-boundary-2"); WriteStream("Content-Type: text/html;charset=" strCharset); WriteStream("Content-Transfer-Encoding:" strEncode); WriteStream(""); WriteStream(strHtm); WriteStream(""); WriteStream("--unique-boundary-2--");//分隔符的结束符号,尾巴后面多了-- WriteStream(""); } //增加附件 Attachment();//这个方法是我们在上面讲过的,实际上他放在这 WriteStream(""); WriteStream("--unique-boundary-1--"); if (!OperaStream(".","250"))//最后写完了,输入"." { this.Close(); //关闭连接 } } /*向服务器写入命令的方法*/ private void WriteStream(String strCmd) { Stream TcpStream;//定义操作对象 strCmd = strCmd "\r\n"; //加入换行符 TcpStream =this.GetStream();//获取数据流 //将命令行转化为byte[] byte[] bWrite = Encoding.GetEncoding(strCharset).GetBytes(strCmd.ToCharArray()); //由于每次写入的数据大小是有限制的,那么我们将每次写入的数据长度定在75个字节,一旦命令长度超过了75,就分步写入。 int start=0; int length=bWrite.Length; int page=0; int size=75; int count=size; try { if (length>75) { //数据分页 if ((length/size)*size<length) page=length/size 1; else page=length/size; for (int i=0;i<page;i ) { start=i*size; if (i==page-1) count=length-(i*size); TcpStream.Write(bWrite,start,count);//将数据写入到服务器上 } } else TcpStream.Write(bWrite,0,bWrite.Length); } catch(Exception) { } } /*接收服务器的返回信息*/ private string ReceiveStream() { String sp=null; byte[] by=new byte[1024]; NetworkStream ns = this.GetStream();//此处即可获取服务器的返回数据流 int size=ns.Read(by,0,by.Length);//读取数据流 if (size>0) { sp=Encoding.Default.GetString(by);//转化为String } return sp; } /*发出命令并判断返回信息是否正确*/ private bool OperaStream(string strCmd,string state) { string sp=null; bool success=false; try { WriteStream(strCmd);//写入命令 sp = ReceiveStream();//接受返回信息 if (sp.IndexOf(state)!=-1)//判断状态码是否正确 success=true; } catch(Exception ex) {Console.Write(ex.ToString());} return success; } /*取得服务器的连接*/ public bool getMailServer() { try { //域名解析 System.Net.IPAddress ipaddress=(IPAddress)System.Net.Dns.Resolve(strServer).AddressList.GetValue(0); System.Net.IPEndPoint endpoint=new IPEndPoint(ipaddress,strPort); Connect(endpoint);//连接Smtp服务器 ReceiveStream();//获取连接信息 if (strUse!=null) { //开始进行服务器认证 //如果状态码是250则表示操作成功 if (!OperaStream("EHLO Localhost","250")) { this.Close(); return false; } if (!OperaStream("AUTH LOGIN","334")) { this.Close(); return false; } strUse=AuthStream(strUse);//此处将username转换为Base64码 if (!OperaStream(strUse,"334")) { this.Close(); return false; } strPass=AuthStream(strPass);//此处将password转换为Base64码 if (!OperaStream(strPass,"235")) { this.Close(); return false; } return true; } else { //如果服务器不需要认证 if (OperaStream("HELO Localhost","250")) { return true; } else { return false; } } } catch(Exception ex) { System.Console.Write(ex.Message); return false; } } /*将数据转化为Base64编码字符串*/ private string AuthStream(String strCmd) { try { byte[] by=Encoding.Default.GetBytes(strCmd.ToCharArray()); strCmd=Convert.ToBase64String(by); } catch(Exception ex) {return ex.ToString();} return strCmd; } /*载入附件文件*/ public void LoadAttFile(String path) { //根据路径读出文件流 FileStream fstr=new FileStream(path,FileMode.Open);//建立文件流对象 byte[] by=new byte[Convert.ToInt32(fstr.Length)]; fstr.Read(by,0,by.Length);//读取文件内容 fstr.Close();//关闭 //格式转换 String fileinfo=Convert.ToBase64String(by);//转化为base64编码 //增加到文件表中 DataRow dr=filelist.NewRow(); dr[0]=Path.GetFileName(path);//获取文件名 dr[1]=fileinfo;//文件内容 filelist.Rows.Add(dr);//增加 } /*发送附件*/ private void Attachment() { //对文件列表做循环 for (int i=0;i<filelist.Rows.Count;i ) { DataRow dr=filelist.Rows[i]; WriteStream("--unique-boundary-1");//邮件内容分隔符 WriteStream("Content-Type: application/octet-stream;name=\"" dr[0].ToString() "\"");//文件格式 WriteStream("Content-Transfer-Encoding: base64");//内容的编码 WriteStream("Content-Disposition:attachment;filename=\"" dr[0].ToString() "\"");//文件名 WriteStream(""); String fileinfo=dr[1].ToString(); WriteStream(fileinfo);//写入文件的内容 WriteStream(""); } } /*退出服务器连接*/ public bool quitMailServer() { if(!OperaStream("quit","250")) { return false; } return true; } } }