
Dieser Artikel stammt aus dem Jahr 2020. Versionen, Werkzeuge und Empfehlungen können sich seitdem geändert haben. Neuere Beiträge findest du unter .NET.
Die .NET MailMessage Klasse existiert bereits seit .NET 2.0 und hat entsprechend einen historischen Rucksack mit sich zu tragen. Die letzten Jahre haben - insbesondere aufgrund der Spam-Prävention - die Anforderungen an sichere E-Mails immer mehr erhöht, die die MailMessage-Klasse einfach nicht mehr abdecken kann; auch aus Kompatibilitätsgründen.
MimeKit
MimeKit ist eine sehr beliebte Open Source Bibliothek und Alternative, die den modernen Anforderungen gewachsen ist. Die primäre Aufgabe von MimeKit ist hierbei das Erzeugen der Mail - inklusive HTML-Content uns sogar SMIME- wie auch DKIM-Signaturen.
Der Aufbau ist hier relativ ähnlich zur bekannten MailMessage-Klasse:
1MimeMessage emailMessage = new();
2
3// Setzen des Absenders
4emailMessage.From.Add(new MailboxAddress("SchwabenCode", "[email protected]"));
5
6// Setzen des Empfängers
7emailMessage.To.Add(new MailboxAddress("[email protected]"));
8
9// Betreff
10emailMessage.Subject = "E-Mail Betreff";
11
12// Body
13emailMessage = new BodyBuilder { HtmlBody = htmlContent }.ToMessageBody()Die BodyBuilder Klasse ist weniger für die Darstellung der Kraft vorhanden, sondern viel mehr für das Erstellen des Inhalts in Form von Plaintext oder HTML-Inhalten. Auch Bilder können dank dieser Builder-Klasse sehr einfach eingebunden werden, was in dieser Form bislang nur mit anderen externen Bibliotheken möglich war - oder durch viel selbst geschriebenen Code, um Client-konform Inhalte in E-Mails einzubetten.
1var image = builder.LinkedResources.Add (@"image.jpg");
2image.ContentId = MimeUtils.GenerateMessageId ();
3
4// Bilder werden in HTML-Images über die ContentIds referenziert.
5builder.HtmlBody = string.Format (@"<p>Hallo, hier mein tolles Bild!</p><br />
6 <center><img src=""cid:{0}""></center>", image.ContentId);
7
8emailMessage.Body = builder.ToMessageBody();MailKit - der Bruder von MimeKit
Das MimeKit selbst bringt keinen SMTP-Client mit; aus dem einfachen Grund, dass viele Schittstellen heutzutage nicht mehr direkt per SMTP E-Mails versenden, sondern mit Hilfe von weit verbreiteten Providern wie MailJet, SendGrid, Twilio und Co.
Wer dennoch - durchaus aufgrund von GDPR-Anforderungen oder auch den teilweise starren Preisstrukturen der Anbieter - weiterhin SMTP für das Versenden von E-Mails verwenden will braucht hier MailKit . MailKit arbeitet direkt mit der MimeKit-Bibliothek zusammen und verwendet auch die gemeinsamen Klassen.
Anders als der System.NET-Namespace wird nicht für jede E-Mail eine einzelne SMTP-Verbindung aufgebaut, sondern es wirst zunächst eine SMTP-Socket-Verbindung aufgebaut, die dann für viele E-Mails verwenden werden kann. Wir haben hier also einen klaren Effizient-Vorteil was die Wiederverwendbarkeit von SMTP-Verbindungen betrifft.
1// Erstellen des SMTP Clients und Aufbau der Verbindung
2SmtpClient smtpClient = new();
3{
4 await smtpClient.ConnectAsync(smtpHost, smtpPort, useSsl: true, cancellationToken).ConfigureAwait(false);
5 await smtpClient.AuthenticateAsync(smtpUserName, smtpPassword, cancellationToken).ConfigureAwait(false);
6}
7
8// Versenden von ein oder meheren Nachrichten:
9await smtpClient.SendAsync(emailMessage, cancellationToken).ConfigureAwait(false);
10
11// Trennen der SMTP Verbindung
12await smtpClient.DisconnectAsync(quit: true, cancellationToken).ConfigureAwait(false);Das wars auch schon.
Mit sehr wenig Code ist es möglich moderne E-Mails mit Hilfe von SMTP zu verschicken; ohne externe Kosten und ganz GDPR-Konform.
Related articles

- 4 min read
Versenden von E-Mails mit DKIM mit .NET und MailKit
Wer heute automatisierte E-Mails versenden will, die nicht unbedingt in jedem Spam-Filter hängen bleiben sollen, der kommt kaum an DKIM …

- 11 min read
Containerizing .NET in 2026 Without a Dockerfile
Most .NET Dockerfiles repeat the same five steps: restore, publish, select the matching Microsoft runtime image, copy the output and start …

- 12 min read
Problem Details in ASP.NET Core and .NET 11
builder.Services.AddProblemDetails() registers infrastructure. It does not create an error contract. An ASP.NET Core request can fail during …
Let's Work Together
Looking for an experienced Platform Architect or Engineer for your next project? Whether it's cloud migration, platform modernization or building new solutions from scratch - I'm here to help you succeed.
