Посыл почты с Gmail после 30 мая(отключение небезопасных методов) .NETCore
До 30 мая я пользовался Gmail для отправки письма с подтверждением со своего сайта.
Выглядело это примерно вот так
public static async Task<bool> SendEmail(string email, string subject, string body)
{
var fromAddress = new MailAddress("[email protected]", "Регистрация");
var toAddress = new MailAddress(email);
const string fromPassword = "securepass";
var smtp = new System.Net.Mail.SmtpClient
{
UseDefaultCredentials = false,
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword),
Timeout = 20000
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body,
})
{
await smtp.SendMailAsync(message);
}
return true;
}
Как видно, использовалась пара mail-пароль для входа. Но с 30 мая гугл отключил этот "небезопасный способ" и теперь надо авторизоваться как то безопасно.
Сам гугл говорит что надо через Oauth2 и consent screen, но это же сервисы для конечного пользователя, когда ты указываешь свою гугл почту и гугл тебе разрешает доступ.
А мне так не надо, мне надо именно со своего .NETCore приложения просто отослать письмо с моей почты на какую то другую, конечный юзер доступа к почте не имеет. Как это сделать?
Ответы (1 шт):
Как писал @EvgeniyZ, дело было в паролях приложения.
Последовательность действий (частично стало понятно отсюда Доступ ненадежным приложениям при отправке почты с помощью Gmail)
1)Включаем в акке, с которого хотим почту слать, двухэтапную аутентификацию - с присылом смс например.
https://support.google.com/accounts/answer/185839
2)Генерируем пароль приложения в аккаунте https://security.google.com/settings/security/apppasswords
Он выглядит как то так "srnyyvqajocnsvdp"
3)И самое главное, то, чего нет в вышеуказанных руководствах - используем этот пароль для доступа в почту точно так же как ранее использовали обычный пароль!
Итоговый код выглядит вот так
public static async Task<bool> SendEmail(string email, string subject, string body)
{
var fromAddress = new MailAddress("[email protected]", "Регистрация");
var toAddress = new MailAddress(email);
const string fromPassword = "srnyyvqajocnsvdp"; <- ВОТ ЭТА СТРОЧКА ПОМЕНЯЛАСЬ!
var smtp = new System.Net.Mail.SmtpClient
{
UseDefaultCredentials = false,
Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new NetworkCredential(fromAddress.Address, fromPassword),
Timeout = 20000
};
using (var message = new MailMessage(fromAddress, toAddress)
{
Subject = subject,
Body = body,
})
{
await smtp.SendMailAsync(message);
}
return true;
}