使用 FluentEmail 用 C# 发送电子邮件
用 C# 发送事务性电子邮件是许多企业软件解决方案的共同需求。 不过,正如 Tim Corey 在他的视频"Sending Email in C# using FluentEmail"中所解释的那样,这个过程并不困难。 无论您是要发送简单的文本信息、HTML 电子邮件,还是要处理批量电子邮件,FluentEmail 都能提供一种使用现代方法和 smtp 协议实现电子邮件发送功能的简便方法。
在本文中,我们将按照 Tim Corey 的视频进行讲解,全面学习如何使用 C# 使用 FluentEmail 发送电子邮件、设置 SMTP 服务器、构建动态 HTML 电子邮件信息,并有效测试整个电子邮件发送过程。
FluentEmail 简介
蒂姆首先解释了背景情况:用 C# 发送电子邮件曾经依赖于 System.Net.Mail 等较老的工具,但随着 .NET 5 及更高版本的推出,其中大部分工具已被弃用。 这就是现代电子邮件库 FluentEmail 的用武之地,它既能处理简单的邮件,也能处理 HTML 电子邮件和内嵌图片等更复杂的通信。
Tim 指出,我们的目标是在不连接生产服务器的情况下轻松创建电子邮件、使用模板甚至测试它们。
设置控制台应用程序
1:04 时,Tim 创建了一个名为 EmailDemoApp 的新控制台应用程序。他强调了使用 static void Main(string[] args) 或在不需要用户界面时使用 public static void Main 的简便性。 简洁的起点可以让我们只关注电子邮件的发送过程。

创建应用程序后,Tim 将项目设置为以 .NET 5 为目标,这是传统 .NET Framework 的现代升级版,可确保更好地兼容电子邮件客户端的现代协议。
通过软件包管理器控制台安装 FluentEmail
接下来,在 3:50 处,Tim 使用软件包管理器控制台安装了软件包 FluentEmail.Smtp,从而可以使用 smtp 客户端在 C# 中发送电子邮件。 此外,Tim 还提到了 MailGun 和 SendGrid 等其他集成,但 SMTP 是最通用的选择,可以在大多数电子邮件客户端和设置中使用。

您可以使用以下命令手动安装:
Install-Package FluentEmail.SmtpInstall-Package FluentEmail.SmtpTim 确保我们也添加了 FluentEmail.Core 的依赖关系,这对于库的运行是必不可少的。
配置 SMTP 客户端和服务器
到 6:10 时,Tim 将讨论如何使用新的 smtpclient 配置来设置 smtp 客户端:
var sender = new SmtpSender(() => new SmtpClient("localhost")
{
EnableSsl = false,
DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory,
PickupDirectoryLocation = @"C:\Demos"
});var sender = new SmtpSender(() => new SmtpClient("localhost")
{
EnableSsl = false,
DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory,
PickupDirectoryLocation = @"C:\Demos"
});Tim 强调,该 smtp 服务器 localhost 用于本地测试。 在生产过程中,您将连接到真正的 smtp 服务器详细信息,如 Gmail 的 SMTP 端点,为安全起见,可能会使用应用程序密码。
他强调,敏感设置应移至类似 appsettings.json 这样的配置文件中,以提高安全性和灵活性。
发送简单的电子邮件
11:59 时,Tim 开始使用 FluentEmail 的电子邮件 API 发送一条简单的信息。 他通过以下代码示例解释了如何创建 var 电子邮件对象:
var email = await Email
.From("tim@timco.com")
.To("test@test.com", "Sue")
.Subject("Thanks")
.Body("Thanks for buying our product.")
.SendAsync();var email = await Email
.From("tim@timco.com")
.To("test@test.com", "Sue")
.Subject("Thanks")
.Body("Thanks for buying our product.")
.SendAsync();这样,您就可以使用方法链明确指定字符串主题、字符串电子邮件和邮件正文。 var 消息(电子邮件)保存结果,以便进行错误检查。
Tim 指出,虽然电子邮件看似来自 tim@timco.com,但 smtp 服务器仍会根据登录凭证(如 Gmail 应用程序密码)对其进行验证。
使用本地目录查看电子邮件
邮件发送完毕后,Tim 将展示邮件如何以 .eml 文件的形式出现在本地文件夹中。 虽然您可以用 Outlook 或记事本打开它,但对于现有的电子邮件信息或批量测试,它并不是最方便用户使用的。

使用剪纸 SMTP 简化测试
17:03 时,Tim 从保存到目录切换到使用轻量级假冒 SMTP 服务器 Papercut SMTP。
他修改了 smtp 客户端设置:
DeliveryMethod = SmtpDeliveryMethod.Network;
Port = 25;DeliveryMethod = SmtpDeliveryMethod.Network;
Port = 25;有了 Papercut,每封测试邮件都会立即显示在图形用户界面上。 这使得检查纯文本和 HTML 正文内容变得更加容易,并模拟了真实的电子邮件客户端如何呈现不同的格式。

使用 Razor 模板创建 HTML 电子邮件
在 19:12 分,Tim 指出静态的纯文本不足以应对现实世界中的许多情况。 为了获得更动态、更丰富的 HTML 邮件,他安装了 FluentEmail.Razor 软件包:
Install-Package FluentEmail.RazorInstall-Package FluentEmail.Razor他通过以下方式更新项目设置:
<PreserveCompilationContext>true</PreserveCompilationContext><PreserveCompilationContext>true</PreserveCompilationContext>确保 Razor 模板编译正确。
创建和使用 Razor 电子邮件模板
使用字符串生成器(var 生成器)和 Razor 语法,Tim 创建了一个动态电子邮件模板:
var builder = new StringBuilder();
builder.AppendLine("Dear @Model.FirstName,");
builder.AppendLine("<p>Thanks for purchasing @Model.ProductName.</p>");
builder.AppendLine("The TimCo Team");var builder = new StringBuilder();
builder.AppendLine("Dear @Model.FirstName,");
builder.AppendLine("<p>Thanks for purchasing @Model.ProductName.</p>");
builder.AppendLine("The TimCo Team");然后,他使用以下代码将此模板附加到 var 请求中:
await Email
.UsingTemplate(builder.ToString(), new { FirstName = "Tim", ProductName = "Bacon Wrapped Bacon" })
.SendAsync();await Email
.UsingTemplate(builder.ToString(), new { FirstName = "Tim", ProductName = "Bacon Wrapped Bacon" })
.SendAsync();该技术根据模板内容支持纯文本和 html 正文等不同格式。
处理多个收件人和附件
虽然 Tim 的演示中没有详细介绍,但 FluentEmail 可以通过 .To() 调用轻松支持多个收件人,并为文件附件添加附件对象,类似于旧版 .NET 中 mailmessage 对象或 mailmessage 类的工作方式。
您可以使用新字符串文件路径或内嵌图片的内容 ID 创建附件。
电子邮件发送过程中的异常处理
Tim 提示您应优雅地处理错误。 例如:
try
{
var result = await Email.SendAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}try
{
var result = await Email.SendAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}这将捕捉电子邮件发送过程中任何 SMTP 或网络相关故障,尤其是出现 smtp 协议问题时。
摘要和最终想法
大约 27:56 时,Tim 总结说,有了 FluentEmail,用 C# 发送电子邮件变得简单明了--从发送 hello world 风格的简单消息到专业的动态 html 电子邮件。
他还强调了使用 appsettings.json 等配置文件保持 smtp 服务器细节和配置灵活性的重要性,尤其是在本地开发和 Azure Portal 等云平台之间移动时。
无论您是要单独发送邮件还是批量发送邮件,FluentEmail 与 Papercut SMTP 的结合都能提供一个与多种编程语言和生态系统兼容的现代、高效的工作流程。
最终想法
多亏了 Tim Corey 出色的 视频,我们可以清楚地看到 C# 中的现代电子邮件发送功能已经超越了基本的 smtpclient 类和 mailmessage 类处理。 在 FluentEmail 的帮助下,开发人员可以快速创建新项目、配置 SMTP 连接、构建动态电子邮件正文,并在部署到生产环境之前在本地测试一切。

