.net下发送Email的Helper类

@老徐  December 25, 2018

一、适用场景

前段时间因为业务需要自动给客户发送支持HTML格式的而且带附件的Email,而且使用的还是Office365邮箱,就抽时间看了一下这方面的内容,并写了这个帮助类。
该类是使用的SMTP服务发送Email,可以支持OFFICE365等邮箱,支持SSL、HTML邮件、附件等。目前未启用加密的常规发送和使用Office365邮箱发送都已经测试通过。
该代码目前是使用在.net 4.0环境下,理论上.net 4.0~.net 4.7都可以使用,.net core下没有测试。

二、代码

1.添加引用

using System.Net;
using System.Net.Mail;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

2.公共属性:

        #region 公共属性

        #region SMTP服务器及发信人
        /// <summary>
        /// SMTP服务器
        /// </summary>
        public string SmtpHost { get; set; }

        /// <summary>
        /// SMTP端口号
        /// </summary>
        public int SmtpPort { get; set; }

        /// <summary>
        /// 是否SSL
        /// </summary>
        public bool EnableSsl { get; set; }

        /// <summary>
        /// 发信人邮箱
        /// </summary>
        public string FromEmailAddress { get; set; }

        /// <summary>
        /// 发信人密码
        /// </summary>
        public string FromEmailPassword { get; set; }
        #endregion
        #region 收件人信邮件内容

        /// <summary>
        /// 收件人Email
        /// </summary>
        public string ToEmailAddress { get; set; }

        /// <summary>
        /// 抄送,多个使用英文逗号分割
        /// </summary>
        public string CCEmailAddress { get; set; }

        /// <summary>
        /// 密送,多个使用英文逗号分割
        /// </summary>
        public string BCCEmailAddress { get; set; }

        /// <summary>
        /// 标题
        /// </summary>
        public string Subject { get; set; }

        /// <summary>
        /// 邮件内容
        /// </summary>
        public string Body { get; set; }

        /// <summary>
        /// 是否HTML邮件
        /// </summary>
        public bool IsBodyHtml { get; set; }

        /// <summary>
        /// 附件列表
        /// </summary>
        public List<Attachment> AttachmentList { get; set; }
        #endregion
        #endregion

3.实现方法

        /// <summary>
        /// 使用HTTPS发送的时候需要使用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="certificate"></param>
        /// <param name="chain"></param>
        /// <param name="sslPolicyErrors"></param>
        /// <returns></returns>
        public static bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        } 

        public void Send()
        {
            if (EnableSsl)
            {   //启用SSL
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
            }
                
            SmtpClient smtp = new SmtpClient();                 //实例化一个SmtpClient
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;   //将smtp的出站方式设为 Network
            smtp.EnableSsl = false;                             //smtp服务器是否启用SSL加密
            smtp.Host = this.SmtpHost;                          //指定 smtp 服务器地址
            smtp.Port = this.SmtpPort;                          //指定 smtp 服务器的端口,默认是25,如果采用默认端口,可省去
            smtp.UseDefaultCredentials = false;                  //如果你的SMTP服务器不需要身份认证,则使用下面的方式,不过,目前基本没有不需要认证的了
            smtp.EnableSsl = EnableSsl;
            smtp.Credentials = new NetworkCredential(this.FromEmailAddress, this.FromEmailPassword);    //如果需要认证,则用下面的方式

            MailMessage mm = new MailMessage(); //实例化一个邮件类
            mm.Priority = MailPriority.High; //邮件的优先级,分为 Low, Normal, High,通常用 Normal即可
            mm.From = new MailAddress(this.FromEmailAddress, "中一期货", Encoding.GetEncoding(936));
 
            //收件人
            if (!string.IsNullOrEmpty(this.ToEmailAddress))
                mm.To.Add(this.ToEmailAddress);
            //抄送人
            if (!string.IsNullOrEmpty(this.CCEmailAddress))
                mm.CC.Add(this.CCEmailAddress);
            //密送人
            if (!string.IsNullOrEmpty(this.BCCEmailAddress))
                mm.Bcc.Add(this.BCCEmailAddress);
 
            mm.Subject = this.Subject;                      //邮件标题
            mm.SubjectEncoding = Encoding.GetEncoding(936); //这里非常重要,如果你的邮件标题包含中文,这里一定要指定,否则对方收到的极有可能是乱码。
            mm.IsBodyHtml = this.IsBodyHtml;                //邮件正文是否是HTML格式
            mm.BodyEncoding = Encoding.GetEncoding(936);    //邮件正文的编码, 设置不正确, 接收者会收到乱码
            mm.Body = this.Body;                            //邮件正文
            //邮件附件
            if (this.AttachmentList != null && this.AttachmentList.Count > 0)
            {
                foreach (Attachment attachment in this.AttachmentList)
                {
                    mm.Attachments.Add(attachment);
                }
            }
            //发送邮件,如果不返回异常, 则大功告成了。
            smtp.Send(mm);
        }

要注意的是,如果SMTP服务器要求SSL的话,必须要加ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);

4.完整的代码如下:

using System.Net;
using System.Net.Mail;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

    public class EmailHelper
    {
        #region 公共属性

        #region SMTP服务器及发信人
        /// <summary>
        /// SMTP服务器
        /// </summary>
        public string SmtpHost { get; set; }

        /// <summary>
        /// SMTP端口号
        /// </summary>
        public int SmtpPort { get; set; }

        /// <summary>
        /// 是否SSL
        /// </summary>
        public bool EnableSsl { get; set; }

        /// <summary>
        /// 发信人邮箱
        /// </summary>
        public string FromEmailAddress { get; set; }

        /// <summary>
        /// 发信人密码
        /// </summary>
        public string FromEmailPassword { get; set; }
        #endregion
        #region 收件人信邮件内容

        /// <summary>
        /// 收件人Email
        /// </summary>
        public string ToEmailAddress { get; set; }

        /// <summary>
        /// 抄送,多个使用英文逗号分割
        /// </summary>
        public string CCEmailAddress { get; set; }

        /// <summary>
        /// 密送,多个使用英文逗号分割
        /// </summary>
        public string BCCEmailAddress { get; set; }

        /// <summary>
        /// 标题
        /// </summary>
        public string Subject { get; set; }

        /// <summary>
        /// 邮件内容
        /// </summary>
        public string Body { get; set; }

        /// <summary>
        /// 是否HTML邮件
        /// </summary>
        public bool IsBodyHtml { get; set; }

        /// <summary>
        /// 附件列表
        /// </summary>
        public List<Attachment> AttachmentList { get; set; }
        #endregion
        #endregion

        public EmailHelper()
        { 
            
        }

        /// <summary>
        /// 使用HTTPS发送的时候需要使用
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="certificate"></param>
        /// <param name="chain"></param>
        /// <param name="sslPolicyErrors"></param>
        /// <returns></returns>
        public static bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
        {
            return true;
        } 

        public void Send()
        {
            if (EnableSsl)
            {   //启用SSL
                ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
            }
                
            SmtpClient smtp = new SmtpClient();                 //实例化一个SmtpClient
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;   //将smtp的出站方式设为 Network
            smtp.EnableSsl = false;                             //smtp服务器是否启用SSL加密
            smtp.Host = this.SmtpHost;                          //指定 smtp 服务器地址
            smtp.Port = this.SmtpPort;                          //指定 smtp 服务器的端口,默认是25,如果采用默认端口,可省去
            smtp.UseDefaultCredentials = false;                  //如果你的SMTP服务器不需要身份认证,则使用下面的方式,不过,目前基本没有不需要认证的了
            smtp.EnableSsl = EnableSsl;
            smtp.Credentials = new NetworkCredential(this.FromEmailAddress, this.FromEmailPassword);    //如果需要认证,则用下面的方式

            MailMessage mm = new MailMessage(); //实例化一个邮件类
            mm.Priority = MailPriority.High; //邮件的优先级,分为 Low, Normal, High,通常用 Normal即可
            mm.From = new MailAddress(this.FromEmailAddress, "中一期货", Encoding.GetEncoding(936));
 
            //收件人
            if (!string.IsNullOrEmpty(this.ToEmailAddress))
                mm.To.Add(this.ToEmailAddress);
            //抄送人
            if (!string.IsNullOrEmpty(this.CCEmailAddress))
                mm.CC.Add(this.CCEmailAddress);
            //密送人
            if (!string.IsNullOrEmpty(this.BCCEmailAddress))
                mm.Bcc.Add(this.BCCEmailAddress);
 
            mm.Subject = this.Subject;                      //邮件标题
            mm.SubjectEncoding = Encoding.GetEncoding(936); //这里非常重要,如果你的邮件标题包含中文,这里一定要指定,否则对方收到的极有可能是乱码。
            mm.IsBodyHtml = this.IsBodyHtml;                //邮件正文是否是HTML格式
            mm.BodyEncoding = Encoding.GetEncoding(936);    //邮件正文的编码, 设置不正确, 接收者会收到乱码
            mm.Body = this.Body;                            //邮件正文
            //邮件附件
            if (this.AttachmentList != null && this.AttachmentList.Count > 0)
            {
                foreach (Attachment attachment in this.AttachmentList)
                {
                    mm.Attachments.Add(attachment);
                }
            }
            //发送邮件,如果不返回异常, 则大功告成了。
            smtp.Send(mm);
        }
    }

三、调用方法

1.处理附件:

            var attachs = new List<System.Net.Mail.Attachment>();
            attachList.ToList().ForEach(x =>
            {
                attachs.Add(new System.Net.Mail.Attachment(System.Web.HttpContext.Current.Request.MapPath(x), System.Net.Mime.MediaTypeNames.Application.Octet));
            });

2.实例化EmailHelper类并赋值:

            var email = new EmailHelper
            {
                SmtpHost = "smtp.office365.com",
                SmtpPort = 587,
                EnableSsl = true,

                FromEmailAddress = "yourname@example.com",
                FromEmailPassword = "your password",

                ToEmailAddress = "customer@example.com",
                Subject = "邮件标题",
                Body = "邮件内容,支持HTML",
                IsBodyHtml = true,
                AttachmentList = attachs
            };

3.发送邮件

email.Send();

四、结束

有问题欢迎留言。
以上。


添加新评论