Почему отправка 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