Adfines.Net.Zumbi es un paquete NuGet diseñado para simplificar y optimizar el envío de correos electrónicos en aplicaciones .NET 5+. Ofrece funcionalidades avanzadas para el envío individual y masivo de correos, con soporte para envío paralelo, cifrado de credenciales, logging de errores y manejo de adjuntos.
dotnet add package Adfines.Net.Zumbi
using Adfines.Net.Zumbi;
// Para encriptar contraseñas (cuando encrypt = true)
string passwordEncriptado = Password.E("Hola mundo");
Console.WriteLine(passwordEncriptado);
// El valor retornado es el que se debe colocar en Password cuando encrypt es true
var zum = new ZumMail(
x: "smtp.office365.com", // URL del servidor SMTP
port: 587, // Puerto del servidor
email: "correo@ejemplo.com", // Email remitente
password: "SbBW2UXX83XHhG9Wr/tVQ4sGZ2B7S9zBAJvtOMfkM/k=", // Contraseña (encriptada)
ssl: true, // Habilitar SSL (opcional, default: false)
tls: true, // Habilitar TLS (opcional, default: false)
html: true, // Cuerpo en HTML (opcional, default: false)
log: true, // Habilitar logging (opcional, default: false)
dateTimeTitle: true, // Agregar fecha/hora al título (opcional, default: false)
encrypt: true // Contraseña encriptada (opcional, default: false)
);
var zum = new ZumMail("ejemplo");
appsettings.json:
{
"AdfinesZumbiNet": {
"ejemplo": {
"Url": "smtp.office365.com",
"Port": 587,
"Email": "correo@ejemplo.com",
"Password": "SbBW2UXX83XHhG9Wr/tVQ4sGZ2B7S9zBAJvtOMfkM/k=",
"Ssl": true,
"Tls": true,
"Html": true,
"Log": true,
"DateTimeTitle": true,
"Encrypt": true
}
}
}
// Generar UUID para tracking
var messageCode = Guid.NewGuid().ToString();
// Enviar correo individual
zum.SendMail(
mask: "Nombre Remitente", // Nombre que aparece como remitente
mailTo: ["destinatario1@ejemplo.com", "destinatario2@ejemplo.com"], // Lista de destinatarios
mailCo: ["copiaoculta@ejemplo.com"], // Copias ocultas (CC)
title: "Asunto del Correo", // Asunto del correo
body: "<h1>Contenido del Correo</h1>", // Cuerpo del correo (HTML o texto)
attachment: null, // Ruta a archivo adjunto (opcional)
uuid: messageCode // ID único para tracking
);
var mail = new ZumMailList()
{
Uuid = Guid.NewGuid().ToString(),
Mask = "Nombre Remitente",
Title = "Asunto del Correo",
Body = "<h1>Contenido del Correo</h1>",
};
mail.MailTo.Add("destinatario1@ejemplo.com");
mail.MailTo.Add("destinatario2@ejemplo.com");
mail.MailCo.Add("copiaoculta@ejemplo.com");
var mail2 = new ZumMailList(
to: ["destinatario1@ejemplo.com", "destinatario2@ejemplo.com"], // Destinatarios
co: ["copiaoculta@ejemplo.com"], // Copias ocultas
attachment: null // Adjunto
)
{
Uuid = Guid.NewGuid().ToString(),
Mask = "Nombre Remitente",
Title = "Asunto del Correo",
Body = "<h1>Contenido del Correo</h1>",
};
var mails = new List<ZumMailList>()
{
mail,
mail2,
new ZumMailList(
to: ["destinatario3@ejemplo.com", "destinatario4@ejemplo.com"],
co: ["copiaoculta2@ejemplo.com"],
attachment: null
)
{
Uuid = Guid.NewGuid().ToString(),
Mask = "Nombre Remitente",
Title = "Asunto del Correo",
Body = "<h1>Contenido del Correo</h1>",
}
};
// Enviar correos en paralelo
// Segundo parámetro: grado de paralelismo
// 2 = envía de 2 en 2 correos
// 0 = envía todos los correos simultáneamente
zum.SendMail(mails, 2);
// Revisar todos los errores ocurridos
foreach (var error in zum.Errs)
{
Console.WriteLine($@"
Hubo un problema:
Codigo Unico: {error.Uuid}
Razon: {error.Reason}
Mensaje: {error.Message}
Excepcion (error): {error.Exception}
");
}
// Limpiar el historial de errores
zum.Errs.Clear();
| Parámetro | Tipo | Descripción |
|---|---|---|
to | IEnumerable<string> | Lista de destinatarios |
co | IEnumerable<string> | Lista de copias ocultas |
attachment | string | Ruta al archivo adjunto |
| Propiedad | Tipo | Descripción |
|---|---|---|
Uuid | string | Identificador único del correo |
Mask | string | Nombre del remitente que se muestra |
Title | string | Asunto del correo |
Body | string | Cuerpo del correo (HTML/texto) |
MailTo | List<string> | Lista de destinatarios |
MailCo | List<string> | Lista de copias ocultas |
Attachment | string | Ruta al archivo adjunto |
| Propiedad | Tipo | Descripción |
|---|---|---|
Uuid | string | UUID del correo que falló |
Reason | string | Razón del error |
Message | string | Mensaje de error descriptivo |
Exception | Exception | Excepción completa generada |
var zum = new ZumMail(
x: "smtp.gmail.com",
port: 587,
email: "notificaciones@empresa.com",
password: Password.E("MiContraseñaSegura"),
ssl: true,
tls: true,
html: true,
log: true,
encrypt: true
);
// Preparar notificaciones para todos los usuarios
var notificaciones = new List<ZumMailList>();
foreach (var usuario in listaUsuarios)
{
notificaciones.Add(new ZumMailList(
to: [usuario.Email],
co: null,
attachment: null
)
{
Uuid = Guid.NewGuid().ToString(),
Mask = "Sistema de Notificaciones",
Title = $"Nueva actualización - {DateTime.Now:dd/MM/yyyy}",
Body = $@"
<h1>Hola {usuario.Nombre}</h1>
<p>Tenemos nuevas actualizaciones disponibles.</p>
<p>Visita nuestro portal para más información.</p>
"
});
}
// Enviar notificaciones en paralelo (5 a la vez)
zum.SendMail(notificaciones, 5);
// Revisar errores
if (zum.Errs.Any())
{
Console.WriteLine($"Errores: {zum.Errs.Count}");
foreach (var error in zum.Errs)
{
// Registrar en sistema de logging
Log.Error($"Error enviando correo {error.Uuid}: {error.Message}");
}
// Limpiar después de procesar
zum.Errs.Clear();
}
var messageCode = Guid.NewGuid().ToString();
var rutaAdjunto = @"C:\Documentos\Reporte.pdf";
zum.SendMail(
mask: "Departamento de Finanzas",
mailTo: ["contabilidad@empresa.com"],
mailCo: ["gerencia@empresa.com"],
title: "Reporte Mensual",
body: @"
<h2>Reporte Financiero</h2>
<p>Adjunto encontrarás el reporte del mes.</p>
<p>Saludos,<br/>Finanzas</p>
",
attachment: rutaAdjunto,
uuid: messageCode
);
var newsletter = new List<ZumMailList>();
// Agregar múltiples suscriptores
foreach (var suscriptor in suscriptores)
{
newsletter.Add(new ZumMailList(
to: [suscriptor.Email],
co: ["marketing@empresa.com"],
attachment: @"C:\Newsletters\semanal.pdf"
)
{
Uuid = Guid.NewGuid().ToString(),
Mask = "Equipo de Marketing",
Title = $"Newsletter Semanal - {DateTime.Now:MMMM yyyy}",
Body = $@"
<h1>¡Hola {suscriptor.Nombre}!</h1>
<p>Aquí tienes nuestro newsletter semanal con las últimas novedades.</p>
<p>No dudes en contactarnos si tienes preguntas.</p>
"
});
}
// Enviar newsletter a todos los suscriptores
zum.SendMail(newsletter, 10); // 10 correos en paralelo
Cualquier servidor SMTP estándar:
smtp.office365.comsmtp.gmail.comsmtp-mail.outlook.comPassword.E("su-contraseña") para obtener la versión encriptadaencrypt: true en la configuraciónpasswordSí, establezca log: false en la configuración. Esto evitará que se acumulen errores en zum.Errs.
zum.Errszum.Errs después del envío para procesar los fallosssl: true y tls: trueencrypt: true en entornos de producciónzum.Errs para detectar problemas de autenticaciónzum.Errs.Clear() para evitar acumulación de memoria