1 using System; 2 using System.Text; 3 using System.Net.Mail; 4 using System.Net; 5 using System.Linq; 6 using System.Text.RegularExpressions; 7 8 namespace Dos.ORM.Common.Helpers 9 { 10 /// <summary> 11 /// 发送邮件帮助类 12 /// </summary> 13 public class EmailHelper 14 { 15 16 private readonly SmtpClient _smtp = new SmtpClient(); 17 private Encoding Encoding { get; set; } 18 private bool IsHtml { get; set; } 19 private string[] Cc { get; set; } 20 private string[] Bcc { get; set; } 21 22 /// <summary> 23 /// 是否为腾讯企业邮箱 24 /// </summary> 25 private readonly bool _isExmailQq; 26 27 /// <summary> 28 /// 发件邮箱密码或授权码 29 /// </summary> 30 private string Password { get; set; } 31 32 /// <summary> 33 /// 获取发送结果,成功则为空 34 /// </summary> 35 public string Result { get; private set; } 36 37 /// <summary> 38 /// 设置邮件编码类型 39 /// </summary> 40 /// <param name="contentEncoding"></param> 41 public void SetEncoding(Encoding contentEncoding) 42 { 43 Encoding = contentEncoding; 44 45 } 46 /// <summary> 47 ///设置邮件正文是否为 Html 格式 48 /// </summary> 49 /// <param name="isHtml"></param> 50 public void SetIsHtml(bool isHtml) 51 { 52 IsHtml = isHtml; 53 } 54 /// <summary> 55 /// 抄送 56 /// </summary> 57 /// <param name="cc"></param> 58 public void SetCc(params string[] cc) 59 { 60 Cc = cc; 61 } 62 63 /// <summary> 64 /// 暗送 65 /// </summary> 66 /// <param name="bc"></param> 67 public void SetBc(params string[] bc) 68 { 69 Bcc = bc; 70 } 71 /// <summary> 72 /// 是否ssl加密 73 /// </summary> 74 /// <param name="isSsl"></param> 75 public void SetIsSsl(bool isSsl) 76 { 77 _smtp.EnableSsl = isSsl; 78 } 79 80 /// <summary> 81 /// 构造函数 82 /// </summary> 83 /// <param name="host">SMTP事务的主机的名称或IP地址</param> 84 /// <param name="sendUserAccName">发件人邮件账号名称(不包含@及后缀)</param> 85 /// <param name="sendUserPwd">发件人邮箱密码</param> 86 /// <param name="isExmailQq">是否为腾讯企业邮箱</param> 87 /// <param name="port">端口号,默认为25</param> 88 public EmailHelper(string host, string sendUserAccName, string sendUserPwd, bool isExmailQq = false, int port = 25) 89 { 90 _smtp.Host = host; 91 Password = sendUserPwd; 92 _isExmailQq = isExmailQq; 93 _smtp.Port = port != 25 ? port : 0x19; 94 _smtp.EnableSsl = false; 95 96 IsHtml = true; 97 Encoding = Encoding.UTF8; 98 99 if (string.IsNullOrEmpty(sendUserAccName) || string.IsNullOrEmpty(sendUserPwd)) 100 { 101 _smtp.UseDefaultCredentials = false; 102 } 103 else 104 { 105 _smtp.Credentials = new NetworkCredential(sendUserAccName, sendUserPwd); 106 } 107 } 108 109 /// <summary> 110 /// 发送邮件 111 /// </summary> 112 /// <param name="fromAcc">发件人邮件地址</param> 113 /// <param name="fromUserNickname">发件人显示名称</param> 114 /// <param name="toUserAcc">收件人地址</param> 115 /// <param name="title">邮件标题</param> 116 /// <param name="body">邮件正文</param> 117 /// <param name="file">附件地址数组</param> 118 /// <returns>bool 是否成功 </returns> 119 public bool Send(string fromAcc, string fromUserNickname, string toUserAcc, string title, string body, params string[] file) 120 { 121 return Send(fromAcc, fromUserNickname, new string[] { toUserAcc }, title, body, file); 122 } 123 124 /// <summary> 125 /// 发送邮件 126 /// </summary> 127 /// <param name="fromAcc">发件人邮件地址</param> 128 /// <param name="fromUserNickname">发件人显示名称</param> 129 /// <param name="toUserAcc">收件人地址</param> 130 /// <param name="title">邮件标题</param> 131 /// <param name="body">邮件正文</param> 132 /// <param name="file">附件地址数组</param> 133 /// <returns>bool 是否成功 </returns> 134 public bool Send(string fromAcc, string fromUserNickname, string[] toUserAcc, string title, string body, params string[] file) 135 { 136 string mailReg = @"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"; 137 if (toUserAcc == null) 138 { 139 throw new ArgumentNullException("EmailHelper.Send.to"); 140 } 141 142 if (toUserAcc.Any(oit => !Regex.IsMatch(oit + "", mailReg))) 143 { 144 Result = "收件人地址不合法"; 145 return false; 146 } 147 if (Bcc != null && Bcc.Length > 0) 148 { 149 if (Bcc.Any(oit => !Regex.IsMatch(oit + "", mailReg))) 150 { 151 Result = "暗送人地址不合法"; 152 return false; 153 } 154 } 155 if (Cc != null && Cc.Length > 0) 156 { 157 if (Cc.Any(oit => !Regex.IsMatch(oit + "", mailReg))) 158 { 159 Result = "抄送人地址不合法"; 160 return false; 161 } 162 } 163 164 if (_isExmailQq) 165 { 166 #region 检查是否为腾讯企业邮箱(注意这里有一个坑,腾旭企业邮箱需要单独进行以下设置) 167 //此坑可参见:https://www.cnblogs.com/gxivwshjj/p/7562311.html 168 169 var mail = new System.Web.Mail.MailMessage(); 170 try 171 { 172 mail.To = string.Join(";", toUserAcc); 173 mail.From = fromAcc; 174 mail.Subject = title; 175 mail.BodyFormat = System.Web.Mail.MailFormat.Html; 176 mail.Body = body; 177 178 //设置基础身份验证为1 179 mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1"); 180 //设置发件邮箱地址 181 mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", fromAcc); 182 //设置发件邮箱密码 183 mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", Password); 184 //设置端口号为465 185 mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 465); 186 //设置SSL为true 187 mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true"); 188 189 //发送邮件的附件 190 foreach (var r in file) 191 { 192 var objMailAttachment = new Attachment(r); 193 mail.Attachments.Add(objMailAttachment); 194 } 195 196 System.Web.Mail.SmtpMail.SmtpServer = _smtp.Host; 197 System.Web.Mail.SmtpMail.Send(mail); 198 199 return true; 200 } 201 catch (Exception ex) 202 { 203 Result = ex.Message; 204 } 205 206 #endregion 207 } 208 else 209 { 210 MailMessage message = new MailMessage(); 211 212 //创建一个附件对象 213 foreach (var r in file) 214 { 215 //发送邮件的附件 216 var objMailAttachment = new Attachment(r); 217 message.Attachments.Add(objMailAttachment); 218 } 219 message.From = new MailAddress(fromAcc, fromUserNickname); 220 message.Subject = title; 221 message.SubjectEncoding = Encoding; 222 message.Body = body; 223 message.BodyEncoding = Encoding; 224 message.IsBodyHtml = IsHtml; 225 message.Priority = MailPriority.Normal; 226 foreach (string str in toUserAcc) 227 { 228 message.To.Add(str); 229 } 230 if (Bcc != null && Bcc.Length > 0) 231 { 232 foreach (string b in Bcc) 233 { 234 message.Bcc.Add(b); 235 } 236 } 237 if (Cc != null && Cc.Length > 0) 238 { 239 foreach (string c in Cc) 240 { 241 message.CC.Add(c); 242 } 243 } 244 245 try 246 { 247 _smtp.Send(message); 248 return true; 249 } 250 catch (Exception ex) 251 { 252 Result = ex.Message; 253 } 254 } 255 256 return false; 257 } 258 } 259 }