Zum Fußzeileninhalt springen
Iron Academy Logo
C#-Anwendung
C#-Anwendung

Andere Kategorien

C# E-Mail senden: Ein tiefer Einblick mit Tim Corey

Tim Corey
1h 11m 27s

Willkommen zu einem umfassenden Blick auf das Versenden von E-Mails in einer C# Windows Forms-Anwendung unter Verwendung der Erkenntnisse aus Tim Coreys "C# App Start To Finish – Lesson 26". In dieser Lektion demonstriert Tim, wie man Funktionalität entwickelt, die Benutzer per E-Mail kontaktiert, insbesondere im Kontext einer Turnierverfolgungs-Anwendung.

Transaktions-E-Mails - automatisierte, personalisierte Nachrichten, die durch Benutzeraktionen ausgelöst werden - sind für moderne Webanwendungen unerlässlich. C# Webanwendungen verlassen sich oft auf Transaktions-E-Mail-APIs wie Mailgun und SendGrid, um verlässliche und skalierbare Zustellung von produktionsfertigen E-Mails bereitzustellen.

Dieser Artikel wird Sie durch den von Tim demonstrierten Prozess führen, einschließlich der Entscheidung, wo der E-Mail-Code platziert werden soll, der Erstellung von Hilfsmethoden, dem Aufbau dynamischer E-Mails und ihrem Versenden mit den integrierten C#-Bibliotheken. Visual Studio ist die primäre IDE für die Entwicklung und das Testen von E-Mail-Funktionalität in C#-Anwendungen.

E-Mail-Zustellungsplattformen wie Mailtrap können verwendet werden, um Zustellbarkeit zu überwachen und das Senden von E-Mails während der Entwicklung zu testen.

Einführung

Tim beginnt, indem er uns an die Kernanforderung erinnert: Nur eine Runde eines Turniers kann zu einem Zeitpunkt gespielt werden. Das bedeutet, dass, sobald eine Runde abgeschlossen ist, Teams über ihr nächstes Match informiert werden müssen. Diese Benachrichtigungs-E-Mails sind eine Art von Transaktions-E-Mail, die typischerweise automatisch als Antwort auf Benutzeraktionen in Webanwendungen gesendet wird. E-Mail ist eine praktische Lösung, um sicherzustellen, dass Teilnehmer prompt informiert werden, und Tim zeigt, wie man diese Funktionalität Schritt für Schritt aufbaut.

Die Verwendung eines dedizierten E-Mail-Dienstes wie Amazon SES kann helfen, die zuverlässige und skalierbare Zustellung dieser Transaktions-E-Mails sicherzustellen.

Entscheidung, wo die E-Mail-Logik positioniert werden soll

Tim beginnt, indem er eine wesentliche Frage anspricht: Wo sollte die E-Mail-Logik platziert werden? Er erklärt, dass sie dort platziert werden sollte, wo die Anwendung bereits wichtige Turnierlogik ausführt. In diesem Fall ist die beste Stelle innerhalb der UpdateTournamentResults-Methode.

Warum hier? Weil diese Methode:

  • Die Gewinner der Matchups bestimmt

  • Teams in die nächste Runde voranbringt

  • Die Datenbank oder Dateispeicherung aktualisiert

Indem man die E-Mail-Logik hier platziert, senden wir E-Mails nur nachdem eine Runde abgeschlossen ist, um das unnötige Spammen der Benutzer zu vermeiden.

Tim stellt eine Strategie vor, den aktuellen Rundenstatus vor und nach dem Aktualisieren der Ergebnisse zu verfolgen:

  • Wenn sich die Rundennummer ändert, wissen wir, dass eine neue Runde begonnen hat.

  • Dies löst die Benachrichtigungen per E-Mail an Benutzer über bevorstehende Matchups aus.

Überprüfung der aktuellen Runde

Um festzustellen, ob sich eine Runde geändert hat, erstellt Tim eine Erweiterungsmethode namens CheckCurrentRound. Diese Methode iteriert durch alle Runden im Turniermodell und überprüft, ob jedes Matchup in einer Runde einen Gewinner hat.

  • Wenn alle Matchups abgeschlossen sind, erhöht sie eine Ausgabewariable.

  • Wenn eine Runde unvollständig ist, wird das Prüfen weiterer Runden gestoppt.

  • Diese Methode gibt die aktuelle Rundennummer zurück, nachdem der Turnierstatus ausgewertet wurde.

Tim betont, dass das Starten des Outputs bei 1 Fälle behandelt, in denen noch keine Runden abgeschlossen sind. Durch die Nutzung dieser Methode kann die Anwendung dynamisch erkennen, wann eine neue Runde beginnt, und E-Mails auslösen.

E-Mail-Logik in eine separate Klasse extrahieren

Tim befürwortet die Erstellung einer dedizierten EmailLogic-Klasse. Dieser Ansatz:

  • Hält den E-Mail-bezogenen Code getrennt von der Turnierlogik

  • Macht ihn wiederverwendbar in der gesamten Anwendung

  • Hilft bei zukünftigen Erweiterungen, wie das Versenden von Zahlungsaufforderungen oder Turnierzusammenfassungen

Die Verwendung einer dedizierten E-Mail-Client-Bibliothek, wie MailKit, wird für moderne C#-Anwendungen empfohlen, da sie im Vergleich zur veralteten SmtpClient-Klasse robuste Funktionen und besseren Support bietet.

Er richtet eine öffentliche statische Methode namens SendEmail mit folgenden Parametern ein:

  • Von (Absender-E-Mail)

  • An (Empfänger-E-Mails)

  • Betreff

  • Inhalt

Die BodyBuilder-Klasse von MailKit kann verwendet werden, um HTML-E-Mails zu erstellen und Anhänge effizient hinzuzufügen, was das Senden von E-Mails mit Dateien wie PDFs erleichtert.

Tim schlägt vor, es bei der ersten Version einfach zu halten, mit späterem Hinzufügen von CC und BCC, falls erforderlich.

Vorbereitung der aktuellen Runde für Benachrichtigungen

Sobald die aktuelle Runde bestimmt ist, extrahiert Tim mit LINQ eine Liste von Begegnungen für diese Runde. Jede Begegnung enthält Einträge für zwei konkurrierende Teams.

Für jede Begegnung durchläuft er:

  1. Jeden Team-Eintrag

  2. Jedes Team-Mitglied

Dies stellt sicher, dass jeder Einzelne eine E-Mail über seine bevorstehende Begegnung erhält. Beim Senden von E-Mails an mehrere Empfänger kann die InternetAddressList-Klasse und die AddRange-Methode verwendet werden, um alle Empfänger-E-Mail-Adressen effizient auf einmal hinzuzufügen. Es ist auch wichtig, jede Empfänger-E-Mail-Adresse zu überprüfen, um eine erfolgreiche Zustellung sicherzustellen.

Tim betont die Wichtigkeit, alle notwendigen Informationen zu sammeln, wie:

  • Den Namen und die E-Mail des Teilnehmers

  • Den Namen ihres Teams

  • Den Namen des gegnerischen Teams

Dynamische E-Mail-Inhalte erzeugen

Tim konzentriert sich dann darauf, den Betreff und den Inhalt der E-Mail dynamisch zu erstellen:

  • Betreff: Einfach und direkt, z.B.: "Sie haben eine neue Begegnung mit Team Rolling Thunder." Der Betreff wird typischerweise mit einer String subject-Variable im Code gesetzt, die dann der E-Mail-Nachricht zugewiesen wird.

  • Inhalt: Tim benutzt einen StringBuilder, um mehrere Textzeilen effizient zu verknüpfen. Er erklärt, dass das wiederholte Hinzufügen von Strings in C# ineffizient ist, da jede Addition neue Speicherzuweisungen erstellt.

Beim Erzeugen des E-Mail-Inhalts berücksichtigt Tim, ob eine einfache Text-E-Mail oder eine HTML-E-Mail gesendet werden soll. Einfache Text-E-Mails sind einfach, kompatibel mit allen E-Mail-Clients und werden oft für interne Benachrichtigungen oder Transaktionsnachrichten verwendet. HTML-E-Mails hingegen erlauben eine reichere Formatierung. Das Senden von sowohl HTML- als auch einfachen Textversionen kann die Zustellbarkeit verbessern und die Kompatibilität mit verschiedenen E-Mail-Dienstanbietern sicherstellen. Sie können HTML-E-Mails in C# senden, indem Sie die IsBodyHtml-Eigenschaft der MailMessage-Klasse auf true setzen oder die MailKit-Bibliothek verwenden und den Nachrichtentext so ändern, dass er HTML-Inhalt enthält.

Die Verwendung von StringBuilder ermöglicht der Anwendung,:

  • Mehrere Zeilen für eine personalisierte Nachricht zu handhaben

  • Details wie das gegnerische Team und Rundendaten einzuschließen

  • Leistungsprobleme zu vermeiden, selbst beim Versenden von Hunderten von E-Mails

Tim behandelt auch spezielle Fälle, wie ein spielfreies Wochenende, bei dem ein Team keinen Gegner hat.

Validierung von E-Mail-Adressen

Vor dem Senden prüft Tim, ob der Teilnehmer eine gültige E-Mail-Adresse hat. Er merkt an:

  • Selbst eine einfache Prüfung auf eine leere Zeichenfolge verhindert Fehler

  • Eine umfassende Validierung (wie Regex) ist möglich, kann aber bei großen Datensätzen teuer sein

  • Für die meisten Anwendungen genügt es, das Vorhandensein einer E-Mail zu überprüfen

Dieser Schritt stellt sicher, dass nur Teilnehmer benachrichtigt werden, die E-Mails angegeben haben.

Konfigurierung der Absenderadresse

Tim erklärt, dass die Absender-E-Mail in App.config gespeichert werden sollte, um Flexibilität zu gewährleisten. Er fügt hinzu:

  • senderEmail für die tatsächliche E-Mail-Adresse

  • senderDisplayName für den Namen des Absenders

Viele E-Mail-Dienste, wie Amazon SES, erfordern eine Domänenverifizierung, um eine ordnungsgemäße Zustellbarkeit zu gewährleisten und Spam-Filter zu vermeiden. Dieser Prozess beinhaltet das Hinzufügen und Überprüfen Ihrer Domäne, bevor Sie zuverlässig E-Mails über deren API senden können.

Später ruft ein GlobalConfig-Hilfsprogramm diese Werte ab. Diese Abstraktion ermöglicht es, die Absenderinformationen zu ändern, ohne den Code für die E-Mail-Logik zu modifizieren.

Einrichten von MailMessage

Um E-Mails zu senden, verwendet Tim den System.Net.Mail-Namespace, der in C# integriert ist. Die Schritte umfassen:

  1. Erstellen Sie eine neue MailAddress für den Absender, einschließlich des Anzeigenamens. Beim Konfigurieren einer neuen Mailadresse stellen Sie sicher, dass die richtigen Konto-Einstellungen und die Authentifizierung für das programmatische Senden von E-Mails vorliegen.

  2. Instanziieren Sie ein MailMessage-Objekt
  • Fügen Sie Empfänger-E-Mail-Adressen hinzu

  • Festlegen von Betreff und Inhalt

Die MailMessage-Klasse erlaubt es Ihnen, Anhänge mithilfe der Attachments-Eigenschaft hinzuzufügen. Sie können HTML-E-Mails in C# senden, indem Sie die IsBodyHtml-Eigenschaft der MailMessage-Klasse auf true setzen.

Verwendung des SMTP-Clients

Schließlich richtet Tim den SMTP-Client ein, um die E-Mail zu senden:

  • Konfigurieren von Host, Port, Anmeldeinformationen und aktivieren Sie bei Bedarf SSL. Während Sie Ihren eigenen SMTP-Server verwenden können, ist die Nutzung eines cloudbasierten E-Mail-Dienstes wie Amazon Simple Email Service (SES) häufig zuverlässiger und skalierbarer.

  • Rufen Sie Send(mail) auf, um die Nachricht zu übertragen

  • Dies behandelt das Senden von E-Mails über Standard-SMTP-Server wie Gmail, Outlook oder einen benutzerdefinierten Server oder über einen E-Mail-Dienst wie Amazon SES, Mailgun oder Mailtrap.

Amazon SES (Simple Email Service) ist ein kostengünstiger und skalierbarer E-Mail-Dienst, der von AWS angeboten wird, um Transaktionsmails schnell zu versenden. Um Amazon SES in Ihre C#-Anwendung zu integrieren, müssen Sie das AWS SES-Paket installieren und möglicherweise einen Authentifikations-Token verwenden, um sicheren Zugriff zu gewährleisten. Sicherer App-Zugriff ist wichtig bei der Konfiguration von SMTP-Einstellungen, insbesondere bei der Nutzung von Diensten wie Gmail oder Office365, um eine ordnungsgemäße Authentifizierung und Sicherheit zu gewährleisten.

Er bemerkt, dass E-Mail-Server oft Einschränkungen bei der "Von"-Adresse aus Sicherheitsgründen durchsetzen, und empfiehlt, mit einem Dummy- oder Sandbox-Server zu testen.

Zusammenfassung des E-Mail-Flows

Zur Wiederholung von Tims Prozess:

  1. Erkennen Sie die aktuelle Turnierrunde, bevor Sie die Ergebnisse aktualisieren

  2. Aktualisieren Sie die Turnierergebnisse und erkennen Sie, ob die Runde fortgeschritten ist

  3. Extrahieren Sie Begegnungen für die neue Runde

  4. Durchlaufen Sie alle Teilnehmer und Teammitglieder

  5. Erzeugen Sie dynamische E-Mail-Betreffs und -Inhalte

  6. Validieren Sie E-Mail-Adressen

  7. Rufen Sie die Absenderinformationen aus App.config über GlobalConfig ab

  8. Versenden Sie E-Mails mit Hilfe von MailMessage und SmtpClient

Für das Versenden von Transaktions-E-Mails im großen Maßstab wird empfohlen, Transaktions-E-Mail-APIs wie SendGrid oder Mailgun zu verwenden. Viele Dienste bieten einen kostenlosen Plan für erste Tests an—SendGrid erlaubt es Ihnen beispielsweise, 100 E-Mails pro Tag zu senden und liefert Analysen zur E-Mail-Leistung. Verwenden Sie immer Umgebungsvariablen oder sichere Tresore wie Azure Key Vault oder AWS Secrets Manager, um sensible Anmeldedaten in Ihren C#-Anwendungen zu speichern. Während der Entwicklung können Sie dotnet run verwenden, um Ihre Anwendung zu starten und die E-Mail-Versandfunktionalität zu testen.

Tim betont Abstraktion und Modularität: Durch das Isolieren der E-Mail-Logik wird die Anwendung leichter wartbar, testbar und erweiterbar.

Abschließende Gedanken

Tim Coreys Lektion zeigt, dass das Versenden von E-Mails in einer C#-Anwendung mehr ist, als nur SmtpClient.Send() aufzurufen. Es erfordert sorgfältige Überlegungen, wann E-Mails gesendet werden sollen, das Sammeln relevanter Informationen, die Validierung von Empfängern und die Strukturierung des Codes für Wartbarkeit. Das .NET-Framework bietet robusten Support für den E-Mail-Versand über das Simple Mail Transfer Protocol (SMTP), welches der häufigste Weg ist, um E-Mails aus einer C#-Anwendung zu versenden.

Durch das Befolgen von Tims Ansatz können Entwickler robuste, wiederverwendbare E-Mail-Funktionen erstellen, die mit ihren Anwendungen skalieren können, sei es ein Turnier-Tracker, ein Benachrichtigungssystem oder andere benutzerbasierte Dienste. Die Verwendung moderner Bibliotheken und Protokolle wie SMTP sorgt für zuverlässige und wartbare E-Mail-Funktionalität in C#-Anwendungen.

Hero Worlddot related to C# E-Mail senden: Ein tiefer Einblick mit Tim Corey
Hero Affiliate related to C# E-Mail senden: Ein tiefer Einblick mit Tim Corey

Verdienen Sie mehr, indem Sie teilen, was Sie lieben

Erstellen Sie Inhalte für Entwickler, die mit .NET, C#, Java, Python oder Node.js arbeiten? Verwandeln Sie Ihr Fachwissen in ein zusätzliches Einkommen!

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an