在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#网络编程 → c#发送邮件类(含接收邮件和发送邮件源码)

c#发送邮件类(含接收邮件和发送邮件源码)

C#网络编程

下载此实例
  • 开发语言:C#
  • 实例大小:6.83KB
  • 下载次数:157
  • 浏览次数:511
  • 发布时间:2014-09-02
  • 实例类别:C#网络编程
  • 发 布 人:flywin
  • 文件格式:.rar
  • 所需积分:0
 相关标签: 邮件 C#

实例介绍

【实例简介】实现发送邮件的类,同时包含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;
		}
	}
}

标签: 邮件 C#

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警