⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 esmtp.cs

📁 ASP.NET构建的笑傲江湖社区(C#,全源码提供)
💻 CS
📖 第 1 页 / 共 2 页
字号:
				}
			}
			return true;
		}

		/// <summary>
		/// 添加一个密件收件人
		/// </summary>
		/// <param name="str">收件人地址</param>
		public bool AddRecipientBCC(string str)
		{
			if (str == null || str.Trim() == "")
				return true;
			if(RecipientBCCNum < 10)
			{
				RecipientBCC.Add(RecipientBCCNum,str);
				RecipientBCCNum ++;
				return true;
			}
			else
			{
				errmsg += "收件人过多";
				return false;
			}
		}

		/// <summary>
		/// 添加一组密件收件人(不超过10个),参数为字符串数组
		/// </summary>	
		/// <param name="str">保存有收件人地址的字符串数组(不超过10个)</param>
		public bool AddRecipientBCC(string[] str)
		{
			for(int i = 0; i < str.Length; i ++)
			{
				if (!AddRecipientBCC(str[i]))
				{
					return false;
				}
			}
			return true;
		}

		/// <summary>
		/// 发送SMTP命令
		/// </summary>	
		private bool SendCommand(string Command)
		{
			byte[]  WriteBuffer;
			if(Command == null || Command.Trim() == "")
			{
				return true;
			}
			logs += Command;
			WriteBuffer = Encoding.Default.GetBytes(Command);
			try
			{
				ns.Write(WriteBuffer,0,WriteBuffer.Length);
			}
			catch
			{
				errmsg = "网络连接错误";
				return false;
			}
			return true;
		}

		/// <summary>
		/// 接收SMTP服务器回应
		/// </summary>
		private string RecvResponse()
		{
			int StreamSize;
			string ReturnValue = "";
			byte[]  ReadBuffer = new byte[1024] ;
			try
			{
				StreamSize = ns.Read(ReadBuffer,0,ReadBuffer.Length);
			}
			catch
			{
				errmsg = "网络连接错误";
				return "false";
			}

			if (StreamSize == 0)
			{
				return ReturnValue ;
			}
			else
			{
				ReturnValue = Encoding.Default.GetString(ReadBuffer).Substring(0,StreamSize);
				logs += ReturnValue;
				return ReturnValue;
			}
		}

		/// <summary>
		/// 与服务器交互,发送一条命令并接收回应。
		/// </summary>
		/// <param name="Command">一个要发送的命令</param>
		/// <param name="errstr">如果错误,要反馈的信息</param>
		private bool Dialog(string Command,string errstr)
		{
			if (Command == null || Command.Trim() == "")
			{
				return true;
			}
			if (SendCommand(Command))
			{
				string RR = RecvResponse();
				if (RR == "false")
				{
					return false;
				}
				string RRCode = RR.Substring(0,3);
				if (RightCodeHT[RRCode] != null)
				{
					return true;
				}
				else
				{
					if(ErrCodeHT[RRCode] != null)
					{
						errmsg += (RRCode+ErrCodeHT[RRCode].ToString());
						errmsg += enter;
					}
					else
					{
						errmsg += RR;
					}
					errmsg += errstr;
					return false;
				}
			}
			else
			{
				return false;
			}
		}


		/// <summary>
		/// 与服务器交互,发送一组命令并接收回应。
		/// </summary>

		private bool Dialog(string[] Command,string errstr)
		{
			for(int i = 0; i < Command.Length; i ++)
			{
				if (!Dialog(Command[i],""))
				{
					errmsg += enter;
					errmsg += errstr;
					return false;
				}
			}
			return true;
		}

		private bool SendEmail()
		{
			//连接网络
			try
			{
				tc = new TcpClient(mailserver,mailserverport);
			}
			catch(Exception e)
			{
				errmsg = e.ToString();
				return false;
			}

			ns = tc.GetStream();
			SMTPCodeAdd();

			//验证网络连接是否正确
			if (RightCodeHT[RecvResponse().Substring(0,3)] == null)
			{
				errmsg = "网络连接失败";
				return false;
			}

			string[] SendBuffer;
			string SendBufferstr;

			//进行SMTP验证
			if (ESmtp)
			{
				SendBuffer = new string[4];
				SendBuffer[0] = "EHLO " + mailserver + enter;
				SendBuffer[1] = "AUTH LOGIN" + enter;
				SendBuffer[2] = Base64Encode(username) + enter;
				SendBuffer[3] = Base64Encode(password) + enter;
				if (!Dialog(SendBuffer,"SMTP服务器验证失败,请核对用户名和密码。"))
					return false;
			}
			else
			{
				SendBufferstr = "HELO " + mailserver + enter;
				if (!Dialog(SendBufferstr,""))
					return false;
			}

			SendBufferstr = "MAIL FROM:<" + From + ">" + enter;
			if(!Dialog(SendBufferstr,"发件人地址错误,或不能为空"))
				return false;

			SendBuffer = new string[10];
			for (int i = 0; i < Recipient.Count; i ++)
			{
				SendBuffer[i] = "RCPT TO:<" + Recipient[i].ToString() +">" + enter;
			}
			if (!Dialog(SendBuffer,"收件人地址有误"))
				return false;

			SendBuffer = new string[10];
			for(int i = 0; i < RecipientBCC.Count; i ++)
			{
				SendBuffer[i] = "RCPT TO:<" + RecipientBCC[i].ToString() +">" + enter;
			}
			if (!Dialog(SendBuffer,"密件收件人地址有误"))
				return false;

			SendBufferstr = "DATA" + enter;
			if (!Dialog(SendBufferstr,""))
				return false;

			SendBufferstr = "From:" + FromName + "<" + From +">" + enter;

			if (ReplyTo.Trim() != "")
			{
				SendBufferstr += "Reply-To: " + ReplyTo + enter;
			}

			SendBufferstr += "To:" + RecipientName + "<" + Recipient[0] +">" + enter;
			SendBufferstr += "CC:";
			for (int i = 1; i < Recipient.Count; i ++)
			{
				SendBufferstr += Recipient[i].ToString() + "<" + Recipient[i].ToString() + ">,";
			}
			SendBufferstr += enter;

			if (Charset == "")
			{
				SendBufferstr += "Subject:" + Subject + enter;
			}
			else
			{
				SendBufferstr += "Subject:" + "=?" + Charset.ToUpper() + "?B?" + Base64Encode(Subject) + "?=" + enter;
			}

			SendBufferstr += "X-Priority:" + priority + enter;
			SendBufferstr += "X-MSMail-Priority:" + priority + enter;
			SendBufferstr += "Importance:" + priority + enter;
			SendBufferstr += "X-Mailer: PowBoard" + enter;
			SendBufferstr += "MIME-Version: 1.0" + enter;

			if (Html)
			{
				SendBufferstr += "Content-Type: text/html;" + enter;
			}
			else
			{
				SendBufferstr += "Content-Type: text/plain;" + enter;
			}

			if (Charset == "")
			{
				SendBufferstr += "	charset=\"iso-8859-1\"" + enter;
			}
			else
			{
				SendBufferstr += "	charset=\"" + Charset.ToLower() + "\"" + enter;
			}

			SendBufferstr += "Content-Transfer-Encoding: base64" + enter;

			SendBufferstr += enter + enter;
			SendBufferstr += Base64Encode(Body) + enter;
			SendBufferstr += enter + "." + enter;

			if (!Dialog(SendBufferstr,"错误信件信息"))
				return false;

			SendBufferstr = "QUIT" + enter;
			if (!Dialog(SendBufferstr,"断开连接时错误"))
				return false;

			ns.Close();
			tc.Close();
			return true;
		}


		/// <summary>
		/// 发送邮件方法,所有参数均通过属性设置。
		/// </summary>
		public bool Send()
		{
			if (Recipient.Count == 0)
			{
				errmsg = "收件人列表不能为空";
				return false;
			}

			if(RecipientName == "")
				RecipientName = Recipient[0].ToString();

			if(mailserver.Trim() == "")
			{
				errmsg = "必须指定SMTP服务器";
				return false;
			}

			return SendEmail();
			
		}

		/// <summary>
		/// 发送邮件方法
		/// </summary>
		/// <param name="smtpserver">smtp服务器信息,如"username:password@www.smtpserver.com:25",也可去掉部分次要信息,如"www.smtpserver.com"</param>
		public bool Send(string smtpserver)
		{
			
			MailDomain = smtpserver;
			return Send();
		}

		/// <summary>
		/// 发送邮件方法
		/// </summary>
		/// <param name="smtpserver">smtp服务器信息,如"username:password@www.smtpserver.com:25",也可去掉部分次要信息,如"www.smtpserver.com"</param>
		/// <param name="from">发件人mail地址</param>
		/// <param name="fromname">发件人姓名</param>
		/// <param name="replyto">回复邮件地址</param>
		/// <param name="to">收件人地址</param>
		/// <param name="toname">收件人姓名</param>
		/// <param name="html">是否HTML邮件</param>
		/// <param name="subject">邮件主题</param>
		/// <param name="body">邮件正文</param>
		public bool Send(string smtpserver,string from,string fromname,string replyto,string to,string toname,bool html,string subject,string body)
		{
			MailDomain = smtpserver;
			From = from;
			FromName = fromname;
			ReplyTo = replyto;
			AddRecipient(to);
			RecipientName = toname;
			Html = html;
			Subject = subject;
			Body = body;
			return Send();
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -