E-Mail-Versand in C# (.NET): von SmtpClient bis MailKit
Das Versenden von E-Mails ist eine der Kernaufgaben bei der Entwicklung von Webanwendungen, Benachrichtigungsdiensten und Unternehmenssystemen. Im .NET-Ökosystem gibt es sowohl integrierte Werkzeuge als auch Drittanbieter-Bibliotheken, die die Arbeit mit SMTP, SSL/TLS und komplexen Szenarien vereinfachen. In diesem Artikel werden wir im Detail besprechen, wie man eine E-Mail in C# versendet, unter Verwendung des klassischen SmtpClient und der modernen Bibliothek MailKit.
1. Integrierter SmtpClient (System.Net.Mail)
Die Klasse SmtpClient ist in .NET Framework und .NET Core/5+ (mit einigen Einschränkungen) verfügbar. Sie ermöglicht die schnelle Konfiguration des E-Mail-Versands über jeden SMTP-Server.
Basisbeispiel für den E-Mail-Versand
using System.Net;using System.Net.Mail;
var smtpClient = new SmtpClient("smtp.gmail.com"){ Port = 587, Credentials = new NetworkCredential("your_email@gmail.com", "your_app_password"), EnableSsl = true};
var mailMessage = new MailMessage{ From = new MailAddress("your_email@gmail.com"), Subject = "Test-E-Mail aus C#", Body = "Hallo! Diese Nachricht wurde über SmtpClient gesendet.", IsBodyHtml = false};
mailMessage.To.Add("recipient@example.com");
try{ smtpClient.Send(mailMessage); Console.WriteLine("E-Mail erfolgreich gesendet!");}catch (Exception ex){ Console.WriteLine($"Fehler beim Senden: {ex.Message}");}Wichtig: Für Gmail wird ein App-Passwort benötigt, nicht das normale Passwort. Für andere Dienste (Yandex, Mail.ru) überprüfen Sie die SMTP-Einstellungen.
Versand einer HTML-E-Mail mit Anhang
var message = new MailMessage();message.From = new MailAddress("sender@example.com");message.To.Add("user@example.com");message.Subject = "Monatsbericht";message.IsBodyHtml = true;message.Body = "<h2>Monatlicher Bericht</h2><p>Im Anhang befindet sich eine PDF-Datei.</p>";
// Anhang hinzufügenvar attachment = new Attachment(@"C:\\Reports\\report.pdf");message.Attachments.Add(attachment);
using (var client = new SmtpClient("smtp.example.com", 587)){ client.Credentials = new NetworkCredential("login", "password"); client.EnableSsl = true; client.Send(message);}Anhänge können beliebigen Typs sein: Bilder, Dokumente, Archive. Für den Versand aus dem Speicher verwenden Sie MemoryStream.
2. Asynchroner Versand
In modernen Anwendungen ist es wünschenswert, den Thread nicht zu blockieren. Verwenden Sie SendMailAsync:
public async Task SendEmailAsync(){ using var client = new SmtpClient("smtp.example.com", 587); client.Credentials = new NetworkCredential("login", "password"); client.EnableSsl = true;
var message = new MailMessage("from@example.com", "to@example.com") { Subject = "Asynchroner Versand", Body = "Diese E-Mail wurde asynchron gesendet." };
await client.SendMailAsync(message); Console.WriteLine("Asynchron gesendet!");}3. Probleme mit SmtpClient und Alternativen
Trotz seiner Einfachheit hat SmtpClient Nachteile:
- Veraltete API (in .NET 5+ als veraltet markiert);
- Schlechte Unterstützung moderner Authentifizierungsprotokolle (OAuth2);
- Keine integrierte Unterstützung für S/MIME und erweiterte Szenarien.
Daher empfiehlt Microsoft die Verwendung von Drittanbieter-Bibliotheken wie MailKit.
4. MailKit — moderne Bibliothek für die E-Mail-Verarbeitung
MailKit ist eine plattformübergreifende Open-Source-Bibliothek. Sie unterstützt SMTP, POP3, IMAP, SSL/TLS, Asynchronität, OAuth2 und vieles mehr.