using ProjectBase.Data.Logs; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace ProjectBase.Data.Email { /// /// 发送邮件的辅助类,可以发送附件、嵌入图片、HTML等内容邮件。使用底层SMTP协议指令进行发送。 /// public class EmailHelper { #region public属性字段 /// /// 设定语言代码,默认设定为GB2312,如不需要可设置为"" /// public string Charset = "GB2312"; private NetworkStream StrmWtr; private StreamReader StrmRdr; private String cmdData; private byte[] szData; private const String CRLF = "\r\n"; /// /// 邮箱服务器 /// public string MailServer { get { return mailserver; } set { mailserver = value; } } /// /// 邮件服务器端口号,默认端口为25 /// public int MailServerPort { set { mailserverport = value; } get { return mailserverport; } } /// /// SMTP认证时使用的用户名 /// public string MailServerUsername { set { if (value.Trim() != "") { username = value.Trim(); useSmtpAuth = true; } else { username = ""; useSmtpAuth = false; } } get { return username; } } /// /// SMTP认证时使用的密码 /// public string MailServerPassword { set { password = value; } get { return password; } } /// /// 发件人地址 /// public string From { get { return from; } set { from = value; //如果未设置fromName,则fromName使用发件人邮箱 if (string.IsNullOrEmpty(fromName)) { fromName = from; } } } /// /// 发件人姓名 /// public string FromName { get { return fromName; } set { fromName = value; } } /// /// 回复邮件地址 /// public string ReplyTo = ""; /// /// 邮件主题 /// public string Subject = ""; /// /// 是否Html邮件 /// public bool IsHtml = false; /// /// 收件人是否发送收条 /// public bool ReturnReceipt = false; /// /// 邮件正文 /// public string Body = ""; /// /// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5" /// public string Priority { set { switch (value.ToLower()) { case "high": priority = "High"; break; case "1": priority = "High"; break; case "normal": priority = "Normal"; break; case "3": priority = "Normal"; break; case "low": priority = "Low"; break; case "5": priority = "Low"; break; default: priority = "Normal"; break; } } } /// /// 错误消息反馈 /// public string ErrorMessage { get { return errmsg; } } /// /// 收件人姓名 /// public string RecipientName = ""; #endregion #region private属性字段 /// /// 邮件服务器域名 /// private string mailserver; /// /// 邮件服务器端口号 /// private int mailserverport = 995; /// /// 发件人地址 /// private string from = ""; /// /// 发件人姓名 /// private string fromName = ""; /// /// 是否需要SMTP验证 /// private bool useSmtpAuth = true; /// /// 是否需要Pop3验证 /// private bool usePop3Auth = false; /// /// SMTP认证时使用的用户名 /// private string username = ""; /// /// SMTP认证时使用的密码 /// private string password = ""; /// /// 收件人最大数量:现在很多SMTP都限制收件人的最大数量,以防止广告邮件泛滥,最大数量一般都限制在10个以下。 /// private int RecipientMaxNum = 10; /// /// 收件人列表 /// private ArrayList Recipient = new ArrayList(); /// ///抄送收件人列表 /// private ArrayList RecipientCC = new ArrayList(); /// /// 密送收件人列表 /// private ArrayList RecipientBCC = new ArrayList(); /// /// 邮件发送优先级,可设置为"High","Normal","Low"或"1","3","5" /// private string priority = "Normal"; /// /// 错误消息反馈 /// private string errmsg; /// /// 回车换行 /// private string enter = "\r\n"; /// /// TcpClient对象,用于连接服务器 /// private TcpClient tc; /// /// NetworkStream对象 /// private NetworkStream ns; /// /// SMTP错误代码哈希表 /// private Hashtable ErrCodeHT = new Hashtable(); /// /// SMTP正确代码哈希表 /// private Hashtable RightCodeHT = new Hashtable(); #endregion /// /// SMTP回应代码哈希表 /// private void SMTPCodeAdd() { ErrCodeHT.Add("500", "邮箱地址错误"); ErrCodeHT.Add("501", "参数格式错误"); ErrCodeHT.Add("502", "命令不可实现"); ErrCodeHT.Add("503", "服务器需要SMTP验证"); ErrCodeHT.Add("504", "命令参数不可实现"); ErrCodeHT.Add("421", "服务未就绪,关闭传输信道"); ErrCodeHT.Add("450", "要求的邮件操作未完成,邮箱不可用(例如,邮箱忙)"); ErrCodeHT.Add("550", "要求的邮件操作未完成,邮箱不可用(例如,邮箱未找到,或不可访问)"); ErrCodeHT.Add("451", "放弃要求的操作;处理过程中出错"); ErrCodeHT.Add("551", "用户非本地,请尝试"); ErrCodeHT.Add("452", "系统存储不足,要求的操作未执行"); ErrCodeHT.Add("552", "过量的存储分配,要求的操作未执行"); ErrCodeHT.Add("553", "邮箱名不可用,要求的操作未执行(例如邮箱格式错误)"); ErrCodeHT.Add("432", "需要一个密码转换"); ErrCodeHT.Add("534", "认证机制过于简单"); ErrCodeHT.Add("538", "当前请求的认证机制需要加密"); ErrCodeHT.Add("454", "临时认证失败"); ErrCodeHT.Add("530", "需要认证"); RightCodeHT.Add("220", "服务就绪"); RightCodeHT.Add("250", "要求的邮件操作完成"); RightCodeHT.Add("251", "用户非本地,将转发向"); RightCodeHT.Add("354", "开始邮件输入,以.结束"); RightCodeHT.Add("221", "服务关闭传输信道"); RightCodeHT.Add("334", "服务器响应验证Base64字符串"); RightCodeHT.Add("235", "验证成功"); } /// /// 默认构造函数 /// public EmailHelper() { SMTPCodeAdd(); } /// /// 待邮箱发送配置参数的构造函数 /// /// 邮件服务器 /// 用户名 /// 用户密码 public EmailHelper(string mailServer, string username, string password) : this(mailServer, username, password, 25) { } /// /// 待邮箱发送配置参数的构造函数 /// /// 邮件服务器 /// 用户名 /// 用户密码 /// 邮箱服务器端口 public EmailHelper(string mailServer, string username, string password, int port) { this.MailServer = mailServer; this.MailServerUsername = username; this.MailServerPassword = password; this.MailServerPort = port; SMTPCodeAdd(); } /// /// 析构函数 /// ~EmailHelper() { if (ns != null) { ns.Close(); } if (tc != null) { tc.Close(); } } #region 附件 /// /// 添加一个附件,需使用绝对路径 /// public bool AddAttachment(string path) { if (File.Exists(path)) { Attachments.Add(path); return true; } else { errmsg += "要附加的文件不存在" + enter; return false; } } /// /// 用于分割附件的分割符. /// private string boundary = "=====000_HuolxPubClass113273537350_====="; /// /// 分隔符 /// private string boundary1 = "=====001_HuolxPubClass113273537350_====="; /// /// 用于存放附件路径的信息 /// private List Attachments = new List(); /// /// 附件的BASE64编码字符串 /// /// 附件路径 private string AttachmentB64Str(string path) { FileStream fs; try { fs = new FileStream(path, System.IO.FileMode.Open, FileAccess.Read, FileShare.Read); } catch (Exception ex) { errmsg += "要附加的文件不存在" + enter; LogHelper.log.Error(errmsg, ex); return Base64Encode("要附加的文件:" + path + "不存在"); } int fl = (int)fs.Length; byte[] barray = new byte[fl]; fs.Read(barray, 0, fl); fs.Close(); return B64StrLine(Convert.ToBase64String(barray)); } /// /// 如果文件名中含有非英文字母,则将其编码 /// private string AttachmentNameStr(string fn) { if (Encoding.Default.GetByteCount(fn) > fn.Length) { return "=?" + Charset.ToUpper() + "?B?" + Base64Encode(fn) + "?="; } else { return fn; } } private string B64StrLine(string str) { StringBuilder B64sb = new StringBuilder(str); for (int i = 76; i < B64sb.Length; i += 78) { B64sb.Insert(i, enter); } return B64sb.ToString(); } /// /// 将字符串编码为Base64字符串 /// /// 要编码的字符串 private string Base64Encode(string str) { byte[] barray; barray = Encoding.Default.GetBytes(str); return Convert.ToBase64String(barray); } /// /// 将Base64字符串解码为普通字符串 /// /// 要解码的字符串 private string Base64Decode(string dstr) { byte[] barray; barray = Convert.FromBase64String(dstr); return Encoding.Default.GetString(barray); } #endregion #region 嵌入图片处理 private Hashtable EmbedList = new Hashtable(); //widened scope for MatchEvaluator /// /// 修改HTML页面中的图片引用为嵌入式图片邮件内容 /// /// 原始HTML内容 /// /// /// private string FixupReferences(string rawHtml, ref StringBuilder extras, string boundaryString) { //Build a symbol table to avoid redundant embedding. Regex imgRE, linkRE, hrefRE; MatchCollection imgMatches; //图片查找正则表达式 string imgMatchExpression = @"(?<=img+.+src\=[\x27\x22])(?[^\x27\x22]*)(?=[\x27\x22])"; imgRE = new Regex(imgMatchExpression, RegexOptions.IgnoreCase | RegexOptions.Compiled); //Link内容查找正则表达式 string linkMatchExpression = "<\\s*link[^>]+href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))[^>]*>"; linkRE = new Regex(linkMatchExpression, RegexOptions.IgnoreCase | RegexOptions.Compiled); //修正页面内相对URL地址表达式 string refMatchExpression = "href\\s*=\\s*(?:['\"](?<1>[^\"]*)['\"]|(?<1>\\S+))"; hrefRE = new Regex(refMatchExpression, RegexOptions.IgnoreCase | RegexOptions.Compiled); imgMatches = imgRE.Matches(rawHtml); foreach (Match m in imgMatches) { if (!EmbedList.ContainsKey(m.Groups[1].Value)) { EmbedList.Add(m.Groups[1].Value, Guid.NewGuid()); } } //准备嵌入数据 extras.Length = 0; string contentType; ArrayList embeddees = new ArrayList(EmbedList.Keys); foreach (string embeddee in embeddees) { contentType = embeddee.Substring(embeddee.LastIndexOf(".") + 1).ToLower(); extras.AppendFormat(boundaryString); if (contentType.Equals("jpg")) contentType = "jpeg"; switch (contentType) { case "jpeg": case "gif": case "png": case "bmp": extras.AppendFormat("Content-Type: image/{0}; charset=\"iso-8859-1\"\r\n", contentType); extras.Append("Content-Transfer-Encoding: base64\r\n"); extras.Append("Content-Disposition: inline\r\n"); extras.AppendFormat("Content-ID: <{0}>\r\n\r\n", EmbedList[embeddee]); extras.Append(GetDataAsBase64(embeddee)); extras.Append("\r\n"); break; } } //Fixups for references to items now embedded rawHtml = imgRE.Replace(rawHtml, new MatchEvaluator(FixupEmbedPath)); return rawHtml; } /// /// 修正嵌入图片的地址应用为cid:*** /// private string FixupEmbedPath(Match m) { string replaceThis = m.Groups[1].Value; string withThis = string.Format("cid:{0}", EmbedList[replaceThis]); return m.Value.Replace(replaceThis, withThis); } private string GetDataAsBase64(string sUrl) { WebClient webClient = new WebClient(); webClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible;MSIE 6.0)"); MemoryStream memoryStream = new MemoryStream(); Stream stream = webClient.OpenRead(sUrl); byte[] chunk = new byte[4096]; int cbChunk; while ((cbChunk = stream.Read(chunk, 0, 4096)) > 0) memoryStream.Write(chunk, 0, cbChunk); stream.Close(); byte[] buf = new byte[memoryStream.Length]; memoryStream.Position = 0; memoryStream.Read(buf, 0, (int)memoryStream.Length); memoryStream.Close(); string b64 = Convert.ToBase64String(buf); StringBuilder base64 = new StringBuilder(); int i; for (i = 0; i + 60 < b64.Length; i += 60) base64.AppendFormat("{0}\r\n", b64.Substring(i, 60)); base64.Append(b64.Substring(i)); for (i = 0; i < (60 - (b64.Length % 60)); i++) base64.Append('='); base64.Append("\r\n"); return base64.ToString(); } private string GetDataAsString(string sUrl) { WebClient webClient = new WebClient(); webClient.Headers.Add("user-agent", "Mozilla/4.0 (compatible;MSIE 6.0)"); return (new StreamReader(webClient.OpenRead(sUrl))).ReadToEnd(); } #endregion #region 收件人 /// /// 添加一个收件人 /// /// 收件人地址 /// private bool AddRs(string str, ArrayList ra) { str = str.Trim(); if (str == null || str == "" || str.IndexOf("@") == -1) { return true; // 上面的语句自动滤除无效的收件人,为了不影响正常运作,未返回错误,如果您需要严格的检查收件人,请替换为下面的语句。 // errmsg+="存在无效收件人:" +str; // return false; } if (ra.Count < RecipientMaxNum) { ra.Add(str); return true; } else { errmsg += "收件人过多"; return false; } } /// /// 添加一组收件人(不超过10个),参数为字符串数组 /// /// 保存有收件人地址的字符串数组(不超过10个) /// 添加的数组列表 private bool AddRs(string[] str, ArrayList ra) { for (int i = 0; i < str.Length; i++) { if (!AddRs(str[i], ra)) { return false; } } return true; } /// /// 添加一个收件人 /// /// 收件人地址 public bool AddRecipient(string str) { return AddRs(str, Recipient); } /// /// 指定一个收件人 /// /// 收件人地址 public void SetRecipient(string str) { //return AddRs(str, Recipient); Recipient.Clear(); Recipient.Add(str); } /// /// 添加一组收件人(不超过10个),参数为字符串数组 /// /// 保存有收件人地址的字符串数组(不超过RecipientMaxNum个) public bool AddRecipient(string[] str) { return AddRs(str, Recipient); } /// /// 添加一个抄送收件人 /// /// 收件人地址 public bool AddRecipientCC(string str) { return AddRs(str, RecipientCC); } /// /// 添加一组抄送收件人(不超过10个),参数为字符串数组 /// /// 保存有收件人地址的字符串数组(不超过RecipientMaxNum个) public bool AddRecipientCC(string[] str) { return AddRs(str, RecipientCC); } /// /// 添加一个密件收件人 /// /// 收件人地址 public bool AddRecipientBCC(string str) { return AddRs(str, RecipientBCC); } /// /// 添加一组密件收件人(不超过10个),参数为字符串数组 /// /// 保存有收件人地址的字符串数组(不超过RecipientMaxNum个) public bool AddRecipientBCC(string[] str) { return AddRs(str, RecipientBCC); } /// /// 清空收件人列表 /// public void ClearRecipient() { Recipient.Clear(); } #endregion #region 连接邮件服务器 /// /// 发送SMTP命令 /// 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; } /// /// 接收SMTP服务器回应 /// private string RecvResponse() { int StreamSize; string ReturnValue = "false"; byte[] ReadBuffer = new byte[4096]; try { StreamSize = ns.Read(ReadBuffer, 0, ReadBuffer.Length); } catch { errmsg = "网络连接错误"; return ReturnValue; } if (StreamSize == 0) { return ReturnValue; } else { ReturnValue = Encoding.Default.GetString(ReadBuffer).Substring(0, StreamSize).Trim(); ; //logs+=ReturnValue; return ReturnValue; } } /// /// 与服务器交互,发送一条命令并接收回应。 /// /// 一个要发送的命令 /// 如果错误,要反馈的信息 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 = ""; if (RR.Length >= 3) RRCode = RR.Substring(0, 3); else RRCode = RR; if (ErrCodeHT[RRCode] != null) { errmsg += (RRCode + ErrCodeHT[RRCode].ToString()); errmsg += enter; return false; } else { return true; } } else { return false; } } /// /// 与服务器交互,发送一组命令并接收回应。 /// private bool Dialog(ArrayList Command, string errstr) { foreach (String item in Command) { if (!Dialog(item, "")) { errmsg += enter; errmsg += errstr; return false; } } return true; } /// /// SMTP验证过程. /// private bool SmtpAuth() { ArrayList SendBuffer = new ArrayList(); string SendBufferstr; SendBufferstr = "EHLO " + mailserver + enter; // SendBufferstr="HELO " + mailserver + enter; //这个地方经常出现命令错位,不得以加入特殊控制代码,才能正常执行。 //以后最好能有更好的解决办法。 if (SendCommand(SendBufferstr)) { while (true) { int i = 0; if (ns.DataAvailable) { string RR = RecvResponse(); if (RR == "false") { return false; } string RRCode = RR.Substring(0, 3); if (RightCodeHT[RRCode] != null) { if (RR.IndexOf("AUTH") != -1) { break; } } else { if (ErrCodeHT[RRCode] != null) { errmsg += (RRCode + ErrCodeHT[RRCode].ToString()); errmsg += enter; errmsg += "发送EHLO命令出错,服务器可能不需要验证" + enter; } else { errmsg += RR; errmsg += "发送EHLO命令出错,不明错误,请与作者联系" + enter; } return false; } } else { System.Threading.Thread.Sleep(50); i++; if (i > 6) { errmsg += "收不到AUTH指令,可能是连接超时,或者服务器根本不需要验证" + enter; return false; } } } } else { errmsg += "发送ehlo命令失败"; return false; } SendBuffer.Add("AUTH LOGIN" + enter); SendBuffer.Add(Base64Encode(username) + enter); SendBuffer.Add(Base64Encode(password) + enter); if (!Dialog(SendBuffer, "SMTP服务器验证失败,请核对用户名和密码。")) return false; return true; } #endregion #region 发送 /// /// 发送邮件 /// public bool SendEmail() { bool checkFlag = Check(); if (!checkFlag) return false; #region 连接网络 try { tc = new TcpClient(mailserver, mailserverport); ns = tc.GetStream(); } catch (Exception e) { errmsg = e.ToString(); return false; } //验证网络连接是否正确 if (RightCodeHT[RecvResponse().Substring(0, 3)] == null) { errmsg = "网络连接失败"; return false; } #endregion #region 验证发件收件人 ArrayList SendBuffer = new ArrayList(); string SendBufferstr; //进行SMTP验证 if (useSmtpAuth) { if (!SmtpAuth()) return false; } else if (usePop3Auth) { if (!Pop3Auth(tc)) return false; } else { SendBufferstr = "HELO " + mailserver + enter; if (!Dialog(SendBufferstr, "")) return false; } //发件人信息 SendBufferstr = "MAIL FROM:<" + From + ">" + enter; if (!Dialog(SendBufferstr, "发件人地址错误,或不能为空")) return false; //收件人列表 SendBuffer.Clear(); foreach (String item in Recipient) { SendBuffer.Add("RCPT TO:<" + item + ">" + enter); RecipientName = item;//这里其实只能支持一个收件人 } if (!Dialog(SendBuffer, "收件人地址有误")) return false; #endregion #region 邮件头部 //开始发送信件内容 SendBufferstr = "DATA" + enter; if (!Dialog(SendBufferstr, "")) return false; //发件人 SendBufferstr = "From:\"" + FromName + "\" <" + From + ">" + enter; //收件人 SendBufferstr += "To:\"" + RecipientName + "\" <" + RecipientName + ">" + enter; //回复地址 if (ReplyTo.Trim() != "") { SendBufferstr += "Reply-To: " + ReplyTo + enter; } //抄送收件人列表 if (RecipientCC.Count > 0) { SendBufferstr += "CC:"; foreach (String item in RecipientCC) { SendBufferstr += item + "<" + item + ">," + enter; } SendBufferstr = SendBufferstr.Substring(0, SendBufferstr.Length - 3) + enter; } //密件收件人列表 if (RecipientBCC.Count > 0) { SendBufferstr += "BCC:"; foreach (String item in RecipientBCC) { SendBufferstr += item + "<" + item + ">," + enter; } SendBufferstr = SendBufferstr.Substring(0, SendBufferstr.Length - 3) + enter; } //邮件主题 if (Charset == "") { SendBufferstr += "Subject:" + Subject + enter; } else { SendBufferstr += "Subject:" + "=?" + Charset.ToUpper() + "?B?" + Base64Encode(Subject) + "?=" + enter; } //是否需要收件人发送收条 if (true == ReturnReceipt) { SendBufferstr += "Disposition-Notification-To: \"" + FromName + "\" <" + ReplyTo + ">" + enter; } #endregion #region 邮件内容 SendBufferstr += "X-Priority:" + priority + enter; SendBufferstr += "X-MSMail-Priority:" + priority + enter; SendBufferstr += "Importance:" + priority + enter; SendBufferstr += "X-Mailer: Huolx.Pubclass" + enter; SendBufferstr += "MIME-Version: 1.0" + enter; SendBufferstr += "Content-Type: multipart/mixed;" + enter; SendBufferstr += " boundary=\"" + boundary + "\"" + enter + enter; SendBufferstr += "This is a multi-part message in MIME format." + enter + enter; SendBufferstr += "--" + boundary + enter; SendBufferstr += "Content-Type: multipart/alternative;" + enter; SendBufferstr += " boundary=\"" + boundary1 + "\"" + enter + enter + enter; SendBufferstr += "--" + boundary1 + enter; //判断信件格式是否html if (IsHtml) { 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; StringBuilder extras = new StringBuilder(); string extrasBoundary = "--" + boundary + enter; string newBodyHtml = FixupReferences(this.Body, ref extras, extrasBoundary); SendBufferstr += enter + enter; SendBufferstr += B64StrLine(Base64Encode(newBodyHtml)) + enter; SendBufferstr += enter + "--" + boundary1 + "--" + enter + enter; SendBufferstr += extras.ToString(); //如果有附件,开始发送附件. if (Attachments.Count > 0) { SendBufferstr += enter + "--" + boundary1 + "--" + enter + enter; foreach (String item in Attachments) { SendBufferstr += "--" + boundary + enter; SendBufferstr += "Content-Type: application/octet-stream;" + enter; SendBufferstr += " name=\"" + AttachmentNameStr(item.Substring(item.LastIndexOf("\\") + 1)) + "\"" + enter; SendBufferstr += "Content-Transfer-Encoding: base64" + enter; SendBufferstr += "Content-Disposition: attachment;" + enter; SendBufferstr += " filename=\"" + AttachmentNameStr(item.Substring(item.LastIndexOf("\\") + 1)) + "\"" + enter + enter; SendBufferstr += AttachmentB64Str(item) + enter + enter; } SendBufferstr += "--" + boundary + "--" + enter + enter; } SendBufferstr += enter + "." + enter; if (!Dialog(SendBufferstr, "错误信件信息")) return false; #endregion SendBufferstr = "QUIT" + enter; if (!Dialog(SendBufferstr, "断开连接时错误")) return false; ns.Close(); tc.Close(); return true; } private bool Pop3Auth(TcpClient tc) { try { StrmWtr = tc.GetStream(); StrmRdr = new StreamReader(tc.GetStream()); //Login cmdData = "USER " + MailServerUsername + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(cmdData.ToCharArray()); StrmWtr.Write(szData, 0, szData.Length); //this.getSatus(); cmdData = "PASS " + MailServerPassword + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(cmdData.ToCharArray()); StrmWtr.Write(szData, 0, szData.Length); //Get Email's Info cmdData = "STAT" + CRLF; szData = System.Text.Encoding.ASCII.GetBytes(cmdData.ToCharArray()); StrmWtr.Write(szData, 0, szData.Length); } catch (InvalidOperationException err) { LogHelper.log.Error("ERROR: " + err.Message.ToString()); return false; } return true; } /// /// 发送邮件前对参数进行检查,通过检查返回True,否则为False /// /// 如果通过检查返回true,否则为false private bool Check() { if (Recipient.Count == 0) { errmsg = "收件人列表不能为空"; return false; } if (RecipientName == "") { RecipientName = Recipient[0].ToString(); } if (mailserver.Trim() == "") { errmsg = "必须指定SMTP服务器"; return false; } return true; } #endregion } }