DEV Community

AdriΓ‘n Bailador
AdriΓ‘n Bailador

Posted on

2

Email Management with .NET 9 and C# using MailKit

πŸ“Œ Introduction

Managing emails programmatically is a common requirement in many applications. In .NET 9, the SmtpClient class is obsolete and no longer recommended. Instead, MailKit and MimeKit provide a modern, efficient, and flexible way to handle email communication.

This guide will help you configure and use MailKit to send emails securely and efficiently.


βœ… Prerequisites

Before implementing email-sending functionality, ensure you have:

βœ” A .NET 9 application (Console, Web, or Windows Forms)
βœ” An SMTP server (e.g., Gmail, Outlook, or your own SMTP service)
βœ” Valid SMTP credentials (username and password) or an OAuth2 token
βœ” Secure storage for credentials (environment variables, Azure Key Vault, AWS Secrets Manager)


πŸ”§ Setting Up MailKit in C

1️⃣ Install Required Package

Run the following command to install MailKit:

 dotnet add package MailKit
Enter fullscreen mode Exit fullscreen mode

2️⃣ Securely Store SMTP Credentials

❌ Bad practice: Hardcoding credentials in your code.
βœ… Good practice: Use environment variables:

Set Environment Variables (Windows/Linux/macOS)

export SMTP_HOST=smtp.example.com
export SMTP_PORT=587
export SMTP_USER=your-email@example.com
export SMTP_PASSWORD=your-password
Enter fullscreen mode Exit fullscreen mode

Read Environment Variables in C#

var smtpHost = Environment.GetEnvironmentVariable("SMTP_HOST");
var smtpPort = int.Parse(Environment.GetEnvironmentVariable("SMTP_PORT"));
var smtpUser = Environment.GetEnvironmentVariable("SMTP_USER");
var smtpPassword = Environment.GetEnvironmentVariable("SMTP_PASSWORD");
Enter fullscreen mode Exit fullscreen mode

πŸ“€ Sending an Email

using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using System;

class Program
{
    static void Main()
    {
        try
        {
            var message = new MimeMessage();
            message.From.Add(new MailboxAddress("Your Name", smtpUser));
            message.To.Add(new MailboxAddress("Recipient", "recipient@example.com"));
            message.Subject = "Test Email";
            message.Body = new TextPart("plain") { Text = "This is a test email sent from a .NET 9 application." };

            using var client = new SmtpClient();
            client.Connect(smtpHost, smtpPort, SecureSocketOptions.StartTls);
            client.Authenticate(smtpUser, smtpPassword);
            client.Send(message);
            client.Disconnect(true);

            Console.WriteLine("Email sent successfully!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

πŸ”’ SecureSocketOptions Overview

Option Description
None No encryption.
SslOnConnect Uses SSL/TLS immediately upon connection.
StartTls Starts unencrypted, then upgrades to TLS (Recommended).
Auto Automatically selects the best option.

πŸ“Ž Sending Emails with Attachments

var message = new MimeMessage();
message.From.Add(new MailboxAddress("Your Name", smtpUser));
message.To.Add(new MailboxAddress("Recipient", "recipient@example.com"));
message.Subject = "Email with Attachment";

var body = new TextPart("plain") { Text = "Please find the attached file." };
var attachment = new MimePart("application", "pdf")
{
    Content = new MimeContent(File.OpenRead("document.pdf"), ContentEncoding.Default),
    ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),
    ContentTransferEncoding = ContentEncoding.Base64,
    FileName = "document.pdf"
};

var multipart = new Multipart("mixed") { body, attachment };
message.Body = multipart;
Enter fullscreen mode Exit fullscreen mode

πŸ“§ Sending HTML Emails

message.Body = new TextPart("html")
{
    Text = "<h1>Welcome!</h1><p>This is a <strong>test email</strong> with HTML formatting.</p>"
};
Enter fullscreen mode Exit fullscreen mode

πŸ“© Sending Emails to Multiple Recipients

message.To.Add(new MailboxAddress("Recipient1", "recipient1@example.com"));
message.To.Add(new MailboxAddress("Recipient2", "recipient2@example.com"));
message.Bcc.Add(new MailboxAddress("Hidden Recipient", "bcc@example.com"));
Enter fullscreen mode Exit fullscreen mode

πŸ” Using OAuth2 Authentication (Recommended for Gmail, Outlook)

using MailKit.Security;
client.Authenticate(new SaslMechanismOAuth2(smtpUser, "your-access-token"));
Enter fullscreen mode Exit fullscreen mode

πŸ“Š Implementing Logging with Serilog

using Serilog;
Log.Logger = new LoggerConfiguration()
    .WriteTo.Console()
    .WriteTo.File("logs/email.log", rollingInterval: RollingInterval.Day)
    .CreateLogger();

Log.Information("Email sent successfully to {Recipient}", "recipient@example.com");
Enter fullscreen mode Exit fullscreen mode

πŸ”„ Enhancing Resilience with Retry Policies

Using Polly to implement retries on transient errors:

var retryPolicy = Policy.Handle<SmtpCommandException>()
    .WaitAndRetry(3, retryAttempt => TimeSpan.FromSeconds(retryAttempt));
Enter fullscreen mode Exit fullscreen mode

⚑ Sending Emails Asynchronously

For better performance in web applications:

await client.SendAsync(message);
await client.DisconnectAsync(true);
Enter fullscreen mode Exit fullscreen mode

βš™ Background Email Processing

For large-scale applications, consider:

  • πŸ“… Hangfire (Task scheduling)
  • ⏳ Quartz.NET (Job scheduling)
  • πŸ“¬ RabbitMQ / Azure Queue Storage (Message queuing)

πŸ›  Testing Email Sending with Smtp4Dev or Mailtrap

Option 1: Smtp4Dev (Local SMTP Server)

dotnet tool install -g Rnwood.Smtp4dev
smtp4dev
Enter fullscreen mode Exit fullscreen mode

Use localhost as your SMTP server in testing.

Option 2: Mailtrap (Online Testing)

  • Sign up at mailtrap.io
  • Use the provided SMTP credentials in your appsettings.json or environment variables.

🏁 Conclusion

MailKit is the recommended way to send emails in .NET 9, replacing SmtpClient. It provides a modern and secure approach to email management.

πŸ”Ή Best Practices: Use OAuth2 authentication, logging with Serilog, retry policies with Polly, and test with Smtp4Dev/Mailtrap to create a robust email-sending system.

Top comments (0)

πŸ‘‹ Kindness is contagious

DEV is better (more customized, reading settings like dark mode etc) when you're signed in!

Okay