Отправляем email через Gmail в .NET: 4 подхода с кодом на C#

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

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

Начать курс

Почему отправка email через Gmail в .NET — это головная боль (и как её избежать)

Если вы когда-нибудь пытались настроить отправку писем через Gmail в своём .NET-приложении, то знаете: это та задача, которая выглядит просто, но превращается в квест. Вы пишете 10 строк кода, запускаете — и получаете SmtpException с загадочным текстом про "небезопасное приложение". Знакомо?

На Stack Overflow вопрос "Sending email in .NET through Gmail" собрал тысячи просмотров и сотни ответов. Люди годами бьются с этой проблемой. В этой статье мы разберём 4 реальных подхода на C#, от классики до современных решений, и выясним, какой из них стоит использовать в 2025 году.

Спойлер: тот код, который вы нашли в блоге 2015 года, скорее всего, уже не работает. Google постоянно ужесточает политики безопасности. Но не волнуйтесь — мы покажем рабочие варианты.

Подход 1: Классический SmtpClient (и почему он устарел)

Самый очевидный способ — использовать встроенный SmtpClient из System.Net.Mail. Вот как это выглядело в "золотые времена":

using System.Net;
using System.Net.Mail;

var message = new MailMessage("your@gmail.com", "recipient@example.com")
{
    Subject = "Тестовое письмо из .NET",
    Body = "Привет! Это тест."
};

using var client = new SmtpClient("smtp.gmail.com", 587)
{
    Credentials = new NetworkCredential("your@gmail.com", "your-password"),
    EnableSsl = true
};

client.Send(message);

В 2010-2015 годах это работало. Но сегодня Google заблокировал вход с обычным паролем для большинства аккаунтов. Вам потребуется:

  • Пароль приложения (App Password) — но только при включённой двухфакторной аутентификации
  • Или разрешить "доступ к небезопасным приложениям" — эту опцию Google уже удалил

Минусы подхода:

  • SmtpClient помечен как Obsolete в .NET 5+
  • Не поддерживает современные протоколы аутентификации (OAuth 2.0)
  • Пароль приложения живёт не вечно — его нужно обновлять вручную

Когда использовать: только для быстрых прототипов или внутренних инструментов, где безопасность не критична.

Подход 2: MailKit — современный и мощный

Если вы хотите промышленное решение, используйте библиотеку MailKit от разработчика Mono. Она не только работает, но и активно развивается.

Сначала установите пакет:

dotnet add package MailKit

Теперь код с использованием App Password:

using MailKit.Net.Smtp;
using MimeKit;

var message = new MimeMessage();
message.From.Add(new MailboxAddress("Ваше имя", "your@gmail.com"));
message.To.Add(new MailboxAddress("Получатель", "recipient@example.com"));
message.Subject = "Письмо через MailKit";
message.Body = new TextPart("plain") { Text = "Привет из .NET!" };

using var client = new SmtpClient();
await client.ConnectAsync("smtp.gmail.com", 587, MailKit.Security.SecureSocketOptions.StartTls);
await client.AuthenticateAsync("your@gmail.com", "ваш-пароль-приложения");
await client.SendAsync(message);
await client.DisconnectAsync(true);

Почему MailKit круче SmtpClient?

  • Асинхронные методы — не блокирует поток
  • Поддержка MIME, подписей, шифрования
  • Работает на всех платформах .NET (включая .NET MAUI и Unity)
  • Не помечен как устаревший

Но и у этого подхода есть ограничение: App Password — это временное решение. Если ваш аккаунт Google скомпрометируют, злоумышленник сможет отправлять письма от вашего имени.

Подход 3: Google API + OAuth 2.0 (для серьёзных проектов)

Самый правильный и безопасный способ — использовать Gmail API с OAuth 2.0. Да, это сложнее на этапе настройки, но зато:

  • Не нужно хранить пароли в коде
  • Можно отправлять до 100 писем в день бесплатно (с квотой)
  • Полный контроль над разрешениями

Шаг 1: Создайте проект в Google Cloud Console, включите Gmail API и скачайте credentials.json.

Шаг 2: Установите пакет:

dotnet add package Google.Apis.Gmail.v1

Шаг 3: Отправляем письмо через API:

using Google.Apis.Auth.OAuth2;
using Google.Apis.Gmail.v1;
using Google.Apis.Services;
using Google.Apis.Util.Store;
using System.Text;

// Аутентификация
var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(
    new ClientSecrets
    {
        ClientId = "ваш-client-id",
        ClientSecret = "ваш-client-secret"
    },
    new[] { GmailService.Scope.GmailSend },
    "user",
    CancellationToken.None,
    new FileDataStore("Gmail.Auth"));

// Создаём сервис
var service = new GmailService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "My .NET App"
});

// Формируем письмо
var email = new
{
    To = "recipient@example.com",
    Subject = "Письмо через Gmail API",
    Body = "Привет из .NET!"
};

var mimeMessage = $"From: your@gmail.com\r\n" +
                  $"To: {email.To}\r\n" +
                  $"Subject: {email.Subject}\r\n" +
                  $"Content-Type: text/plain; charset=utf-8\r\n\r\n" +
                  $"{email.Body}";

var encodedMessage = Convert.ToBase64String(Encoding.UTF8.GetBytes(mimeMessage))
    .Replace('+', '-')
    .Replace('/', '_')
    .Replace("=", "");

var message = new Google.Apis.Gmail.v1.Data.Message
{
    Raw = encodedMessage
};

await service.Users.Messages.Send(message, "me").ExecuteAsync();

Важно: Первый раз пользователь увидит окно браузера для подтверждения доступа. В продакшене используйте сервисный аккаунт или сохраняйте refresh token.

Подход 4: .NET 8+ и System.Net.Mail (обновлённая версия)

В .NET 8 Microsoft обновила работу с SMTP, добавив поддержку современных механизмов аутентификации. Хотя SmtpClient всё ещё помечен как устаревший, вы можете использовать Microsoft.Data.SqlClient или FluentEmail — обёртки, которые решают многие проблемы.

Пример с FluentEmail (установите FluentEmail.Smtp):

using FluentEmail.Smtp;
using System.Net;
using System.Net                

Блоги

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