内容简介:前段时间因为业务需要自动给客户发送支持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 };
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- SpringBoot系列(十四)集成邮件发送服务及邮件发送的几种方式
- Linux如何用脚本监控Oracle发送警告日志ORA-报错发送邮件
- Android 快速发送邮件
- Python 发送邮件
- Python邮件发送指南
- golang发送邮件
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Beginning Java Objects中文版从概念到代码
巴克 / 万波 / 人民邮电出版社 / 2007-1 / 78.00元
《Beginning Java Objects中文版从概念到代码(第2版)》是关于软件对象和Java的,但并不是纯粹地介绍Java语言,而是强调如何从对象模型转换到功能完整的Java应用程序。书中讲述了对象基础、对象建模和模型的实现。《Beginning Java Objects中文版从概念到代码(第2版)》除了用学生注册系统(SRS)示例贯穿全书之外,还在附录中给出三个附加的案例,这些案例是每章......一起来看看 《Beginning Java Objects中文版从概念到代码》 这本书的介绍吧!