1、使用Nuget添加引用FluentEmail
1)使用Nuget界面管理器
相关文档:VS(Visual Studio)中Nuget的使用
2)使用Package Manager命令安装
PM> Install-Package FluentEmail.Core
PM> Install-Package FluentEmail.Razor
PM> Install-Package FluentEmail.Smtp
3)使用.NET CLI命令安装
dotnet add package FluentEmail.Core
dotnet add package FluentEmail.Razor
dotnet add package FluentEmail.Smtp
2、配置FluentEmail
public void ConfigureServices(IServiceCollection services)
{
services
.AddFluentEmail("defaultsender@test.test")//配置默认发送者
.AddRazorRenderer()//配置RazorLight renderer
.AddSmtpSender("localhost", 25);//配置发送smtp
}
3、发邮件代码
使用上面配置的IFluentEmail
并使用SmtpSender
发送。邮件将从"defaultsender@test"
发送。在启动时配置测试(可以使用email.SetFrom()
修改)
public async Task<IActionResult> SendEmail([FromServices]IFluentEmail email)
{
await email
.To("test@test.test")
.Subject("test email subject")
.Body("This is the email body")
.SendAsync();
return View();
}
在IFluentEmail上还有很多其他有用的方法,比如添加CC或BCC收件人、添加附件、设置优先级或设置回复address。
4、使用Razor模板Render email
发送基本的纯文本电子邮件是可以的,但大多数情况下,您需要混合一些丰富的数据。通过使用.usingtemplate <T>(string template, T model)
而不是.body()
,您可以将电子邮件的正文设置为模板,而不是普通的字符串。这将与一个对象结合作为一个模型,并传递给已经设置好的IRenderer
, Razor(FluentEmail.Razor)
来处理。
public async Task<IActionResult> SendEmail([FromServices]IFluentEmail email)
{
var model = new
{
Name = "test name"
};
var template = "hi @Model.Name this is a razor template @(5 + 5)!";
await email
.To("test@test.test")
.Subject("test email subject")
.UsingTemplate(template, model)
.SendAsync();
return View();
}
邮件的正文将呈现为“Hi test name this is a razor template 10!”
,Razor renderer将允许你编写任何有效的Razor代码。传递给renderer的模型可以是任何对象类型
FluentEmail有两个helper方法,可以使模板的使用更简洁。我个人喜欢嵌入式资源选项,因为它使跨项目共享模板变得很容易。
Render template从文件:
.UsingTemplateFromFile($"{Directory.GetCurrentDirectory()}/Mytemplate.cshtml", model)
Render template从嵌入式资源:
.UsingTemplateFromEmbedded("Example.Project.Namespace.template-name.cshtml",
model,
TypeFromYourEmbeddedAssembly.GetType().GetTypeInfo().Assembly)
注意.NET Core2.0:需要将以下代码添加到包含嵌入式razor视图的项目中。
<MvcRazorExcludeRefAssembliesFromPublish>false</MvcRazorExcludeRefAssembliesFromPublish>
5、同一方法中发送多封电子邮件
需要从同一个class 或 action 发送多个电子邮件,您将希望使用IFluentEmailFactory
,而不是重用IEmail实例。IFluentEmailFactory
有一个Create()
方法,它将为您提供一个要使用的新IFluentEmail
实例。
public async Task<IActionResult> SendMultiple([FromServices] IFluentEmailFactory emailFactory)
{
await emailFactory.Create()
.To("test1@test.test")
.Subject("test email subject")
.UsingTemplate("hi @Model.Name this is the first email @(5 + 5)!", new { Name = "test name" })
.SendAsync();
await emailFactory.Create()
.To("test1@test.test")
.Subject("test email subject")
.UsingTemplate("hi @Model.Name this is the second email @(5 + 5)!", new { Name = "test name 2" })
.SendAsync();
return View();
}
参考文档:
https://github.com/lukencode/FluentEmail
https://lukencode.com/2018/07/01/send-email-in-dotnet-core-with-fluent-email/