E-Mail-Versand in C# mit FluentEmail
Das Versenden von Transaktions-E-Mails in C# ist eine häufige Anforderung in vielen Unternehmenssoftwarelösungen. Wie Tim Corey in seinem Video "E-Mail-Versand in C# mit FluentEmail" erklärt, muss dieser Prozess jedoch nicht schwierig sein. Egal, ob Sie einfache Textnachrichten, HTML-E-Mails oder Massen-E-Mails versenden möchten, FluentEmail bietet eine einfache Möglichkeit, E-Mail-Versandfunktionen mit modernen Methoden und SMTP-Protokollen zu implementieren.
In diesem Artikel gehen wir den Prozess anhand des Videos von Tim Corey durch, um vollständig zu lernen, wie man E-Mails in C# mit FluentEmail versendet, einen SMTP-Server einrichtet, dynamische HTML-E-Mail-Nachrichten erstellt und den gesamten E-Mail-Versandprozess effektiv testet.
Einführung in FluentEmail
Tim beginnt mit einer Erläuterung des Hintergrunds: Das Versenden von E-Mails in C# basierte früher auf älteren Tools wie System.Net.Mail, aber mit .NET 5 und späteren Versionen wurde ein Großteil dieser Tools veraltet. An dieser Stelle kommt FluentEmail, eine moderne E-Mail-Bibliothek, ins Spiel, um die Lücke sowohl für einfache Nachrichten als auch für anspruchsvollere Kommunikation wie HTML-E-Mails und Inline-Bilder zu schließen.
Tim weist darauf hin, dass das Ziel darin besteht, auf einfache Weise E-Mails zu erstellen, Vorlagen zu verwenden und sie sogar zu testen, ohne eine Verbindung zu Produktionsservern herzustellen.
Einrichten der Konsolenanwendung
Bei 1:04 erstellt Tim eine neue Konsolenanwendung namens EmailDemoApp. Er betont, wie einfach es ist, mit static void Main(string[] args) oder einfach public static void Main zu beginnen, wenn Sie keine Benutzeroberfläche benötigen. Der saubere Ausgangspunkt ermöglicht es, sich ausschließlich auf den E-Mail-Versandprozess zu konzentrieren.

Nach der Erstellung der App richtet Tim das Projekt auf .NET 5 aus, ein modernes Upgrade des traditionellen .NET Framework, das eine bessere Kompatibilität mit modernen Protokollen für E-Mail-Clients gewährleistet.
Installation von FluentEmail über die Paketmanager-Konsole
Als Nächstes, bei 3:50, verwendet Tim die Paketverwaltungskonsole, um das Paket FluentEmail.Smtp zu installieren, das die Verwendung eines Smtp-Clients zum Senden von E-Mails in C# ermöglicht. Daneben erwähnt Tim, dass es zusätzliche Integrationen wie MailGun und SendGrid gibt, aber SMTP ist die universellste Option, die mit den meisten E-Mail-Clients und -Einrichtungen funktioniert.

Mit dem folgenden Befehl können Sie es manuell installieren:
Install-Package FluentEmail.Smtp
Install-Package FluentEmail.Smtp
Tim stellt sicher, dass wir auch die FluentEmail.Core-Abhängigkeit hinzufügen, die für das Funktionieren der Bibliothek erforderlich ist.
Konfiguration des SMTP-Clients und -Servers
Um 6:10 Uhr bespricht Tim die Einrichtung des smtp-Clients mithilfe einer neuen smtpclient-Konfiguration:
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 betont, dass dieser smtp-Server localhost für lokale Tests gedacht ist. In der Produktion würden Sie eine Verbindung zu den Details Ihres echten SMTP-Servers herstellen, z. B. zum SMTP-Endpunkt von Google Mail, möglicherweise unter Verwendung eines App-Passworts zur Sicherheit.
Er betont, dass sensible Einstellungen in eine Konfigurationsdatei wie appsettings.json verschoben werden sollten, um die Sicherheit und Flexibilität zu erhöhen.
Eine einfache E-Mail-Nachricht versenden
Um 11:59 Uhr geht Tim zum Senden einer einfachen Nachricht mit der E-Mail-API von FluentEmail über. Er erklärt, dass ein var E-Mail-Objekt mit dem folgenden Codebeispiel erstellt wird:
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();
Auf diese Weise geben Sie den String Betreff, den String E-Mail und den Nachrichtentext mithilfe der Methodenverkettung eindeutig an. Die var-Nachricht (E-Mail) enthält das Ergebnis und ermöglicht eine Fehlerprüfung.
Tim weist darauf hin, dass die E-Mail zwar von tim@timco.com zu stammen scheint, der Smtp-Server sie aber dennoch anhand der Anmeldedaten (z. B. dem Passwort für die Google Mail-App) authentifiziert.
E-Mails mit lokalem Verzeichnis anzeigen
Sobald die E-Mail-Nachricht versendet wurde, zeigt Tim, wie sie als .eml-Datei im lokalen Ordner erscheint. Obwohl man sie mit Outlook oder Notepad öffnen kann, ist sie für bestehende E-Mail-Nachrichten oder Massentests nicht besonders benutzerfreundlich.

Verwendung von Papercut SMTP für einfacheres Testen
Bei 17:03 wechselt Tim vom Speichern in einem Verzeichnis zur Verwendung von Papercut SMTP, einem leichtgewichtigen gefälschten SMTP-Server.
Er ändert die Einstellungen des smtp-Clients, um:
DeliveryMethod = SmtpDeliveryMethod.Network;
Port = 25;
DeliveryMethod = SmtpDeliveryMethod.Network;
Port = 25;
Mit Papercut wird jede Test-E-Mail sofort in einer grafischen Benutzeroberfläche angezeigt. Dies erleichtert die Überprüfung von Text- und HTML-Inhalten und simuliert, wie echte E-Mail-Clients die verschiedenen Formate darstellen.

Erstellung einer HTML-E-Mail mit Razor-Vorlagen
Bei 19:12 merkt Tim an, dass statischer reiner Text für viele reale Fälle nicht ausreicht. Für dynamischere, reichhaltige HTML-Nachrichten installiert er das Paket FluentEmail.Razor:
Install-Package FluentEmail.Razor
Install-Package FluentEmail.Razor
Er aktualisiert die Projekteinstellungen mit:
<PreserveCompilationContext>true</PreserveCompilationContext>
<PreserveCompilationContext>true</PreserveCompilationContext>
um sicherzustellen, dass Razor-Vorlagen richtig kompiliert werden.
Erstellung und Verwendung einer Razor-E-Mail-Vorlage
Mithilfe eines String-Builders (var builder) und der Razor-Syntax erstellt Tim eine dynamische E-Mail-Vorlage:
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");
Anschließend fügt er diese Vorlage mit folgendem Code an die var-Anfrage an:
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();
Diese Technik unterstützt je nach Inhalt der Vorlage verschiedene Formate wie einfachen Text und HTML-Text.
Behandlung von mehreren Empfängern und Anhängen
Obwohl in Tims Demo nicht vollständig beschrieben, unterstützt FluentEmail problemlos mehrere Empfänger über To()-Aufrufe und das Hinzufügen eines Attachment-Objekts für Dateianhänge, ähnlich wie das Mailmessage-Objekt oder die Mailmessage-Klasse in älteren .NET-Versionen.
Sie können Anhänge mit einem neuen String-Dateipfad oder einer Inhalts-ID für Inline-Bilder erstellen.
Ausnahmebehandlung im E-Mail-Versandprozess
Tim weist darauf hin, dass Sie mit Fehlern angemessen umgehen sollten. Zum Beispiel:
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);
}
Damit werden alle SMTP- oder netzwerkbezogenen Fehler während des E-Mail-Versands erfasst, insbesondere wenn Probleme mit dem SMTP-Protokoll auftreten.
Zusammenfassung und Schlussgedanken
Bei ca. 27:56 kommt Tim zu dem Schluss, dass mit FluentEmail das Versenden von E-Mails in C# ganz einfach wird - vom Versenden einfacher Nachrichten im Stil von Hallo Welt bis hin zu professionellen, dynamischen HTML-E-Mails.
Er betont auch, wie wichtig es ist, die Details und Konfigurationen des Smtp-Servers mithilfe einer Konfigurationsdatei wie appsettings.json flexibel zu halten, insbesondere beim Wechsel zwischen lokaler Entwicklung und Cloud-Plattformen wie Azure Portal.
Unabhängig davon, ob Sie einzelne E-Mails oder Massen-E-Mails versenden möchten, bietet FluentEmail in Kombination mit Papercut SMTP einen modernen, effizienten Arbeitsablauf, der mit vielen Programmiersprachen und Ökosystemen kompatibel ist.
Abschließende Überlegungen
Dank des ausgezeichneten Videos von Tim Corey ist klar, dass sich die moderne E-Mail-Versandfunktionalität in C# über die grundlegende Handhabung der Klassen smtpclient und mailmessage hinaus entwickelt hat. Mit Hilfe von FluentEmail können Entwickler schnell ein neues Projekt erstellen, eine SMTP-Verbindung konfigurieren, einen dynamischen E-Mail-Text erstellen und alles lokal testen, bevor es in der Produktion eingesetzt wird.
