Cómo enviar mails con MailKit

Cómo enviar mails con MailKit

Muchas veces (o la gran mayoría) nos encontramos que nuestra aplicación nececesita enviar mails de interacción con el usuario, creo que hasta ese punto no hay problema alguno, ya que hay diferentes librerías que nos ayudan con este cometido. Pero nos podemos encontrar con un gran obstáculo, la "multiplataforma". Para ello les presento a MailKit y MimeKit, que es totalmente open source y un popular framework de .net

Generar web api

dotnet new webapi

Instalación de paquete

dotnet add package MailKit --version 2.10.0

Modificación de appsettings.json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "Mailer": {
    "MailFrom": "mail@server.com",
    "Subject": "subject",
    "Server": "server.com",
    "Port": 465,
    "User": "usuario",
    "Password": "password"
  }
}

Creación de servicio

using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;
using MailKit.Net.Smtp;
using MimeKit;

namespace Api.Services
{
    public class Mailer
    {
        private readonly IConfiguration _config;
        private string _mailFrom = String.Empty;
        private string _subject = String.Empty;
        private string _server = String.Empty;
        private int _port = 0;
        private string _user = String.Empty;
        private string _password = String.Empty;

        public Mailer(IConfiguration config)
        {
            _config = config;
            _mailFrom = _config.GetValue<string>("Mailer:MailFrom");
            _subject = _config.GetValue<string>("Mailer:Subject");
            _server = _config.GetValue<string>("Mailer:Server");
            _port = _config.GetValue<int>("Mailer:Port");
            _user = _config.GetValue<string>("Mailer:User");
            _password = _config.GetValue<string>("Mailer:Password");
        }

        public void SendMail(string mailTo, string mailBody)
        {
            var email = new MimeMessage();
            email.From.Add(MailboxAddress.Parse(_mailFrom));
            email.Subject = _subject;
            email.To.Add(MailboxAddress.Parse(mailTo));
            email.Body = new TextPart(MimeKit.Text.TextFormat.Html) { Text = mailBody };

            using var smtp = new SmtpClient();
            smtp.Connect(_server, _port);
            smtp.Authenticate(_user, _password);
            smtp.Send(email);
            smtp.Disconnect(true);
        }
    }
}

Llamar al servicio

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Api.Services;

namespace Api.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private IConfiguration _config;
        private static readonly string[] Summaries = new[]
        {
            "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering",  "Scorching"
        };

        public WeatherForecastController(IConfiguration config)
        {
            _config = config;
        }

        [HttpGet]
        public IEnumerable<WeatherForecast> Get()
        {
            Mailer mailer = new Mailer(_config);
            mailer.SendMail("mail@server.com", "<h2>Lorem</h2>");

            var rng = new Random();
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateTime.Now.AddDays(index),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}

Ejecución

dotnet run