在 C# 使用 FluentEmail 發送電子郵件
在C#中發送事務性電子郵件是許多企業軟體解決方案中的常見需求。 正如Tim Corey在他的影片中所解釋的,"在C#中使用FluentEmail發送電子郵件",這個過程不必很困難。 無論您想發送簡單的文字訊息、HTML電子郵件,還是處理大量電子郵件,FluentEmail都提供了一種簡便的方法來使用現代方法和smtp協議實現電子郵件發送功能。
在這篇文章中,我們將依循Tim Corey的影片,完整學習如何在C#中使用FluentEmail發送電子郵件、設置SMTP伺服器、構建動態HTML電子郵件訊息,並有效地測試整個電子郵件發送過程。
FluentEmail介紹
Tim首先解釋了背景:在C#中發送電子郵件曾經依賴於舊有的工具如System.Net.Mail,但隨著.NET 5及以後版本,很多已被棄用。 這就是現代電子郵件程式庫FluentEmail的作用所在,無論是簡單訊息還是像HTML電子郵件和內嵌圖片這樣更複雜的通訊,都能填補這個空白。
Tim指出,目標是輕鬆地建立電子郵件,使用模板,甚至在不連接到生產伺服器的情況下測試它們。
設置控制台應用程式
在1:04時,Tim建立了一個名為EmailDemoApp的新控制台應用程式。他強調可以簡單地從static void Main(string[] args)或只是public static void Main開始,這樣您便不需要UI。 這個乾淨的起始點允許專注於電子郵件發送過程。

在創建應用程式後,Tim將專案設定為目標.NET 5,這是從傳統.NET Framework的一個現代升級,確保了與現代協議更好的相容性,適用於電子郵件用戶端。
通過套件管理器控制台安裝FluentEmail
接下來,在3:50,Tim使用套件管理器控制台安裝了FluentEmail.Smtp套件,使C#中的電子郵件發送使用smtp客戶端成為可能。 與此同時,Tim提到還有其他的整合,如MailGun和SendGrid,但SMTP是最通用的選擇,適用於大多數電子郵件用戶端和設置。

使用以下命令,您可以手動安裝它:
Install-Package FluentEmail.Smtp
Install-Package FluentEmail.Smtp
Tim確保我們也添加了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或Notepad開啟它,但對於現有的電子郵件訊息或大量測試來說,它不是最用戶友好的。

使用Papercut SMTP進行更簡便的測試
在17:03時,Tim從儲存到目錄切換到使用Papercut SMTP,一個輕量級的虛擬SMTP伺服器。
他修改了smtp客戶端設置為:
DeliveryMethod = SmtpDeliveryMethod.Network;
Port = 25;
DeliveryMethod = SmtpDeliveryMethod.Network;
Port = 25;
使用Papercut,每個測試電子郵件立即顯示在GUI中。 這使得檢查純文字和HTML正文內容變得更容易,並模擬現實中的電子郵件用戶端如何呈現不同的格式。

使用Razor模板構建HTML電子郵件
在19:12時,Tim註明靜態純文字對許多真實世界的案例來說並不夠。 為了更動態、豐富的HTML訊息,他安裝了FluentEmail.Razor包:
Install-Package FluentEmail.Razor
Install-Package FluentEmail.Razor
他更新了專案設置為:
<PreserveCompilationContext>true</PreserveCompilationContext>
<PreserveCompilationContext>true</PreserveCompilationContext>
以確保Razor模板能正常編譯。
建構和使用Razor電子郵件模板
使用字串生成器(var builder)和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連接,構建動態電郵內容,並在本地測試所有內容,再部署到生產環境。
