Avatar ·

Отправка email через Gmail SMTP в .NET: решение проблемы с паролем и настройками

Всем привет! Я новичок в C# и пытаюсь реализовать отправку писем через Gmail в своём приложении. Использую стандартный SmtpClient. Написал такой код: ```csharp using System.Net; using System.Net.Mail; var fromAddress = new MailAddress("myemail@gmail.com", "My Name"); var toAddress = new MailAddress("recipient@gmail.com", "Recipient"); const string fromPassword = "mypassword123"; 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, fromPassword) }; using (var message = new MailMessage(fromAddress, toAddress) { Subject = subject, Body = body }) { smtp.Send(message); } ``` Но при выполнении получаю ошибку: "5.5.1 Authentication Required" или "5.7.0 Username and Password not accepted". Я точно ввёл правильный пароль от Gmail. В чём может быть проблема? Нужно ли включать какие-то настройки в аккаунте Google? Или, может, есть более современный способ отправки почты в .NET? Слышал, что SmtpClient устарел. Подскажите, как правильно настроить отправку через Gmail в 2024 году. <<>>

Проблема и её корень

Ошибка аутентификации возникает не из-за вашего кода, а из-за изменений в политиках безопасности 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. Рекомендую этот вариант для всех новых проектов.