Отправка Email на C# (.NET) с помощью SmtpClient и MailKit

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Отправка 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                    

Рекомендаций