本文主要介绍.NET Core(ASP.NET Core)中,使用FluentEmail发送邮件方法,使用FluentEmail Razor模板以及发送邮件示例代码。

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(),您可以将电子邮件的正文设置为模板,而不是普通的字符串。这将与一个对象结合作为一个模型,并传递给已经设置好的IRendererRazor(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/