.Net Email操作类

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;
        }
    }
}

 

posted @ 2017-12-26 09:11  你也很优秀  阅读(368)  评论(0编辑  收藏  举报