Отправка Email на C# (.NET): SmtpClient, MailKit и MimeKit
Отправка электронной почты — одна из базовых задач в современных приложениях. В экосистеме C# (.NET) есть как встроенные средства (класс SmtpClient), так и мощные сторонние библиотеки (MailKit и MimeKit). В этом руководстве мы подробно разберем оба подхода, рассмотрим примеры кода, настройку SMTP-сервера, работу с вложениями и HTML-письмами.
1. Встроенный SmtpClient (System.Net.Mail)
Класс SmtpClient доступен в .NET Framework и .NET Core/5+ (с ограничениями). Он прост в использовании, но не поддерживает современные протоколы (например, OAuth2) и считается устаревшим для новых проектов.
2. Установка и подключение MailKit
MailKit — это кроссплатформенная библиотека для работы с электронной почтой. Она полностью асинхронна, поддерживает SSL/TLS, OAuth2, S/MIME и другие современные возможности. Установка через NuGet:
dotnet add package MailKit
dotnet add package MimeKit
Или через консоль менеджера пакетов:
Install-Package MailKit
Install-Package MimeKit
3. Пример отправки простого письма с использованием SmtpClient
Базовый пример с использованием встроенного SmtpClient:
using System.Net;
using System.Net.Mail;
public void SendSimpleEmail()
{
var fromAddress = new MailAddress("sender@example.com", "Отправитель");
var toAddress = new MailAddress("recipient@example.com", "Получатель");
const string fromPassword = "your_password";
const string subject = "Тема письма";
const string body = "Текст письма";
var smtp = new SmtpClient
{
Host = "smtp.example.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body
})
{
smtp.Send(message);
}
}
Важно: Для Gmail, Yandex и других сервисов необходимо использовать пароль приложения или OAuth2.
4. Отправка Email с помощью MailKit (рекомендуемый способ)
MailKit предоставляет более гибкий и современный API. Пример отправки простого текстового письма:
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
using System.Threading.Tasks;
public async Task SendEmailWithMailKitAsync()
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Отправитель", "sender@example.com"));
message.To.Add(new MailboxAddress("Получатель", "recipient@example.com"));
message.Subject = "Тема письма";
message.Body = new TextPart("plain")
{
Text = "Текст письма"
};
using (var client = new SmtpClient())
{
await client.ConnectAsync("smtp.example.com", 587, SecureSocketOptions.StartTls);
await client.AuthenticateAsync("sender@example.com", "your_password");
await client.SendAsync(message);
await client.DisconnectAsync(true);
}
}
5. Отправка HTML-письма с вложениями
Создание многосоставного письма (HTML + вложения) с помощью MimeKit:
public async Task SendHtmlEmailWithAttachmentAsync()
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Отправитель", "sender@example.com"));
message.To.Add(new MailboxAddress("Получатель", "recipient@example.com"));
message.Subject = "HTML письмо с вложением";
var bodyBuilder = new BodyBuilder
{
HtmlBody = @"<h1>Привет!</h1><p>Это HTML-письмо с вложением.</p>",
TextBody = "Это текстовая версия письма."
};
// Добавляем вложение
bodyBuilder.Attachments.Add(@"C:\path\to\file.pdf");
message.Body = bodyBuilder.ToMessageBody();
using (var client = new SmtpClient())
{
await client.ConnectAsync("smtp.example.com", 465, SecureSocketOptions.SslOnConnect);
await client.AuthenticateAsync("sender@example.com", "your_password");
await client.SendAsync(message);
await client.DisconnectAsync(true);
}
}
6. Работа с несколькими получателями и копиями
MailKit позволяет легко добавлять получателей в поля To, Cc и Bcc:
message.To.Add(new MailboxAddress("Получатель 1", "user1@example.com"));
message.To.Add(new MailboxAddress("Получатель 2", "user2@example.com"));
message.Cc.Add(new MailboxAddress("Копия", "cc@example.com"));
message.Bcc.Add(new MailboxAddress