Wysyłanie wiadomości e-mail w C# za pomocą FluentEmail
[[academy-video-youtube({'vid': 'qSeO9886nRM', 'start_time': '0', 'title': 'Sending Email in C# using FluentEmail', 'creator': 'Tim Corey', 'length': '30m 36s'})]]
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. Czy chcesz wysylac proste wiadomosci tekstowe, e-maile HTML, czy obslugiwac masowe e-maile, FluentEmail oferuje prosty sposob na implementacje funkcji wysylania e-maili przy uzyciu nowoczesnych metod i protokolow 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
Nastepnie, o 3:50, Tim uzywa konsoli menadzera pakietow, aby zainstalowac pakiet FluentEmail.Smtp, co umozliwia uzycie klienta SMTP do wysylania 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.SmtpInstall-Package FluentEmail.SmtpTim zapewnia, że dodajemy również zależność FluentEmail.Core, która jest niezbędna do działania biblioteki.
Konfiguracja klienta i serwera SMTP
O 6:10 Tim omawia konfigurowanie klienta SMTP przy uzyciu 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 podkresla, ze ten serwer SMTP localhost jest do testow lokalnych. W produkcji polaczysz sie z danymi serwera SMTP, takimi jak punkt koncowy SMTP Gmaila, mozliwie przy uzyciu hasla aplikacji dla bezpieczenstwa.
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 zauwaza, ze chociaz e-mail wyglada jakby pochodzi z tim@timco.com, to serwer SMTP nadal bedzie go uwierzytelniac na podstawie danych logowania (jak haslo aplikacji Gmaila).
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.RazorInstall-Package FluentEmail.RazorAktualizuje 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 wspiera rozne formaty, jak czysty tekst i HTML, w zaleznosci od zawartosci szablonu.
Obsługa wielu odbiorców i załączników
Chociaz nie jest to w pelni przedstawione w demie Tima, FluentEmail latwo wspiera wielu odbiorcow przez wywolania .To() i dodawanie obiektu zalacznika dla zalacznikow, podobnie jak obiekt MailMessage lub klasa MailMessage w starszych wersjach .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 wychwytuje kazda awarie SMTP lub problemy z siecia zwiazane z procesem wysylania e-maila, szczegolnie jesli pojawiaja sie problemy z protokolem SMTP.
Podsumowanie i ostatnie mysli
Około 27:56 Tim stwierdza, ze z FluentEmail wysylanie e-maili w C# staje sie proste — od wysylania prostych wiadomosci w stylu hello world po profesjonalne, dynamiczne e-maile HTML.
Podkresla takze, jak wazne jest utrzymywanie danych serwera SMTP i konfiguracji elastycznymi przy uzyciu pliku config jak appsettings.json, szczegolnie podczas przeliczania sie miedzy 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
Dzieki doskonalemu wideo Tima Coreya, jasne jest, ze nowoczesna funkcjonalnosc wysylania e-maili w C# ewoluowala poza podstawowa obsluge klasy SmtpClient i 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.

