Wysyłanie wiadomości e-mail w C# za pomocą FluentEmail
Wysyłanie transakcyjnych e-maili w C# jest częstą potrzebą w wielu rozwiązaniach oprogramowania typu enterprise. Jednak jak wyjaśnia Tim Corey w swoim filmie "Sending Email in C# using FluentEmail", ten proces nie musi być trudny. Niezależnie od tego, czy chcesz wysyłać proste wiadomości tekstowe, e-maile HTML, czy obsługiwać masową korespondencję email, FluentEmail oferuje łatwy sposób implementacji funkcji wysyłania e-maili za pomocą nowoczesnych metod i protokołów smtp.
W tym artykułe przeprowadzimy Cię przez proces, zgodnie z filmem Tima Coreya, aby w pełni nauczyć się wysyłania e-maili w C# za pomocą FluentEmail, skonfigurowania serwera SMTP, budowania dynamicznych wiadomości email HTML oraz skutecznego testowania całego procesu wysyłki e-maili.
Wprowadzenie do FluentEmail
Tim rozpoczyna od wyjaśnienia, że wysyłanie e-maili w C# opierało się wcześniej na starszych narzędziach, takich jak System.Net.Mail, ale w .NET 5 i nowszych wersjach wiele z tego zostało zdeprecjonowane. To tutaj wkracza FluentEmail, nowoczesna biblioteka e-mail, aby wypełnić lukę zarówno dla prostych wiadomości, jak i bardziej zaawansowanej komunikacji, takiej jak e-maile HTML i obrazy osadzone.
Tim wskazuje, że celem jest łatwe tworzenie e-maili, używanie szablonów, a nawet testowanie ich bez łączenia się z serwerami produkcyjnymi.
Konfiguracja aplikacji konsolowej
O 1:04, Tim tworzy nową aplikację konsolową o nazwie EmailDemoApp. Podkreśla prostotę rozpoczęcia od static void Main(string[] args) lub po prostu public static void Main, gdy nie potrzebujesz interfejsu użytkownika. Czysty punkt startowy pozwala skupić się wyłącznie na procesie wysyłania e-maili.

Po utworzeniu aplikacji, Tim ustawia projekt, by celował w .NET 5, nowoczesną aktualizację z tradycyjnego .NET Framework, zapewniając lepszą kompatybilność z nowoczesnymi protokołami dla klientów e-mail.
Instalacja FluentEmail przez Package Manager Console
Następnie, o 3:50, Tim używa Package Manager Console, aby zainstalować pakiet FluentEmail.Smtp, co umożliwia użycie klienta smtp do wysyłania e-maili w C#. Obok niego, Tim wspomina, że dostępne są dodatkowe integracje jak MailGun i SendGrid, ale SMTP jest opcją najbardziej uniwersalną, działającą w większości klientów e-mail i konfiguracji.

Używając poniższego polecenia, możesz zainstalować je ręcznie:
Install-Package FluentEmail.Smtp
Install-Package FluentEmail.Smtp
Tim zapewnia, że dodajemy również zależność FluentEmail.Core, która jest niezbędna do działania biblioteki.
Konfiguracja klienta i serwera SMTP
Do 6:10, Tim omawia konfigurację klienta smtp przy użyciu nowej konfiguracji smtpclient:
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 podkreśla, że ten serwer smtp localhost jest przeznaczony do testowania lokalnego. W produkcji połączyłbyś się ze swoim prawdziwym serwerem smtp, takimi jak punkt końcowy SMTP Gmaila, używając możliwie hasła aplikacji dla bezpieczeństwa.
Zwraca uwagę, że wrażliwe ustawienia powinny być przeniesione do pliku konfiguracyjnego, takiego jak appsettings.json, dla większego bezpieczeństwa i elastyczności.
Wysyłanie prostej wiadomości email
O 11:59, Tim przechodzi do wysyłania prostej wiadomości za pomocą API emaili FluentEmail. Tłumaczy, że tworzony jest obiekt email za pomocą poniższego przykładu kodu:
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();
W ten sposób określasz treść string subject, string email oraz ciało wiadomości wyraźnie przy użyciu łańcucha metod. Zmienna message (email) przechowuje wynik, co pozwala na sprawdzanie błędów.
Tim podkreśla, że mimo że e-mail wydaje się pochodzić od tim@timco.com, serwer smtp nadal go poświadczy bazując na danych logowania (jak hasło aplikacji Gmail).
Wyświetlanie e-maila za pomocą lokalnego katalogu
Gdy wiadomość email zostanie wysłana, Tim pokazuje, jak wygląda jako plik .eml w lokalnym folderze. Chociaż można go otworzyć za pomocą Outlooka lub Notatnika, dla istniejących wiadomości e-mail lub testowania masowego, nie jest to najbardziej przyjazne dla użytkownika.

Użycie Papercut SMTP dla łatwiejszego testowania
O 17:03, Tim przełącza się z zapisywania do katalogu do używania Papercut SMTP, lekkiego fałszywego serwera SMTP.
Modyfikuje ustawienia klienta smtp na:
DeliveryMethod = SmtpDeliveryMethod.Network;
Port = 25;
DeliveryMethod = SmtpDeliveryMethod.Network;
Port = 25;
Z Papercut każdy testowy e-mail pojawia się natychmiast w GUI. To ułatwia sprawdzanie treści w formacie plain text i HTML oraz symuluje, jak prawdziwe klienci e-mail renderują różne formaty.

Tworzenie e-maila HTML za pomocą szablonów Razor
O 19:12, Tim zauważa, że statyczny plain text nie wystarcza w wielu przypadkach w świecie rzeczywistym. Do bardziej dynamicznych, bogatych wiadomości HTML, instaluje pakiet FluentEmail.Razor:
Install-Package FluentEmail.Razor
Install-Package FluentEmail.Razor
Aktualizuje ustawienia projektowe za pomocą:
<PreserveCompilationContext>true</PreserveCompilationContext>
<PreserveCompilationContext>true</PreserveCompilationContext>
aby zapewnić, że szablony Razor skompilują się poprawnie.
Tworzenie i użycie szablonu email Razor
Używając budowniczego stringów (var builder) i składni Razor, Tim tworzy dynamiczny szablon email:
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");
Następnie dołącza ten szablon do var request za pomocą poniższego kodu:
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();
Ta technika obsługuje różne formaty, takie jak plain text i HTML body, w zależności od treści szablonu.
Obsługa wielu odbiorców i załączników
Chociaż nie jest to w pełni szczegółowo opisane w demonstracji Tima, FluentEmail łatwo obsługuje wielu odbiorców za pomocą metod .To() oraz dodawanie obiektu załącznika dla załączników plików, podobnie jak działają obiekty mailmessage lub klasy mailmessage w starszym .NET.
Możesz tworzyć załączniki używając nowej ścieżki pliku string lub identyfikatora treści dla osadzonych obrazów.
Obsługa wyjątków w procesie wysyłania e-maili
Tim sugeruje, że należy łagodnie obsługiwać błędy. Na przykład:
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);
}
To przechwytuje wszelkie awarie związane z SMTP lub siecią w trakcie procesu wysyłania e-maili, szczególnie jeśli pojawią się problemy z protokołem smtp.
Podsumowanie i ostatnie mysli
Około 27:56, Tim konkluduje, że z FluentEmail wysyłanie e-maili w C# staje się proste — od prostych wiadomości w stylu hello world po profesjonalne, dynamiczne e-maile html.
Podkreśla również znaczenie elastycznego przechowywania szczegółów i konfiguracji serwera smtp za pomocą pliku konfiguracyjnego, jak appsettings.json, zwłaszcza przy przechodzeniu między lokalnym rozwojem a platformami chmurowymi, jak Azure Portal.
Czy dążysz do wysyłania pojedynczych maili, czy w masowych e-mailach, FluentEmail w połączeniu z Papercut SMTP oferuje nowoczesny, efektywny obieg pracy kompatybilny z wieloma językami programowania i ekosystemami.
Ostateczne przemyślenia
Dzięki doskonałemu filmowi Tima Coreya, jest jasne, że nowoczesna funkcjonalność wysyłania e-maili w C# ewoluowała poza podstawową klasą smtpclient i obsługą klasy mailmessage. Z pomocą FluentEmail, programiści mogą szybko tworzyć nowy projekt, konfigurować połączenie SMTP, budować dynamiczne ciało e-maila i testować wszystko lokalnie przed wdrożeniem do produkcji.
