Sending Email In C# & .NET - Part 10 - Sending Plain Text Email Using MailKit
[C#, .NET, Email, StarLibrary, MailKit]
This is Part 10 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 (This Post)
- 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
- 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 the previous post in this series, “Sending Email In C# & .NET - Part 9 - Sending Multiple Format Email Using SMTP,” we explored how to send emails in multiple formats—plain text and HTML — using SMTP.
In this post, we will explore how to send email using a more modern, feature-rich library: MailKit.
In the documentation for Microsoft’s SmtpClient is this section:
Important
We don’t recommend that you use the
SmtpClient
class for new development becauseSmtpClient
doesn’t support many modern protocols. Use MailKit or other libraries instead. For more information, see SmtpClient shouldn’t be used.
Interesting.
To send an email using MailKit
, the following are the steps:
- 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
- Set the
Body
of theMimeMessage
- Send the message using the
SmtpClient
. This is theSmtpClient
fromMailKit
, not the one in System.Net.
Before we write our code, we first run our local SMTP server, PaperCut, via Docker. We have discussed this before in the post Sending Email In C# & .NET - Part 6 - Testing SMTP Locally Using PaperCut
docker run -d -p 8080:80 -p 25:25 changemakerstudiosus/papercut-smtp:latest
The code is as follows:
using MailKit.Net.Smtp;
using MimeKit;
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 = "Deployment Status";
var textBody = new TextPart("plain")
{
Text = """
Dear M,
I would like to inquire about my deployment status as I feel I am more than
rested after the vacation I took after my last mission.
"""
};
message.Body = textBody;
// 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, we should see the following:
[05:34:38 INF] Connecting to smtp server...
[05:34:38 INF] Sent message
[05:34:38 INF] Disconnected from server
If we check our PaperCut inbox:
TLDR
In this post, we looked at how to send email using MailKit
, which is the recommended way to send email going forward.
The code is in my GitHub.
Happy hacking!