Как отправить Email в приложении ASP.NET Core MVC

Дата публикации: 24.01.2020. Категория: ASP.NET Core MVC
Последнее обновление: 25.01.2020

Здесь мы затронем такую тему, как отправка Email-сообщений в стандартном ASP.NET Core MVC приложении.

Реализуем отправку Email-сообщений двумя способами:

  • вариант с использованием системного класса SmtpClient;
  • вариант с использованием популярного стороннего решения MailKit;
  • в качестве почтового сервера будем использовать сервис Google.

Для начала нам необходимо иметь под рукой готовый к работе аккаунт Google. И здесь есть два нюанса.

Во-первых, в настройках безопасности необходимо разрешить доступ к ненадежным приложениям (Google считает наш сайт ненадежным приложением).

Ненадежные приложения, у которых есть доступ к аккаунту
Ненадежные приложения, у которых есть доступ к аккаунту

Во-вторых, когда наш сайт будет использовать данные от аккаунта (логин и пароль) для отправки email-сообщений, Google также может посчитать, что выполняется вход с подозрительного устройства. Если это произойдет, то нужно вручную зайти в аккаунт через браузер и подтвердить, что устройство является доверенным и нужно разрешать ему вход под указанными учетными данными.

Наш рабочий компьютер не является подозрительным устройством
Наш рабочий компьютер не является подозрительным устройством

Далее в среде разработки Visual Studio через Nuget-менеджер добавим к нашему проекту пакет MailKit.

Добавление пакета MailKit в проект
Добавление пакета MailKit в проект
MailKit - это популярная open-source библиотека для отправки email-сообщений. Есть поддержка .NET Framework и .NET Core MVC-проектов.

После этого создадим условный класс Service, в котором будет два метода для отправки сообщения, используя системный подход, и используя библиотеку MailKit.

Service.cs
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.

Вернуться наверх
наверх