如何在 Asp.Net Core 中發(fā)送 Email
在項目開發(fā)中常常會需要做發(fā)送 Email 的功能,在 ASP.NET Core 中你可以用 MailKit 來實現(xiàn) Email 的發(fā)送,MailKit 是一個開源的客戶端庫,可用在 Windows,Linux 或者 Mac 上,本篇文章就來討論在 ASP.NET Core 中去實現(xiàn)。
安裝 MailKit
要想使用 MailKit,你可以使用 Visual Studio 2019 中的 NuGet package manager 可視化界面進行安裝,或者通過 NuGet package manager console 命令行輸入如下命令:
Install-Package?NETCore.MailKit
安裝完成之后,在代碼中引入以下命令空間即可。
using?MailKit.Net.Smtp;
using?MimeKit;
配置 Email 的基礎(chǔ)信息
下面的代碼片段展示了在 appsettings.json 文件中配置 email 的詳細信息。
"NotificationMetadata":?{
????"Sender":?"[email protected]",
????"SmtpServer":?"smtp.gmail.com",
????"Reciever":?"[email protected]",
????"Port":?465,
????"Username":?"[email protected]",
????"Password":?"specify?your?password?here"
??}
為了能夠?qū)崿F(xiàn) configuration 中的NotificationMetadata節(jié)點映射,我定義了一個 NotificationMetadata 類,代碼如下:
????public?class?NotificationMetadata
????{
????????public?string?Sender?{?get;?set;?}
????????public?string?Reciever?{?get;?set;?}
????????public?string?SmtpServer?{?get;?set;?}
????????public?int?Port?{?get;?set;?}
????????public?string?UserName?{?get;?set;?}
????????public?string?Password?{?get;?set;?}
????}
接下來在 Startup.ConfigureServices 方法中將 NotificationMetadata 節(jié)點映射到 NotificationMetadata 類。
public?void?ConfigureServices(IServiceCollection?services)
{
?????var?notificationMetadata?=
?????Configuration.GetSection("NotificationMetadata").
?????Get();
?????services.AddSingleton(notificationMetadata);
?????services.AddControllers();
}
生成 EmailMessage 消息類
使用如下代碼創(chuàng)建一個 EmailMessage 類。
????public?class?EmailMessage
????{
????????public?MailboxAddress?Sender?{?get;?set;?}
????????public?MailboxAddress?Reciever?{?get;?set;?}
????????public?string?Subject?{?get;?set;?}
????????public?string?Content?{?get;?set;?}
????}
生成 MimeMessage 類
下面的代碼展示了如何從自定義的 EmailMessage 類中構(gòu)造出一個 MimeMessage。
private?MimeMessage?CreateMimeMessageFromEmailMessage(EmailMessage?message)
{
?????var?mimeMessage?=?new?MimeMessage();
?????mimeMessage.From.Add(message.Sender);
?????mimeMessage.To.Add(message.Reciever);
?????mimeMessage.Subject?=?message.Subject;
?????mimeMessage.Body?=?new?TextPart(MimeKit.Text.TextFormat.Text)
?????{?Text?=?message.Content?};
?????return?mimeMessage;
}
用 MailKit 同步發(fā)送 Email
為了最終能夠?qū)崿F(xiàn) email 發(fā)送,需要使用 MailKit.Net.Smtp 命名空間下的 SmtpClient 類,下面的代碼展示了具體實現(xiàn)步驟。
using?(SmtpClient?smtpClient?=?new?SmtpClient())
{
??smtpClient.Connect(_notificationMetadata.SmtpServer,
??_notificationMetadata.Port,?true);
??smtpClient.Authenticate(_notificationMetadata.UserName,
??_notificationMetadata.Password);
??smtpClient.Send(mimeMessage);
??smtpClient.Disconnect(true);
}
為了方便起見,我就把完整的發(fā)送 Email 代碼放在 ?DefaultController.Get 方法下。
public?string?Get()
{
????EmailMessage?message?=?new?EmailMessage();
????message.Sender?=?new?MailboxAddress("Self",?_notificationMetadata.Sender);
????message.Reciever?=?new?MailboxAddress("Self",?_notificationMetadata.Reciever);
????message.Subject?=?"Welcome";
????message.Content?=?"Hello?World!";
????var?mimeMessage?=?CreateEmailMessage(message);
????using?(SmtpClient?smtpClient?=?new?SmtpClient())
????{
????????smtpClient.Connect(_notificationMetadata.SmtpServer,
????????_notificationMetadata.Port,?true);
????????smtpClient.Authenticate(_notificationMetadata.UserName,
????????_notificationMetadata.Password);
????????smtpClient.Send(mimeMessage);
????????smtpClient.Disconnect(true);
????}
????return?"Email?sent?successfully";
}
用 MailKit 異步發(fā)送 Email
上面我們用同步的方式發(fā)送 Email,這一節(jié)來看看如何使用異步的方式發(fā)送 Email。
using?(SmtpClient?smtpClient?=?new?SmtpClient())
?{
??????await?smtpClient.ConnectAsync(_notificationMetadata.SmtpServer,
??????_notificationMetadata.Port,?true);
??????await?smtpClient.AuthenticateAsync(_notificationMetadata.UserName,
??????_notificationMetadata.Password);
??????await?smtpClient.SendAsync(mimeMessage);
??????await?smtpClient.DisconnectAsync(true);
?}
最后值得注意的是,MailKit 除了簡單的字符串,還支持模板的方式甚至可以帶上 附件 發(fā)送,更多的 MailKit 特性我會在后面的文章中和大家去討論。
譯文鏈接:https://www.infoworld.com/article/3534690/how-to-send-emails-in-aspnet-core.html
