Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core 7
На данный момент .NET Core по умолчанию не предоставляет готового функционала для работы с протоколом SMTP, поэтому нам надо использовать сторонние решения, например, MailKit, SendGrid. Либо использовать зависимости полноценного .NET Framework в виде функциональности пространства имен System.Net.Smtp, но в этом случае мы уйдем от кроссплатформенности в строну одноплатформенного решения.
В данном случае мы будем использовать MailKit как наиболее простое и в то же время довольно насыщенное в плане функциональности решение. Для его установки добавим в проект через NuGet соответствующий пакет:
После сохранения файла 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
. Причем весь процесс разбивается на ряд этапов:
Подключение к серверу
Аутентификация (при ее необходимости)
Собственно отправка сообщения
Отключение
При подключении в метод 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"); } //............................ }