Отправка email на C# (.NET): от SmtpClient до MailKit
Отправка электронных писем — одна из ключевых задач при разработке веб-приложений, сервисов уведомлений и корпоративных систем. В экосистеме .NET есть как встроенные средства, так и сторонние библиотеки, которые упрощают работу с SMTP, SSL/TLS и сложными сценариями. В этой статье мы подробно разберём, как отправить email на C#, используя классический SmtpClient и современную библиотеку MailKit.
1. Встроенный SmtpClient (System.Net.Mail)
Класс SmtpClient доступен в .NET Framework и .NET Core/5+ (с некоторыми ограничениями). Он позволяет быстро настроить отправку письма через любой SMTP-сервер.
Базовый пример отправки email
using System.Net;
using System.Net.Mail;
var smtpClient = new SmtpClient("smtp.gmail.com")
{
Port = 587,
Credentials = new NetworkCredential("your_email@gmail.com", "your_app_password"),
EnableSsl = true
};
var mailMessage = new MailMessage
{
From = new MailAddress("your_email@gmail.com"),
Subject = "Тестовое письмо из C#",
Body = "Привет! Это сообщение отправлено через SmtpClient.",
IsBodyHtml = false
};
mailMessage.To.Add("recipient@example.com");
try
{
smtpClient.Send(mailMessage);
Console.WriteLine("Письмо отправлено успешно!");
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка отправки: {ex.Message}");
}
Важно: Для Gmail потребуется пароль приложения, а не обычный пароль. Для других сервисов (Yandex, Mail.ru) проверьте настройки SMTP.
Отправка HTML-письма с вложением
var message = new MailMessage();
message.From = new MailAddress("sender@example.com");
message.To.Add("user@example.com");
message.Subject = "Отчёт за месяц";
message.IsBodyHtml = true;
message.Body = "<h2>Ежемесячный отчёт</h2><p>Во вложении PDF-файл.</p>";
// Добавляем вложение
var attachment = new Attachment(@"C:\Reports\report.pdf");
message.Attachments.Add(attachment);
using (var client = new SmtpClient("smtp.example.com", 587))
{
client.Credentials = new NetworkCredential("login", "password");
client.EnableSsl = true;
client.Send(message);
}
Вложения могут быть любого типа: изображения, документы, архивы. Для отправки из памяти используйте MemoryStream.
2. Асинхронная отправка
В современных приложениях желательно не блокировать поток. Используйте SendMailAsync:
public async Task SendEmailAsync()
{
using var client = new SmtpClient("smtp.example.com", 587);
client.Credentials = new NetworkCredential("login", "password");
client.EnableSsl = true;
var message = new MailMessage("from@example.com", "to@example.com")
{
Subject = "Асинхронная отправка",
Body = "Это письмо отправлено асинхронно."
};
await client.SendMailAsync(message);
Console.WriteLine("Отправлено асинхронно!");
}
3. Проблемы SmtpClient и альтернативы
Несмотря на простоту, SmtpClient имеет недостатки:
- Устаревший API (в .NET 5+ помечен как устаревший);
- Плохая поддержка современных протоколов аутентификации (OAuth2);
- Отсутствие встроенной поддержки S/MIME и расширенных сценариев.
Поэтому Microsoft рекомендует использовать сторонние библиотеки, такие как MailKit.
4. MailKit — современная библиотека для работы с email
MailKit — это кроссплатформенная библиотека с открытым исходным кодом. Она поддерживает SMTP, POP3, IMAP, SSL/TLS, асинхронность, OAuth2 и многое другое.
Установка через NuGet
dotnet add package MailKit
// или через Package Manager:
Install-Package MailKit
Пример отправки email с MailKit
using MailKit.Net.Smtp;
using MimeKit;
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Отправитель", "sender@example.com"));
message.To.Add(new MailboxAddress("Получатель", "recipient@example.com"));
message.Subject = "Письмо через MailKit";
var bodyBuilder = new BodyBuilder
{
HtmlBody = "<h1>Привет!</h1><p>Это HTML- Также в библиотеке
Авторизация и аутентификация в C++: библиотеки, примеры и реализация
Event Bus и паттерн Observer в PHP: реализация и примеры
Работа с XML в JavaScript (Node.js): библиотеки и примеры
React для JavaScript (Node.js): полное руководство с примерами
SwiftyUserDefaults для Swift: полное руководство с примерами