Sending Email In C# & .NET - Part 14 - Sending Multiple Format Email Using MailKit
[C#, .NET, Email, StarLibrary, MailKit]
This is part 14 of a series on sending Email
- Sending Email in C# & .NET - Part 1 - Introduction
- Sending Email in C# & .NET - Part 2 - Delivery
- Sending Email in C# & .NET - Part 3 - Using Gmail
- Sending Email In C# & .NET - Part 4 - Using Office 365 & MS Graph API
- Sending Email In C# & .NET - Part 5 - Using Google Cloud API
- Sending Email In C# & .NET - Part 6 - Testing SMTP Locally Using PaperCut
- Sending Email In C# & .NET - Part 7 - Sending Inline Images Using SMTP
- Sending Email In C# & .NET - Part 8 - Sending HTML Email Using SMTP
- Sending Email In C# & .NET - Part 9 - Sending Multiple Format Email Using SMTP
- Sending Email In C# & .NET - Part 10 - Sending Plain Text Email Using MailKit
- Sending Email In C# & .NET - Part 11 - Sending HTML Email Using MailKit
- Sending Email In C# & .NET - Part 12 - Sending Email With Attachments Using MailKit
- Sending Email In C# & .NET - Part 13 - Sending Email With Inline Attachments Using MailKit
- Sending Email In C# & .NET - Part 14 - Sending Multiple Format Email Using MailKit (This post)
- Sending Email In C# & .NET - Part 15 - Sending Calendar Invites Using MailKit
- Sending Email In C# & .NET - Part 16 - Testing SMTP Locally Using Mailpit
In our last post, “Sending Email In C# & .NET - Part 13 - Sending Email With Inline Attachments Using MailKit”, we looked at how to send inline attachments using MailKit.
In this post, we will look at how to send an email with multiple formats.
The process is as follows:
- Create a
MimeMessage
- Create one (or more)
MailboxAddress
for the recipients and add to theTo
collection of theMimeMessage
- Create one
MailboxAddress
for the sender and add it to theFrom
collection of theMimeMessage
- Set the
Subject
of theMimeMessage
- Create a
BodyBuilder
- Add
LinkedResources
to theBodyBuilder
(if any) - Set the
TextBody
of the theBodyBuilder
- Set the
HtmlBody
of theBodyBuilder
- Set the body from the
BodyBuilder
- Send the message using the
SmtpClient
. This is theSmtpClient
fromMailKit
, not the one in System.Net.
The code is as follows:
using MailKit.Net.Smtp;
using MimeKit;
using MimeKit.Utils;
using Serilog;
// Configure logging to the console
Log.Logger = new LoggerConfiguration()
.WriteTo.Console()
.CreateLogger();
// Create the email
var message = new MimeMessage();
// Add the sender
message.From.Add(new MailboxAddress("James Bond", "james@mi5.org"));
// Set the recipient
message.To.Add(new MailboxAddress("M", "m@mi5.org"));
// Set the email subject
message.Subject = "Christmas Card";
var builder = new BodyBuilder();
// Create a LinkedResource with the image
var image1 = builder.LinkedResources.Add("Bond1.jpeg");
// Generate an ID for use in linkage
image1.ContentId = MimeUtils.GenerateMessageId();
// Add the card attachment
builder.Attachments.Add("Card.txt");
// Build the html version of the message text using the IDs
var htmlBody = $"""
<p>Dear M,<br/>
<p>Merry Christmas From Me<br/>
<br/
<center>
<img src="cid:{image1.ContentId}">
</center>
<p>James<br>
""";
// Set the html body
builder.HtmlBody = htmlBody;
// Build the html version of the message text using the IDs
var body = """
Dear M,
Merry Christmas From Me
James
""";
// Set the plain text body
builder.TextBody = body;
// Set the message body
message.Body = builder.ToMessageBody();
// Now send the email
using (var client = new SmtpClient())
{
Log.Information("Connecting to smtp server...");
await client.ConnectAsync("localhost", 25, false);
// Typically, authenticate here. But we are using PaperCut
//await client.AuthenticateAsync("username", "password");
await client.SendAsync(message);
Log.Information("Sent message");
await client.DisconnectAsync(true);
Log.Information("Disconnected from server");
}
If we run this code, the resulting email will be as follows:
Of particular interest:
Where we are seeing:
- Inline attachment for the HTML body
- File attachment for the card
We also have the plain text version of the email.
TLDR
The BodyBuilder
object in MailKit
allows for the construction of elaborate, multi-format email messages.
The code is in my GitHub.
Happy hacking!