Picture: Microsoft

Flexibler und einfacher E-Mail Versand mit Mimekit in .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:

MimeMessage emailMessage = new();

// Setzen des Absenders
emailMessage.From.Add(new MailboxAddress("SchwabenCode", "[email protected]"));

// Setzen des Empfängers
emailMessage.To.Add(new MailboxAddress("[email protected]"));

// Betreff
emailMessage.Subject = "E-Mail Betreff";

// Body
emailMessage = 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.

var image = builder.LinkedResources.Add (@"image.jpg");
image.ContentId = MimeUtils.GenerateMessageId ();

// Bilder werden in HTML-Images über die ContentIds referenziert.
builder.HtmlBody = string.Format (@"<p>Hallo, hier mein tolles Bild!</p><br />
                                    <center><img src=""cid:{0}""></center>", image.ContentId);

emailMessage.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.

// Erstellen des SMTP Clients und Aufbau der Verbindung
SmtpClient smtpClient = new();
{
    await smtpClient.ConnectAsync(smtpHost, smtpPort, useSsl: true, cancellationToken).ConfigureAwait(false);
    await smtpClient.AuthenticateAsync(smtpUserName, smtpPassword, cancellationToken).ConfigureAwait(false);
}

// Versenden von ein oder meheren Nachrichten:
await smtpClient.SendAsync(emailMessage, cancellationToken).ConfigureAwait(false);

// Trennen der SMTP Verbindung
await 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.