Popular blog tags

ASP.NET Core 中用MailKit 和 FluentEmail 发送邮件

Published

前言

 

我们知道目前 .NET Core 还不支持 SMTP 协议,当我么在使用到发送邮件功能的时候,需要借助于一些第三方组件来达到目的,今天给大家介绍两款开源的邮件发送组件,它们分别是 MailKitFluentEmail , 下面我对它们分别进行介绍。

MailKit

在 ASP.NET Core 中,可以使用 MailKit 来发送邮件,它支持跨平台,并且支持 IMAP, POP3, SMTP 等协议。

你可以使用下面的方式安装:

Install-Package MailKit

下面是一个简单的发送邮件的例子:


var message = new MimeMessage ();
message.From.Add (new MailboxAddress ("Joey Tribbiani", ""));
message.To.Add (new MailboxAddress ("Mrs. Chanandler Bong", ""));

message.Subject = "星期天去哪里玩?";

message.Body = new TextPart ("plain") { Text = "我想去故宫玩,如何" };

using (var client = new SmtpClient ()) {
	// For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS)
	client.ServerCertificateValidationCallback = (s,c,h,e) => true;

	client.Connect ("smtp.friends.com", 587, false);

	// Note: since we don't have an OAuth2 token, disable
	// the XOAUTH2 authentication mechanism.
	client.AuthenticationMechanisms.Remove ("XOAUTH2");

	// Note: only needed if the SMTP server requires authentication
	client.Authenticate ("joey", "password");

	client.Send (message);
	client.Disconnect (true);
}

如果你要发送的 Body 内容是 HTML 的话,你可以使用下面这种:


var bodyBuilder = new BodyBuilder();
bodyBuilder.HtmlBody = @"<b>This is bold and this is <i>italic</i></b>";
message.Body = bodyBuilder.ToMessageBody();

Fluent Email

FluentEmail - All in one email sender for .NET and .NET Core

The easiest way to send email from .NET and .NET Core. Use Razor for email templates and send using SendGrid, MailGun, SMTP and more.

FluentEmail on Github:https://github.com/lukencode/FluentEmail  c# 
Offical blog:https://lukelowrey.com/dotnet-email-guide-2021/

Fluent Email 这个也是一个开源项目,利用它,你可以使用 Razor 模板来发送邮件,并且可以集成一些第三方的邮件发送程序比如 Mailgun等。

OS:Windows 10

.Net 6.x

step 1:使用如下命令来安装

Install-Package FluentEmail.Core
or
dotnet add package FluentEmail.Core

output

<Project Sdk="Microsoft.NET.Sdk.Worker">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
    <UserSecretsId>dotnet-OutIpService.WorkerService-68297F0A-1B90-49D2-9A0E-406827E6F108</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
   + <PackageReference Include="FluentEmail.Core" Version="3.0.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
  </ItemGroup>
</Project>

Step 2:你可以使用最基本的方式来发送邮件,很简单如下:

Basic Usage

var email = await Email
    .From("")
    .To("", "Luke")
    .Subject("Hi Luke!")
    .Body("Fluent email looks great!")
    .SendAsync();

或者,你可以使用 Razor 模板来发送:

//注意: .NET 4.6 才支持
Email.DefaultSender = new SmtpSender();

// Using Razor templating package
Email.DefaultRenderer = new RazorRenderer();

var template = "Dear @Model.Name, You are totally @Model.Compliment.";

var email = Email
    .From("")
    .To("")
    .Subject("woo nuget")
    .UsingTemplate(template, new { Name = "Luke", Compliment = "Awesome" });

Email.DefaultRenderer 是告诉FulentEmail 使用哪个渲染器(你也可以自己实现一个自己的),然后提供了一个 template 模板,内容为 Razor 语法的模板字符串,然后使用 UsingTemplate 来进行渲染呈现。

磁盘上的 cshtml 模板

加入你的邮件 Razor 模板文件比较大,用字符串来表示的话不太优雅,那么你可以把模板文件放到磁盘上,然后使用如下方式来加载:


//注意: .NET 4.6 才支持
Email.DefaultSender = new SmtpSender();

Email.DefaultRenderer = new RazorRenderer();

var email = Email
    .From("")
    .To("", "bob")
    .Subject("星期天去哪里玩?")
    .UsingTemplateFromFile($"{Directory.GetCurrentDirectory}/EmailTemplage.cshtml", new {Name ="Luke"})
    

使用 Mailgun 发送邮件

可能有一些人对 Mailgun 还不太清楚,Mailgun 是国外的一个邮件服务公司,比如著名的 Github 的邮件服务就托管在它的上面,免费的 Maingun 账户每个月可以发送 10000 封邮件,对于很多中小网站足够用了。

当使用 Mailgun 来发送邮件的时候,你首先需要去注册一个账号,然后可以利用 Mailgun 提供的 Rest API 来管理发送或者接收的邮件。使用 FluentEmail 集成的 Mailgun只需要添加如下包:

Install-Package FluentEmail.Mailgun

注册完 Mailgun 之后会给你分配一个 API Key 和一个二级域名,在程序种,你需要如下配置:


// 同时支持 .NET Core 和 .NET Framework
var sender = new MailgunSender(
    "sandboxcf5f41bbf2f84f15a386c60e253b5fe8.mailgun.org", // Mailgun 二级域名
    "key-8d32c046d7f14ada8d5ba8253e3e30df" // Mailgun API Key
);

Email.DefaultSender = sender;

var email = Email
    .From("")
    .To("", "bob")
    .Subject("星期天去哪里玩?")
    .Body("我想去故宫玩,如何?");

await email.SendAsync();


总结

通过上述示例我们可以看出 MailKit 和 FluentEmail 各有优缺点。MailKit 的优点是支持的协议比较多,而且是跨平台的,但是缺点是没有提供对 Razor的支持,并且如果使用 Mailgun 的话需要自己进行集成。 那么 FlentEmail 的优点是提供了 Razor 模板的支持并且封装了 Mailgun, 缺点是 SMTP 协议还没有提供对 .NET Core 的支持。

综上所述,如果你使用 Mailgun 来发送邮件的话,那么 FluentEmail 是你应该选择的,如果你想使用 SMTP 协议链接到自己的邮件服务器来发送邮件的话,那么你应该用 MailKit。

 

Other Senders


Other people in the open source community have built and maintain senders for different email providers.

Microsoft Graph API Sender - Microsoft Graph API Sender - https://www.nuget.org/packages/FluentEmail.Graph/
Postmark Sender - https://www.nuget.org/packages/FluentEmail.Postmark/
MailJet Sender - https://www.nuget.org/packages/FluentEmail.Mailjet/
MailTrap Sender - https://www.nuget.org/packages/FluentEmail.Mailtrap/