Реализуем отправку Email-сообщений двумя способами:
- вариант с использованием системного класса SmtpClient;
- вариант с использованием популярного стороннего решения MailKit;
- в качестве почтового сервера будем использовать сервис Google.
Для начала нам необходимо иметь под рукой готовый к работе аккаунт Google. И здесь есть два нюанса.
Во-первых, в настройках безопасности необходимо разрешить доступ к ненадежным приложениям (Google считает наш сайт ненадежным приложением).
Во-вторых, когда наш сайт будет использовать данные от аккаунта (логин и пароль) для отправки email-сообщений, Google также может посчитать, что выполняется вход с подозрительного устройства. Если это произойдет, то нужно вручную зайти в аккаунт через браузер и подтвердить, что устройство является доверенным и нужно разрешать ему вход под указанными учетными данными.
Далее в среде разработки Visual Studio через Nuget-менеджер добавим к нашему проекту пакет MailKit.
После этого создадим условный класс Service, в котором будет два метода для отправки сообщения, используя системный подход, и используя библиотеку MailKit.
public class Service
{
private readonly ILogger<Service> logger;
public Service(ILogger<Service> logger)
{
this.logger = logger;
}
//System.Net.Mail.SmtpClient
public void SendEmailDefault()
{
try
{
System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
message.IsBodyHtml = true; //тело сообщения в формате HTML
message.From = new MailAddress("admin@mycompany.com", "Моя компания"); //отправитель сообщения
message.To.Add("mail@yandex.ru"); //адресат сообщения
message.Subject = "Сообщение от System.Net.Mail"; //тема сообщения
message.Body = "<div style=\"color: red;\">Сообщение от System.Net.Mail</div>"; //тело сообщения
message.Attachments.Add(new Attachment("... путь к файлу ...")); //добавить вложение к письму при необходимости
using (System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("smtp.gmail.com")) //используем сервера Google
{
client.Credentials = new NetworkCredential("mail@gmail.com", "secret"); //логин-пароль от аккаунта
client.Port = 587; //порт 587 либо 465
client.EnableSsl = true; //SSL обязательно
client.Send(message);
logger.LogInformation("Сообщение отправлено успешно!");
}
}
catch (Exception e)
{
logger.LogError(e.GetBaseException().Message);
}
}
//MailKit.Net.Smtp.SmtpClient
public void SendEmailCustom()
{
try
{
MimeMessage message = new MimeMessage();
message.From.Add(new MailboxAddress("Моя компания", "admin@mycompany.com")); //отправитель сообщения
message.To.Add(new MailboxAddress("mail@yandex.ru")); //адресат сообщения
message.Subject = "Сообщение от MailKit"; //тема сообщения
message.Body = new BodyBuilder() { HtmlBody = "<div style=\"color: green;\">Сообщение от MailKit</div>" }.ToMessageBody(); //тело сообщения (так же в формате HTML)
using (MailKit.Net.Smtp.SmtpClient client = new MailKit.Net.Smtp.SmtpClient())
{
client.Connect("smtp.gmail.com", 587, true); //либо использум порт 465
client.Authenticate("mail@gmail.com", "secret"); //логин-пароль от аккаунта
client.Send(message);
client.Disconnect(true);
logger.LogInformation("Сообщение отправлено успешно!");
}
}
catch (Exception e)
{
logger.LogError(e.GetBaseException().Message);
}
}
}
Важно! Стандартный системный класс System.Net.Mail.SmtpClient не рекомендуется использовать в новых .NET Core проектах. Этот класс является портом с .NET Framework для совместимости с существующим кодом. Однако этот класс не поддерживает многие современные протоколы. В определении класса он также помечен как устаревший (obsolete). Вместо этого рекомендуется использовать сторонние решения, как, например, MailKit.