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
esfalse
no es necesario tener la propiedadHtmlUri
, caso de que seatrue
no es necesario tener la propiedadBody
. - 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 entrue
. - 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);