Дополнительные статьи

Отправка email в ASP.NET Core

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7

Последнее обновление: 15.03.2017

На данный момент .NET Core по умолчанию не предоставляет готового функционала для работы с протоколом SMTP, поэтому нам надо использовать сторонние решения, например, MailKit, SendGrid. Либо использовать зависимости полноценного .NET Framework в виде функциональности пространства имен System.Net.Smtp, но в этом случае мы уйдем от кроссплатформенности в строну одноплатформенного решения.

В данном случае мы будем использовать MailKit как наиболее простое и в то же время довольно насыщенное в плане функциональности решение. Для его установки добавим в проект через NuGet соответствующий пакет:

MailKit в ASP.NET Core

После сохранения файла project.json и добавления всех необходимых пакетов добавим в проект новый класс. Назовем его EmailService и определим в нем следующий код:

using MimeKit;
using MailKit.Net.Smtp;
using System.Threading.Tasks;
namespace SocialApp.Services
{
    public class EmailService
    {
        public async Task SendEmailAsync(string email, string subject, string message)
        {
            using var emailMessage = new MimeMessage();

            emailMessage.From.Add(new MailboxAddress("Администрация сайта", "login@yandex.ru"));
            emailMessage.To.Add(new MailboxAddress("", email));
            emailMessage.Subject = subject;
            emailMessage.Body = new TextPart(MimeKit.Text.TextFormat.Html)
            {
                Text = message
            };
            
            using (var client = new SmtpClient())
            {
                await client.ConnectAsync("smtp.yandex.ru", 25, false);
                await client.AuthenticateAsync("login@yandex.ru", "password");
                await client.SendAsync(emailMessage);

                await client.DisconnectAsync(true);
            }
        }
    }
}

В классе определен асинхронный метод SendEmailAsync(), который в качестве параметров принимает email получателя сообщения, тему письма и его текст.

Для создания объекта отправляемого сообщения используется класс MimeMessage. Для определения отправителя в его коллекцию From добавляется объект MailboxAddress. Теоретически может быть указано несколько отправителей.

Все получатели письма добавляются в коллекцию To также в виде объекта MailboxAddress.

Тело сообщения, которое представлено свойством Body, может представлять как простой текст, так и какое-то другое содержимое. Например, в данном случае указано, что сообщение будет иметь формат html.

Для простого текста мы могли бы указать:

emailMessage.Body = new TextPart("Plain")
{
    Text = message
};

Либо использовать значение MimeKit.Text.TextFormat.Plain.

Непосредственно отправление производится с помощью класса SmtpClient. Причем весь процесс разбивается на ряд этапов:

  1. Подключение к серверу

  2. Аутентификация (при ее необходимости)

  3. Собственно отправка сообщения

  4. Отключение

При подключении в метод ConnectAsync() передаются smtp-адрес сервера, номер порта, и логическое значение, указывающее, будет ли применяться SSL. В данном случае SSL не применяется, поэтому стоит значение false.

Для аутентификации в метод AuthenticateAsync() передаются наши логин и пароль на сервере.

Хотя здесь все методы асинхронные, но это необязательно. Мы можем использовать и синхронный API:

using (var client = new SmtpClient())
{
    client.Connect("smtp.yandex.ru", 25, false);
    client.Authenticate("login@yandex.ru", "password");
    client.Send(emailMessage);
	client.Disconnect(true);
}

После определения класса мы можем его использовать, например, в контроллере:

public class HomeController : Controller
{
	public async Task<IActionResult> SendMessage()
	{
		EmailService emailService = new EmailService();
		await emailService.SendEmailAsync("somemail@mail.ru", "Тема письма", "Тест письма: тест!");
		return RedirectToAction("Index");
	}
	
	//............................
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850