在实际的项目开发中,我们会遇到许多需要通过程序发送邮件的场景,比如异常报警、消息、进度通知等等。一般情况下我们使用原生的SmtpClient类库居多,它能满足我们绝大多数场景。但是使用起来不够简洁,许多场景需要我们自行封装方法去实现,而且代码量非常可观。庆幸的是,我们有一款非常棒的组件,能满足我们绝大多数应用场景,而且使用简单功能强大,就是我们今天要说的FluentEmail,这也是我们实际在项目中正在使用的邮件发送组件。如果你们在.Net Core中有发送邮件的需求,也推荐去尝试一下。
FluentEmail
FluentEmail是一款在GitHub上开源免费的支持.Net和.Net Core邮件发送组件,目前已有1K多的Star,而且近两年随着.Net Core的日益成熟,它的Star增长趋势还是非常迅猛的。它在GitHub地址是https://github.com/lukencode/FluentEmail,它的功能非常强大而且非常实用,支持Razor的邮件模板和支持使用SendGrid,MailGun,SMTP发送邮件,而且使用也非常简单。
Nuget组件
FluentEmail功能强大,而且对不同场景的支持都有独立的Nuget包,这种低耦合的拆分不仅使得依赖非常清晰,而且避免引入不需要的代码,具体功能包含在以下的组件包中
普通邮件方式
接下来我们就演示一下如何使用FluentEmail发送邮件,由于我们实际业务中大多数都使用的SMTP的方式发送邮件,所以我们就以此为做演示,首先我们在项目中引入FluentEmail.Smtp包,目前最新版本为2.8.0
<PackageReference Include="FluentEmail.Smtp" Version="2.8.0" />
接下来我们就可以愉快的写代码了,它的编码使用方式非常简单而且非常简洁,主要通过链式编程的方式
//如果使用smtp服务发送邮件必须要设置smtp服务信息 SmtpClient smtp = new SmtpClient { //smtp服务器地址(我这里以126邮箱为例,可以依据具体你使用的邮箱设置) Host = "smtp.126.com", UseDefaultCredentials = true, DeliveryMethod = SmtpDeliveryMethod.Network, //这里输入你在发送smtp服务器的用户名和密码 Credentials = new NetworkCredential("邮箱用户名", "邮箱密码") }; //设置默认发送信息 Email.DefaultSender = new SmtpSender(smtp); var email = Email //发送人 .From("zhangsan@126.com") //收件人 .To("lisi@qq.com") //抄送人 .CC("admin@126.com") //邮件标题 .Subject("邮件标题") //邮件内容 .Body("邮件内容"); //依据发送结果判断是否发送成功 var result = email.Send(); //或使用异步的方式发送 //await email.SendAsync(); if (result.Successful) { //发送成功逻辑 } else { //发送失败可以通过result.ErrorMessages查看失败原因 }
如果你发送的内容中包含html格式的内容可以使用如下方式
var email = Email //发送人 .From("zhangsan@126.com") //收件人 .To("lisi@qq.com") //抄送人 .CC("admin@126.com") //邮件标题 .Subject("邮件标题") //只需要额外设置第二个参数为true即可 .Body("<h1 align=\"center\">.NET大法好</h1><p>是的,这一点毛病都没有</p>",true); //发送 var result = email.Send();
这个我们通过点击查看Body的方法声明即可得知第二个参数是用来表示内容是否为html格式,默认为false
IFluentEmail Body (string body, bool isHtml = false);
如果邮件的收件人为多个邮箱地址的话,可以采用To方法的另一个重载方法可以接受List<FluentEmail.Core.Models.Address>
var email = Email //发送人 .From("zhangsan@126.com") //邮件标题 .Subject("邮件标题") //邮件内容 .Body("<h1 align=\"center\">.NET大法好</h1><p>是的,一点毛病都没有</p>",true); //构建多个接收人邮箱 string toUserStr = "oldwang@126.com;xiaoming@163.com;xiaoli@qq.com"; List<FluentEmail.Core.Models.Address> toUsers = toUserStr.Split(";") .Select(i => new FluentEmail.Core.Models.Address { EmailAddress = i }).ToList(); //支持传入Address集合 email.To(toUsers) //抄送人集合 .CC(toUsers); //发送 var result = email.Send();
如果我们需要在发送的邮件中添加一个附件的话,可以使用Attache方法添加附件
var email = Email //发送人 .From("zhangsan@qq.com") //收件人 .To("lisi@126.com") //抄送人 .CC("admin@126.com") //邮件标题 .Subject("关于.Net Core怎么样") //邮件内容 .Body("<h1 align=\"center\">.NET Core</h1><p>.Net Core很优秀吗?是的,一点毛病都没有!!!</p>",true); //构建附件 var stream = new MemoryStream(); var sw = new StreamWriter(stream); sw.WriteLine("您好,这是文本里的内容"); sw.Flush(); stream.Seek(0, SeekOrigin.Begin); var attachment = new FluentEmail.Core.Models.Attachment { Data = stream, ContentType = "text/plain", Filename = "Hello.txt" }; //添加附件 email.Attach(attachment); var result = email.Send();
如果需要添加多个附件的话Attach方法支持传入Attachment集合