Saltar a contenido

EmailSender

Overview

Esta librería se creó con el objetivo de facilitar a los desarrolladores usar envios de emails en sus proyectos, con una simple configuración y teniendo la posibilidad de enviar un html como body.

Como configurar EmailSender

Para configurar la librería debemos tener las siguientes environments en nuestros appsetting:

SmtpConfiguration:
  Host: "localhost"
  Port: '25'

EmailFields:
  From: no-reply-desa@andreani.com
  ToAddresses:
      - usuario1@gmail.com
      - usuario2@gmail.com
  ToCC: 
      - usuario@andreani.com
  Subject: Subject
  HtmlUri: ./Views/prueba.html
  IsBodyHtml: false
  Body: Esto es una prueba

Resilience:
  EmailSendRetryCount: '3'
  EmailSendDurationOfBreak: '30'
{
"SmtpConfiguration": {
    "Host": "localhost",
    "Port": 25
},
"EmailFields": {
    "From": "no-reply-desa@andreani.com",
    "ToAddresses": [
    "usuario1@gmail.com",
    "usuario2@gmail.com"
    ],
    "ToCC": [
    "usuario3@gmail.com"
    ],
    "Subject": "Subject",
    "HtmlUri": "./Views/prueba.html",
    "IsBodyHtml":"false",
    "Body":"Esto es un mensaje."
},
"Resilience": {
    "EmailSendRetryCount": 3,
    "EmailSendDurationOfBreak": 30
}
}
Propiedades Description
SmtpConfiguration:Host El host del servidor smtp que va a usar la librería
SmtpConfiguration:Port El puerto del servidor smtp que va a usar la librería
EmailFields:From La direción de mail remitente
EmailFields:ToAddresses Las direciones de mail destinatarios
EmailFields:ToCC Las direciones de mail destinatarios con copia oculta
EmailFields:Subject El asunto del mail
EmailFields:IsBodyHtml Esta propiedad se utiliza para habilitar html en el cuerpo del mail
EmailFields:HtmlUri Esta propiedad se utiliza en caso de tener habilitado html en el cuerpo del mail, para especificar la ruta de nuestro html
EmailFields:Body Esta propiedad se utiliza en el caso de que IsBodyHtml este en false, para enviar un texto en el cuerpo del mail
Resilience:EmailSendRetryCount Esta propiedad indica la cantidad de veces que va a reintentar enviar el mail en caso de que algo falle en el proceso
Resilience:EmailSendDurationOfBreak Esta propiedad indica cada cuanto tiempo va a reintentar enviar el mail en caso de que algo falle en el proceso

Notas

  • Si la propiedad IsBodyHtml es false no es necesario tener la propiedad HtmlUri, caso de que sea true no es necesario tener la propiedad Body.
  • No es necesario tener la propiedad ToCC en caso de no querer enviar con copia oculta.
  • El resto de los campos son obligatorios

Luego de tener bien configuradas las environments, nos dirigimos a bootstrap de la capa de Infrastructure y agregamos la siguiente linea:

 public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)
    {
        var connection = configuration.GetSection("DataAccessRegistry").Get<ConfigurationOption>();

        services.AddCQRS<ApplicationDbContext>(configuration);

        services.AddScoped<ApplicationDbContext>();

        services.AddEmailSender();

        return services;
    }

Como enviar un mail

Para poder enviar un mail necesitamos una variable de tipo INotifierService, luego se inyecta por el constructor y se utiliza el metodo Task SentEmail(EmailFields? emailFields = null, params string?[] values), a continuación mostramos un ejemplo de como enviar un mail con los datos de las environments:

public class WorkerServices : BackgroundService
    {
        private readonly ILogger<WorkerServices> _logger;
        private readonly INotifierService _notifier;

        public WorkerServices(ILogger<WorkerServices> logger, INotifierService notifierService)
        {
            _logger = logger;
            _notifier = notifierService;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            await _notifier.SendEmail();
        }
    }
public class WorkerServices : BackgroundService
    {
        private readonly ILogger<WorkerServices> _logger;
        private readonly INotifierService _notifier;

        public WorkerServices(ILogger<WorkerServices> logger, INotifierService notifierService)
        {
            _logger = logger;
            _notifier = notifierService;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            await _notifier.SendEmail(emailFields: new() 
            {
                Body = "Hola", 
                Subject = "Hola",
                ToAddresses = new List<string>() { "usuario1@gmail.com", "usuario2@gmail.com" },
                From = "no-reply-desa@andreani.com",
                ToCC = new List<string>(){ "usuario@andreani.com" },
                IsBodyHtml = true,
                HtmlUri = "./Views/prueba.html"

            });
        }
    }

Notas

El método SendEmail también puede recibir una variable de tipo EmailFields que es optional, pero en caso de pasarselo esté tendrá prioridad sobre los valores en las environments, o sea si usa este paramatro no es necesario tener las environment EmailFields, pero debe asegurarse de que tenga todos los campos obligatorios con datos correctos.

Como enviar un mail con Html

Para enviar un mail con Html debemos usar INotifierService como se muestra en ejemplos anteriores,tenemos que crear y/o agregar un html a nuestro proyecto y luego asegurarnos de cumplir con las siguientes condiciones:

  • La propiedad IsBodyHtml debe estar en true.
  • La propiedad HtmlUri debe tener la ruta de nuestro html.

cumpliendo las condiciones anteriones podemos ejecutar el método SendEmail y le librería se encarga del resto.

Otra posiblilidad que te brinda la librería es el poder agregarle valores al Html desde la aplicación, a continuación mostramos un ejemplo:

public class WorkerServices : BackgroundService
    {
        private readonly ILogger<WorkerServices> _logger;
        private readonly INotifierService _notifier;

        public WorkerServices(ILogger<WorkerServices> logger, INotifierService notifierService)
        {
            _logger = logger;
            _notifier = notifierService;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            await _notifier.SendEmail(values:"Dato1", "2");
        }
    }
public class WorkerServices : BackgroundService
    {
        private readonly ILogger<WorkerServices> _logger;
        private readonly INotifierService _notifier;

        public WorkerServices(ILogger<WorkerServices> logger, INotifierService notifierService)
        {
            _logger = logger;
            _notifier = notifierService;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            await _notifier.SendEmail(emailFields: new() 
            {
                Body = "Hola", 
                Subject = "Hola",
                ToAddresses = new List<string>() { "usuario1@gmail.com", "usuario2@gmail.com" },
                From = "no-reply-desa@andreani.com",
                ToCC = new List<string>(){ "usuario@andreani.com" },
                IsBodyHtml = true,
                HtmlUri = "./Views/prueba.html"

            },values:"Dato1", "2");
        }
    }

Notas

La funcionalidad de pasarle valores al html usa de fondo la función string.Format() que recibe un string con número entre llaves ({0}) y los parametros Object[], ejemplo:

    Decimal pricePerOunce = 17.36m;
    String s = String.Format("The current price is {0} per ounce.",
                     pricePerOunce);
Para más información pueden ir a String.Format Method.