Отправка email через Gmail SMTP в .NET: решение проблемы с паролем и настройками
Проблема и её корень
Ошибка аутентификации возникает не из-за вашего кода, а из-за изменений в политиках безопасности Google. Начиная с мая 2022 года, Google запретил вход в приложения с помощью обычного пароля — требуется использование пароля приложения (App Password) или OAuth 2.0. Кроме того, в вашем аккаунте должна быть включена двухфакторная аутентификация (2FA).
Пошаговое решение
Шаг 1. Включите двухфакторную аутентификацию в Google
Перейдите в Настройки безопасности Google → «Вход в аккаунт Google» → «Двухэтапная аутентификация» и включите её. Это обязательное условие.
Шаг 2. Создайте пароль приложения
- Зайдите в Пароли приложений Google (если ссылка не работает — найдите в поиске настроек «Пароли приложений»).
- Выберите «Почта» и «Windows Computer» (или другое устройство).
- Google сгенерирует 16-символьный пароль вида
xxxx xxxx xxxx xxxx— скопируйте его. - Важно: используйте именно этот пароль, а не ваш обычный пароль от Gmail.
Шаг 3. Используйте правильные настройки SMTP
Обновите ваш код, заменив fromPassword на сгенерированный пароль приложения:
using System.Net;
using System.Net.Mail;
var fromAddress = new MailAddress("your-email@gmail.com", "Your Name");
var toAddress = new MailAddress("recipient@example.com", "Recipient");
const string appPassword = "xxxx xxxx xxxx xxxx"; // ваш пароль приложения
const string subject = "Test";
const string body = "Hello from C#!";
var smtp = new SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(fromAddress.Address, appPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body
})
{
try
{
smtp.Send(message);
Console.WriteLine("Email sent successfully!");
}
catch (SmtpException ex)
{
Console.WriteLine($"SMTP error: {ex.StatusCode} - {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"General error: {ex.Message}");
}
}
Рекомендации по безопасности
- Никогда не храните пароли в коде — используйте
appsettings.jsonс шифрованием, переменные окружения или Azure Key Vault. - Для продакшена рассмотрите использование OAuth 2.0 (через библиотеку MailKit) — это более безопасный и гибкий подход.
SmtpClientдействительно устарел (начиная с .NET 6), но пока работает. Для новых проектов рекомендуется MailKit (см. альтернативный ответ).
Дополнительные проверки
- Убедитесь, что в настройках Gmail не включены ограничения на доступ к менее защищённым приложениям (эта опция уже удалена Google, но если она есть — отключите).
- Проверьте, не блокирует ли ваш брандмауэр или антивирус порт 587.
- Если используете .NET Framework, добавьте в
app.configстроку:<system.net><mailSettings><smtp deliveryMethod="Network" from="your-email@gmail.com"><network host="smtp.gmail.com" port="587" enableSsl="true" userName="your-email@gmail.com" password="app-password"/></smtp></mailSettings></system.net>.
После выполнения этих шагов письмо должно успешно отправиться. Если ошибка сохраняется — проверьте правильность копирования пароля приложения (пробелы в нём не учитываются).
<<Альтернативный подход: использование MailKit
Библиотека MailKit (NuGet: MailKit) — современная замена устаревшему SmtpClient. Она поддерживает OAuth 2.0, лучшую обработку ошибок и работает быстрее. Пример для Gmail с паролем приложения:
using MailKit.Net.Smtp;
using MimeKit;
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Your Name", "your-email@gmail.com"));
message.To.Add(new MailboxAddress("Recipient", "recipient@example.com"));
message.Subject = "Test";
message.Body = new TextPart("plain") { Text = "Hello from MailKit!" };
using (var client = new SmtpClient())
{
await client.ConnectAsync("smtp.gmail.com", 587, MailKit.Security.SecureSocketOptions.StartTls);
await client.AuthenticateAsync("your-email@gmail.com", "app-password");
await client.SendAsync(message);
await client.DisconnectAsync(true);
}
Преимущества MailKit
- Полная поддержка async/await (не блокирует поток).
- Встроенная поддержка OAuth 2.0 (для корпоративных аккаунтов Google Workspace).
- Более информативные исключения при ошибках SMTP.
- Активно поддерживается и обновляется.
Для установки: dotnet add package MailKit. Рекомендую этот вариант для всех новых проектов.
Ответов пока нет.
Войдите чтобы оставить ответ