.net下发送Email的Helper类

栏目: ASP.NET · 发布时间: 5年前

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

一、适用场景

前段时间因为业务需要自动给客户发送支持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
            };

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Beginning Java Objects中文版从概念到代码

Beginning Java Objects中文版从概念到代码

巴克 / 万波 / 人民邮电出版社 / 2007-1 / 78.00元

《Beginning Java Objects中文版从概念到代码(第2版)》是关于软件对象和Java的,但并不是纯粹地介绍Java语言,而是强调如何从对象模型转换到功能完整的Java应用程序。书中讲述了对象基础、对象建模和模型的实现。《Beginning Java Objects中文版从概念到代码(第2版)》除了用学生注册系统(SRS)示例贯穿全书之外,还在附录中给出三个附加的案例,这些案例是每章......一起来看看 《Beginning Java Objects中文版从概念到代码》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

MD5 加密
MD5 加密

MD5 加密工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具