Earn More by Sharing What You Love
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Tim Corey
1h 11m 27s
Witamy w kompleksowym spojrzeniu na wysyłanie e-maili w aplikacji C# Windows Forms, korzystając z wglądów Tima Corey'ego "C# App Start To Finish – Lekcja 26." W tej lekcji, Tim pokazuje, jak budować funkcjonalność wysyłania e-maili do użytkowników, szczególnie w kontekście aplikacji śledzenia turniejów.
E-maile transakcyjne – zautomatyzowane, spersonalizowane wiadomości wywoływane przez działania użytkownika – są niezbędne dla nowoczesnych aplikacji internetowych. Aplikacje internetowe w C# często opierają się na API e-maili transakcyjnych, takich jak Mailgun i SendGrid, dla niezawodnego i skalowalnego dostarczania e-mailów gotowych do produkcji.
Ten artykuł poprowadzi Cię przez proces, który Tim demonstruje, w tym decyzję o umiejscowieniu kodu e-mail, tworzeniu metod pomocniczych, budowie dynamicznych e-maili i ich wysyłaniu przy użyciu wbudowanych bibliotek C#. Visual Studio jest podstawowym środowiskiem IDE do rozwijania i testowania funkcjonalności e-mail w aplikacjach C#.
Platformy dostarczania e-maili takie jak Mailtrap mogą być używane do monitorowania dostarczalności i testowania wysyłania e-maili w trakcie rozwoju.
Tim zaczyna od przypomnienia nam o kluczowym wymaganiu: tylko jedna runda turnieju może być rozegrana na raz. Oznacza to, że po zakończeniu rundy, zespoły muszą być powiadomione o swoim następnym meczu. Te powiadomienia via e-mail są rodzajem e-maili transakcyjnych, typowo wysyłanych automatycznie w odpowiedzi na działania użytkownika w aplikacjach internetowych. E-mail to praktyczne rozwiązanie, aby zapewnić uczestnikom natychmiastowe poinformowanie, i Tim przeprowadza nas przez budowę tej funkcjonalności krok po kroku.
Użycie dedykowanej usługi e-mail, jak Amazon SES, może pomóc w zapewnieniu niezawodnej i skalowalnej dostarczalności tych e-maili transakcyjnych.
Tim zaczyna od poruszenia istotnego pytania: Gdzie powinna trafić logika e-mail? Wyjaśnia, że powinna być umieszczona tam, gdzie aplikacja już wykonuje kluczową logikę turniejową. W tym przypadku, najlepsze miejsce to metoda UpdateTournamentResults.
Dlaczego tutaj? Ponieważ ta metoda obsługuje:
Określanie zwycięzców pojedynków
Przesuwanie zespołów do następnej rundy
Aktualizowanie bazy danych lub pamięci plikowej
Umieszczając logikę e-mail tutaj, wysyłamy e-maile tylko po zakończeniu rundy, unikając niepotrzebnego spamu do użytkowników.
Tim wprowadza strategię śledzenia aktualnej rundy przed i po aktualizacji wyników:
Jeśli numer rundy się zmienia, wiemy, że rozpoczęła się nowa runda.
To wywołuje powiadomienia e-mail o konkurujących meczach.
Aby określić, czy runda się zmieniła, Tim tworzy metodę rozszerzenia o nazwie CheckCurrentRound. Ta metoda przechodzi przez wszystkie rundy w modelu turnieju i sprawdza, czy każde pojedynki w rundzie mają zwycięzcę.
Jeśli wszystkie pojedynki są kompletne, inkrementuje zmienną wyjściową.
Jeśli runda jest niekompletna, zaprzestaje sprawdzania kolejnych rund.
Ta metoda zwraca aktualny numer rundy po ocenieniu stanu turnieju.
Tim podkreśla, że rozpoczęcie wyjścia od 1 obsługuje przypadki, gdy jeszcze żadne rundy nie są kompletne. Używając tej metody, aplikacja może dynamicznie wykryć, kiedy zaczyna się nowa runda i wywołuje e-maile.
Tim nawołuje do stworzenia dedykowanej klasy EmailLogic. Takie podejście:
Utrzymuje kod związany z e-mailem oddzielony od logiki turniejowej
Czyni go wielokrotnego użytku w aplikacji
Pomaga w przyszłych rozbudowach, takich jak wysyłanie przypomnień o płatnościach czy podsumowań turniejowych
Użycie dedykowanej biblioteki klienta e-mail, takiej jak MailKit, jest zalecane dla nowoczesnych aplikacji C#, ponieważ zapewnia solidne funkcje i lepsze wsparcie w porównaniu do przestarzałej klasy SmtpClient.
Ustawia publiczną statyczną metodę o nazwie SendEmail z parametrami:
From (nadawca e-mail)
To (odbiorcy e-mail)
Temat
Treść
Klasa BodyBuilder z MailKit może być używana do konstrukcji e-maili HTML i efektywnego dodawania załączników, co ułatwia wysyłanie e-maili z plikami, takimi jak PDFy.
Tim sugeruje, aby w pierwszej wersji utrzymać to proste, a później dodać CC i BCC, jeśli zajdzie potrzeba.
Po ustaleniu aktualnej rundy, Tim wyciąga listę pojedynków dla tej rundy korzystając z LINQ. Każdy pojedynek zawiera wpisy dla dwóch konkurujących zespołów.
Dla każdego pojedynku, wykonuje pętlę przez:
Każdy zespół
Każdego członka zespołu
Zapełnia to, że każda osoba otrzymuje e-mail o swoim nadchodzącym pojedynku. Przy wysyłce e-maili do wielu odbiorców można użyć klasy InternetAddressList i metody AddRange, aby efektywnie dodać wszystkie adresy e-mail odbiorców na raz. Ważne jest również, aby zweryfikować każdy adres e-mail odbiorcy, aby zapewnić pomyślną dostawę.
Tim podkreśla znaczenie zgromadzenia wszystkich potrzebnych informacji, takich jak:
Imię i nazwisko uczestnika oraz e-mail
Nazwa ich zespołu
Nazwa zespołu przeciwnika
Tim koncentruje się następnie na budowie tematu i treści e-maila dynamicznie:
Temat: Prosty i bezpośredni, np. "Masz nowy pojedynek z Team Rolling Thunder." Temat jest zwykle ustawiony przy użyciu zmiennej string subject w kodzie, która jest następnie przypisana do wiadomości e-mail.
Treść: Tim używa StringBuilder, aby efektywnie łączyć wiele linii tekstu. Wyjaśnia, że wielokrotne dodawanie stringów w C# jest nieefektywne, ponieważ każde dodanie tworzy nowe przydziały pamięci.
Podczas generowania zawartości e-maila, Tim rozważa, czy wysłać e-mail w postaci zwykłego tekstu, czy jako e-mail HTML. E-maile zwykłego tekstu są proste, kompatybilne z wszystkimi klientami e-mail i często używane do wewnętrznych powiadomień czy wiadomości transakcyjnych. E-maile HTML z drugiej strony pozwalają na bogatsze formatowanie. Wysyłka zarówno HTML, jak i wersji zwykłego tekstu może poprawić dostarczalność i zapewnić kompatybilność z różnymi dostawcami usług e-mail. Możesz wysyłać e-maile HTML w C# ustawiając właściwość IsBodyHtml klasy MailMessage na true, lub używając klasę MailKit i modyfikując treść wiadomości, aby zawierała HTML.
Używając StringBuilder, aplikacja może:
Obsługiwać wiele linii dla osobistej wiadomości
Zawierać szczegóły takie jak zespół przeciwnika i informacje o rundzie
Unikać problemów z wydajnością nawet przy wysyłaniu setek e-maili
Tim również obsługuje specjalne przypadki, jak weekend pauzy, w których zespół nie ma przeciwnika.
Przed wysłaniem Tim sprawdza, czy uczestnik ma poprawny adres e-mail. Zauważa:
Nawet prosta kontrola pustego stringa zapobiega błędom
Kompletna walidacja (jak regex) jest możliwa, ale może być kosztowna dla dużych zestawów danych
W większości aplikacji sprawdzenie obecności e-maila jest wystarczające
Ten krok zapewnia, że tylko uczestnicy, którzy podali e-maile, otrzymają powiadomienia.
Tim wyjaśnia, że e-mail nadawcy powinien być przechowywany w App.config dla elastyczności. Dodaje:
senderEmail dla faktycznego adresu e-mail
senderDisplayName dla nazwy nadawcy
Wiele usług e-mail, jak Amazon SES, wymaga weryfikacji domeny, aby zapewnić właściwą dostarczalność i unikać filtrów spamu. Ten proces obejmuje dodanie i zweryfikowanie Twojej domeny przed możliwością niezawodnego wysyłania e-maili przez ich API.
Później pomocnik GlobalConfig pobiera te wartości. Ta abstrakcja pozwala na zmiany informacji o nadawcy bez modyfikowania kodu logiki e-mail.
Aby wysyłać e-maile, Tim używa przestrzeni nazw System.Net.Mail, która jest wbudowana w C#. Kroki obejmują:
Tworzenie nowego MailAddress dla nadawcy, w tym nazwę wyświetlaną. Konfigurując nowy adres e-mail, upewnij się, że ustawienia konta i uwierzytelnienie są prawidłowe, aby umożliwić programowe wysyłanie e-maili.
Utwórz obiekt MailMessage
Dodaj adresy e-mail odbiorców
Ustaw temat i treść
Klasa MailMessage pozwala na dodawanie załączników za pomocą właściwości Attachments. Możesz wysyłać e-maile HTML w C# ustawiając właściwość IsBodyHtml klasy MailMessage na wartość true.
W końcu Tim konfiguruje klienta SMTP w celu wysłania e-maila:
Skonfiguruj hosta, port, dane uwierzytelniające i włącz SSL, jeśli to konieczne. Chociaż można używać własnego serwera SMTP, korzystanie z usługi e-mail w chmurze, takiej jak Amazon Simple Email Service (SES), jest często bardziej niezawodne i skalowalne.
Uruchom Send(mail) w celu przesłania wiadomości
Obsługuje wysyłanie wiadomości e-mail za pośrednictwem standardowych serwerów SMTP, takich jak Gmail, Outlook lub serwer niestandardowy, lub za pośrednictwem usługi e-mail, takiej jak Amazon SES, Mailgun czy Mailtrap.
Amazon SES (Simple Email Service) to opłacalna i skalowalna usługa e-mail oferowana przez AWS do szybkiego wysyłania e-maili transakcyjnych. Aby zintegrować Amazon SES z aplikacją C#, musisz zainstalować pakiet AWS SES i być może użyć tokenu uwierzytelniającego do bezpiecznego dostępu. Bezpieczny dostęp do aplikacji jest ważny przy konfigurowaniu ustawień SMTP, zwłaszcza gdy korzystasz z usług takich jak Gmail lub Office365, aby zapewnić odpowiednie uwierzytelnienie i bezpieczeństwo.
Zauważa, że serwery e-mail często nakładają ograniczenia na adres "Od", a testowanie za pomocą serwera edukacyjnego lub piaskownicy jest zalecane.
Aby podsumować proces Tima:
Wykryj bieżącą rundę turnieju przed aktualizacją wyników
Zaktualizuj wyniki turnieju i sprawdź, czy runda się zmieniła
Wyodrębnij pary dla nowej rundy
Przejdź przez wszystkich uczestników i członków zespołów
Generuj dynamiczne tematy i treści e-maili
Zweryfikuj adresy e-mail
Pobierz informacje nadawcy z App.config za pomocą GlobalConfig
Wyślij e-maile używając MailMessage i SmtpClient
Do wysyłania e-maili transakcyjnych na dużą skalę zaleca się użycie API do e-maili transakcyjnych, takich jak SendGrid lub Mailgun. Wiele usług oferuje darmowy plan do początkowego testowania — SendGrid, na przykład, pozwala wysłać 100 e-maili dziennie i zapewnia analityki do oceny wydajności e-maili. Zawsze używaj zmiennych środowiskowych lub bezpiecznych skrytek jak Azure Key Vault czy AWS Secrets Manager do przechowywania wrażliwych danych uwierzytelniających w aplikacjach C#. Podczas rozwoju możesz użyć .NET run, aby uruchomić swoją aplikację i testować funkcjonalność wysyłania e-maili.
Tim podkreśla abstrakcję i modularność: przez izolowanie logiki e-mail, aplikacja staje się łatwiejsza do utrzymania, testowania i rozwijania.
Lekcja Tima Coreya demonstracja pokazuje, że wysyłanie e-maili w aplikacji C# to nie tylko wywołanie SmtpClient.Send(). Wymaga to starannego rozważenia, kiedy wysyłać e-maile, zbierania istotnych informacji, weryfikacji odbiorców oraz strukturyzacji kodu pod kątem utrzymania. .NET framework zapewnia solidne wsparcie dla wysyłania e-maili przez Simple Mail Transfer Protocol (SMTP), który jest najczęstszym sposobem wysyłania e-maili z aplikacji C#.
Podążając za podejściem Tima, programiści mogą zbudować solidną, wielokrotnego użytku funkcjonalność e-mail, która może skalować się wraz z ich aplikacjami, czy to dla śledzenia turniejów, systemu powiadomień, czy innych usług bazujących na użytkownikach. Użycie nowoczesnych bibliotek i protokołów takich jak SMTP zapewnia niezawodną i konserwowalną funkcjonalność e-mail w aplikacjach C#.
Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!
Join our newsletter, you’ll get exclusive access on article updates. We value your privacy