Отправка Email на C# (.NET): полное руководство по System.Net.Mail
В современной разработке на платформе .NET задача отправки электронных писем решается стандартной библиотекой System.Net.Mail. Этот встроенный инструмент не требует установки дополнительных пакетов NuGet и предоставляет гибкий API для создания и отправки почтовых сообщений через SMTP-сервер. В данной статье мы подробно разберём все ключевые компоненты библиотеки, рассмотрим примеры кода, обработку ошибок и лучшие практики.
Основные классы библиотеки
Библиотека System.Net.Mail включает три главных класса:
SmtpClient— отвечает за подключение к SMTP-серверу и отправку сообщений.MailMessage— представляет само письмо: тему, тело, отправителя, получателей, вложения.Attachment— позволяет добавлять к письму файлы.
Базовый пример отправки Email
Рассмотрим простейший сценарий: отправка текстового письма через SMTP-сервер Gmail. Обратите внимание, что для работы с Gmail потребуется пароль приложения (App Password) из-за двухфакторной аутентификации.
using System;
using System.Net;
using System.Net.Mail;
class Program
{
static void Main()
{
var fromAddress = new MailAddress("your@gmail.com", "Ваше Имя");
var toAddress = new MailAddress("recipient@example.com", "Получатель");
const string fromPassword = "ваш_пароль_приложения";
const string subject = "Тестовое письмо из .NET";
const string body = "Привет! Это письмо отправлено с помощью C#.";
var smtp = new SmtpClient
{
Host = "smtp.gmail.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);
}
Console.WriteLine("Письмо отправлено!");
}
}
Отправка HTML-писем с вложениями
Часто требуется отправить письмо в формате HTML с прикреплёнными файлами. Для этого установите свойство IsBodyHtml = true и используйте коллекцию Attachments.
using (var message = new MailMessage(fromAddress, toAddress))
{
message.Subject = "Отчёт за месяц";
message.IsBodyHtml = true;
message.Body = "<h2>Здравствуйте!</h2><p>Ваш отчёт во вложении.</p>";
// Добавляем вложение
var attachment = new Attachment(@"C:\reports\report.pdf");
message.Attachments.Add(attachment);
smtp.Send(message);
}
Асинхронная отправка (async/await)
Для неблокирующей отправки в современных приложениях используйте SendMailAsync. Это особенно важно в веб-приложениях (ASP.NET Core) и десктопных программах с UI.
public async Task SendEmailAsync()
{
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = "Асинхронная отправка",
Body = "Письмо отправлено асинхронно"
})
{
await smtp.SendMailAsync(message);
}
}
Обработка исключений
При работе с почтовыми серверами возможны ошибки: неверные учётные данные, таймауты, проблемы с DNS. Всегда оборачивайте отправку в try-catch.
try
{
smtp.Send(message);
Console.WriteLine("Успешно отправлено.");
}
catch (SmtpException ex)
{
Console.WriteLine($"SMTP ошибка: {ex.StatusCode} - {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"Общая ошибка: {ex.Message}");
}
Настройка SMTP для популярных провайдеров
В таблице ниже приведены параметры для распространённых почтовых сервисов (используйте их в свойствах SmtpClient).
- Gmail: Host = smtp.gmail.com, Port = 587, SSL = true (требуется пароль приложения)
- Yandex: Host = smtp.yandex.ru, Port = 465, SSL = true
- Mail.ru: Host = smtp.mail.ru, Port = 465, SSL = true
- Outlook/Hotmail: Host = smtp-mail.outlook.com, Port = 587, SSL = true
Лучшие практики
Чтобы ваш код был надёжным и безопасным, следуйте этим рекомендациям:
- Никогда