using System; using System.Text; using System.Net.Mail; using System.Net; using System.Linq; using System.Text.RegularExpressions; namespace Dos.ORM.Common.Helpers { /// <summary> /// 发送邮件帮助类 /// </summary> public class EmailHelper { private readonly SmtpClient _smtp = new SmtpClient(); private Encoding Encoding { get; set; } private bool IsHtml { get; set; } private string[] Cc { get; set; } private string[] Bcc { get; set; } /// <summary> /// 是否为腾讯企业邮箱 /// </summary> private readonly bool _isExmailQq; /// <summary> /// 发件邮箱密码或授权码 /// </summary> private string Password { get; set; } /// <summary> /// 获取发送结果,成功则为空 /// </summary> public string Result { get; private set; } /// <summary> /// 设置邮件编码类型 /// </summary> /// <param name="contentEncoding"></param> public void SetEncoding(Encoding contentEncoding) { Encoding = contentEncoding; } /// <summary> ///设置邮件正文是否为 Html 格式 /// </summary> /// <param name="isHtml"></param> public void SetIsHtml(bool isHtml) { IsHtml = isHtml; } /// <summary> /// 抄送 /// </summary> /// <param name="cc"></param> public void SetCc(params string[] cc) { Cc = cc; } /// <summary> /// 暗送 /// </summary> /// <param name="bc"></param> public void SetBc(params string[] bc) { Bcc = bc; } /// <summary> /// 是否ssl加密 /// </summary> /// <param name="isSsl"></param> public void SetIsSsl(bool isSsl) { _smtp.EnableSsl = isSsl; } /// <summary> /// 构造函数 /// </summary> /// <param name="host">SMTP事务的主机的名称或IP地址</param> /// <param name="sendUserAccName">发件人邮件账号名称(不包含@及后缀)</param> /// <param name="sendUserPwd">发件人邮箱密码</param> /// <param name="isExmailQq">是否为腾讯企业邮箱</param> /// <param name="port">端口号,默认为25</param> public EmailHelper(string host, string sendUserAccName, string sendUserPwd, bool isExmailQq = false, int port = 25) { _smtp.Host = host; Password = sendUserPwd; _isExmailQq = isExmailQq; _smtp.Port = port != 25 ? port : 0x19; _smtp.EnableSsl = false; IsHtml = true; Encoding = Encoding.UTF8; if (string.IsNullOrEmpty(sendUserAccName) || string.IsNullOrEmpty(sendUserPwd)) { _smtp.UseDefaultCredentials = false; } else { _smtp.Credentials = new NetworkCredential(sendUserAccName, sendUserPwd); } } /// <summary> /// 发送邮件 /// </summary> /// <param name="fromAcc">发件人邮件地址</param> /// <param name="fromUserNickname">发件人显示名称</param> /// <param name="toUserAcc">收件人地址</param> /// <param name="title">邮件标题</param> /// <param name="body">邮件正文</param> /// <param name="file">附件地址数组</param> /// <returns>bool 是否成功 </returns> public bool Send(string fromAcc, string fromUserNickname, string toUserAcc, string title, string body, params string[] file) { return Send(fromAcc, fromUserNickname, new string[] { toUserAcc }, title, body, file); } /// <summary> /// 发送邮件 /// </summary> /// <param name="fromAcc">发件人邮件地址</param> /// <param name="fromUserNickname">发件人显示名称</param> /// <param name="toUserAcc">收件人地址</param> /// <param name="title">邮件标题</param> /// <param name="body">邮件正文</param> /// <param name="file">附件地址数组</param> /// <returns>bool 是否成功 </returns> public bool Send(string fromAcc, string fromUserNickname, string[] toUserAcc, string title, string body, params string[] file) { string mailReg = @"^[w-]+(.[w-]+)*@[w-]+(.[w-]+)+$"; if (toUserAcc == null) { throw new ArgumentNullException("EmailHelper.Send.to"); } if (toUserAcc.Any(oit => !Regex.IsMatch(oit + "", mailReg))) { Result = "收件人地址不合法"; return false; } if (Bcc != null && Bcc.Length > 0) { if (Bcc.Any(oit => !Regex.IsMatch(oit + "", mailReg))) { Result = "暗送人地址不合法"; return false; } } if (Cc != null && Cc.Length > 0) { if (Cc.Any(oit => !Regex.IsMatch(oit + "", mailReg))) { Result = "抄送人地址不合法"; return false; } } if (_isExmailQq) { #region 检查是否为腾讯企业邮箱(注意这里有一个坑,腾旭企业邮箱需要单独进行以下设置) //此坑可参见:https://www.cnblogs.com/gxivwshjj/p/7562311.html var mail = new System.Web.Mail.MailMessage(); try { mail.To = string.Join(";", toUserAcc); mail.From = fromAcc; mail.Subject = title; mail.BodyFormat = System.Web.Mail.MailFormat.Html; mail.Body = body; //设置基础身份验证为1 mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1"); //设置发件邮箱地址 mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", fromAcc); //设置发件邮箱密码 mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", Password); //设置端口号为465 mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 465); //设置SSL为true mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true"); //发送邮件的附件 foreach (var r in file) { var objMailAttachment = new Attachment(r); mail.Attachments.Add(objMailAttachment); } System.Web.Mail.SmtpMail.SmtpServer = _smtp.Host; System.Web.Mail.SmtpMail.Send(mail); return true; } catch (Exception ex) { Result = ex.Message; } #endregion } else { MailMessage message = new MailMessage(); //创建一个附件对象 foreach (var r in file) { //发送邮件的附件 var objMailAttachment = new Attachment(r); message.Attachments.Add(objMailAttachment); } message.From = new MailAddress(fromAcc, fromUserNickname); message.Subject = title; message.SubjectEncoding = Encoding; message.Body = body; message.BodyEncoding = Encoding; message.IsBodyHtml = IsHtml; message.Priority = MailPriority.Normal; foreach (string str in toUserAcc) { message.To.Add(str); } if (Bcc != null && Bcc.Length > 0) { foreach (string b in Bcc) { message.Bcc.Add(b); } } if (Cc != null && Cc.Length > 0) { foreach (string c in Cc) { message.CC.Add(c); } } try { _smtp.Send(message); return true; } catch (Exception ex) { Result = ex.Message; } } return false; } } }