Envío de correo electrónico en C# con FluentEmail
El envío de correos electrónicos transaccionales en C# es una necesidad común en muchas soluciones de software empresarial. Sin embargo, como explica Tim Corey en su vídeo "Enviar correo electrónico en C# con FluentEmail", este proceso no tiene por qué ser difícil. Si desea enviar mensajes de texto sencillos, correos electrónicos HTML o gestionar correos masivos, FluentEmail ofrece una forma sencilla de implementar la funcionalidad de envío de correos electrónicos utilizando métodos modernos y protocolos smtp.
En este artículo, recorreremos el proceso siguiendo el vídeo de Tim Corey, para aprender completamente cómo enviar correos electrónicos en C# utilizando FluentEmail, configurar un servidor SMTP, crear mensajes de correo electrónico HTML dinámicos y probar eficazmente todo el proceso de envío de correos electrónicos.
Introducción a FluentEmail
Tim comienza explicando los antecedentes: el envío de correos electrónicos en C# solía depender de herramientas antiguas como System.Net.Mail, pero con .NET 5 y versiones posteriores, gran parte de ellas han quedado obsoletas. Aquí es donde FluentEmail, una moderna biblioteca de correo electrónico, viene a llenar el vacío tanto para mensajes sencillos como para comunicaciones más sofisticadas, como correos electrónicos HTML e imágenes en línea.
Tim señala que el objetivo es crear fácilmente correos electrónicos, utilizar plantillas e incluso probarlos sin conectarse a servidores de producción.
Configuración de la aplicación de consola
En el minuto 1:04, Tim crea una nueva aplicación de consola llamada EmailDemoApp. Destaca la simplicidad de empezar con static void Main(string[] args) o simplemente public static void Main cuando no necesitas una interfaz de usuario. El punto de partida limpio permite centrarse únicamente en el proceso de envío de correos electrónicos.

Después de crear la aplicación, Tim ajusta el proyecto a .NET 5, una actualización moderna del tradicional .NET Framework, que garantiza una mejor compatibilidad con los protocolos modernos para clientes de correo electrónico.
Instalación de FluentEmail a través de la consola del administrador de paquetes
A continuación, en el minuto 3:50, Tim utiliza la consola del gestor de paquetes para instalar el paquete FluentEmail.Smtp, que permite utilizar un cliente smtp para enviar correos electrónicos en C#. Además, Tim menciona que existen integraciones adicionales como MailGun y SendGrid, pero SMTP es la opción más universal, ya que funciona en la mayoría de clientes y configuraciones de correo electrónico.

Puede instalarlo manualmente con el siguiente comando:
Install-Package FluentEmail.Smtp
Install-Package FluentEmail.Smtp
Tim se asegura de que añadamos también la dependencia FluentEmail.Core, necesaria para que la biblioteca funcione.
Configuración del cliente y el servidor SMTP
En el minuto 6:10, Tim explica cómo configurar el cliente smtp mediante una nueva configuración de smtpclient:
var sender = new SmtpSender(() => new SmtpClient("localhost")
{
EnableSsl = false,
DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory,
PickupDirectoryLocation = @"C:\Demos"
});
var sender = new SmtpSender(() => new SmtpClient("localhost")
{
EnableSsl = false,
DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory,
PickupDirectoryLocation = @"C:\Demos"
});
Tim subraya que este servidor smtp localhost es para pruebas locales. En producción, te conectarías a los detalles de tu servidor smtp real, como el punto final SMTP de Gmail, posiblemente utilizando una contraseña de aplicación por seguridad.
Destaca que los ajustes sensibles deben trasladarse a un archivo de configuración como appsettings.json para mayor seguridad y flexibilidad.
Enviar un mensaje de correo electrónico sencillo
A las 11:59, Tim pasa a enviar un mensaje sencillo utilizando la API de correo electrónico de FluentEmail. Explica que un objeto de correo electrónico var se crea con el siguiente ejemplo de código:
var email = await Email
.From("tim@timco.com")
.To("test@test.com", "Sue")
.Subject("Thanks")
.Body("Thanks for buying our product.")
.SendAsync();
var email = await Email
.From("tim@timco.com")
.To("test@test.com", "Sue")
.Subject("Thanks")
.Body("Thanks for buying our product.")
.SendAsync();
De este modo, se especifica claramente la cadena asunto, la cadena correo electrónico y el cuerpo del mensaje mediante el encadenamiento de métodos. El mensaje var (correo electrónico) contiene el resultado, lo que permite comprobar errores.
Tim señala que, aunque el correo electrónico parezca proceder de tim@timco.com, el servidor smtp lo autenticará basándose en las credenciales de inicio de sesión (como la contraseña de una aplicación de Gmail).
Visualización del correo electrónico mediante el directorio local
Una vez enviado el mensaje de correo electrónico, Tim muestra cómo aparece en forma de archivo .eml en la carpeta local. Aunque se puede abrir con Outlook o el Bloc de notas, para los mensajes de correo electrónico existentes o las pruebas masivas, no es lo más fácil de usar.

Uso de Papercut SMTP para facilitar las pruebas
En el minuto 17:03, Tim pasa de guardar en un directorio a utilizar Papercut SMTP, un falso servidor SMTP ligero.
Modifica la configuración del cliente smtp para:
DeliveryMethod = SmtpDeliveryMethod.Network;
Port = 25;
DeliveryMethod = SmtpDeliveryMethod.Network;
Port = 25;
Con Papercut, cada correo electrónico de prueba se muestra inmediatamente en una interfaz gráfica de usuario. Esto facilita la comprobación del contenido del cuerpo de los mensajes en texto plano y HTML y simula la forma en que los clientes de correo electrónico reales procesan los distintos formatos.

Creación de un correo electrónico HTML con plantillas Razor
En el minuto 19:12, Tim señala que el texto plano estático no es suficiente para muchos casos del mundo real. Para mensajes HTML más dinámicos y ricos, instala el paquete FluentEmail.Razor:
Install-Package FluentEmail.Razor
Install-Package FluentEmail.Razor
Actualiza la configuración del proyecto con:
<PreserveCompilationContext>true</PreserveCompilationContext>
<PreserveCompilationContext>true</PreserveCompilationContext>
para garantizar que las plantillas Razor se compilan correctamente.
Creación y uso de una plantilla de correo electrónico Razor
Utilizando un constructor de cadenas (var builder) y la sintaxis de Razor, Tim crea una plantilla de correo electrónico dinámica:
var builder = new StringBuilder();
builder.AppendLine("Dear @Model.FirstName,");
builder.AppendLine("<p>Thanks for purchasing @Model.ProductName.</p>");
builder.AppendLine("The TimCo Team");
var builder = new StringBuilder();
builder.AppendLine("Dear @Model.FirstName,");
builder.AppendLine("<p>Thanks for purchasing @Model.ProductName.</p>");
builder.AppendLine("The TimCo Team");
A continuación, adjunta esta plantilla a la solicitud var utilizando el siguiente código:
await Email
.UsingTemplate(builder.ToString(), new { FirstName = "Tim", ProductName = "Bacon Wrapped Bacon" })
.SendAsync();
await Email
.UsingTemplate(builder.ToString(), new { FirstName = "Tim", ProductName = "Bacon Wrapped Bacon" })
.SendAsync();
Esta técnica admite diferentes formatos, como texto sin formato y cuerpo html, en función del contenido de la plantilla.
Manejo de múltiples destinatarios y archivos adjuntos
Aunque no se detalla completamente en la demostración de Tim, FluentEmail admite fácilmente múltiples destinatarios a través de llamadas a .To() y añadiendo un objeto adjunto para archivos adjuntos, de forma similar a como funcionaba el objeto mailmessage o la clase mailmessage en el antiguo .NET.
Puede crear archivos adjuntos utilizando una nueva cadena de ruta de archivo o id de contenido para imágenes en línea.
Manejo de excepciones en el proceso de envío de correo electrónico
Tim insiste en que hay que gestionar los errores con elegancia. Por ejemplo:
try
{
var result = await Email.SendAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
try
{
var result = await Email.SendAsync();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Esto captura cualquier fallo relacionado con SMTP o la red durante el proceso de envío de correo electrónico, especialmente si surgen problemas con el protocolo smtp.
Resumen y reflexiones finales
Alrededor del minuto 27:56, Tim concluye que con FluentEmail, el envío de correos electrónicos en C# se convierte en algo sencillo: desde el envío de mensajes sencillos al estilo de hola mundo hasta correos electrónicos html profesionales y dinámicos.
También subraya la importancia de mantener flexibles los detalles y configuraciones del servidor smtp mediante un archivo de configuración como appsettings.json, especialmente cuando se cambia entre el desarrollo local y plataformas en la nube como Azure Portal.
Tanto si su objetivo es enviar correos de forma individual como masiva, FluentEmail combinado con Papercut SMTP ofrece un flujo de trabajo moderno y eficiente compatible con muchos lenguajes y ecosistemas de programación.
Pensamientos finales
Gracias al excelente vídeo de Tim Corey, está claro que la funcionalidad moderna de envío de correo electrónico en C# ha evolucionado más allá del manejo básico de las clases smtpclient y mailmessage. Con la ayuda de FluentEmail, los desarrolladores pueden crear rápidamente un nuevo proyecto, configurar una conexión SMTP, crear un cuerpo de correo electrónico dinámico y probarlo todo localmente antes de desplegarlo en producción.
