Envío de Email en C# (.NET): guía completa de System.Net.Mail
En el desarrollo moderno en la plataforma .NET, la tarea de enviar correos electrónicos se resuelve con la biblioteca estándar System.Net.Mail. Esta herramienta integrada no requiere instalar paquetes NuGet adicionales y proporciona una API flexible para crear y enviar mensajes de correo a través de un servidor SMTP. En este artículo, analizaremos en detalle todos los componentes clave de la biblioteca, veremos ejemplos de código, manejo de errores y mejores prácticas.
Clases principales de la biblioteca
La biblioteca System.Net.Mail incluye tres clases principales:
SmtpClient— se encarga de la conexión al servidor SMTP y el envío de mensajes.MailMessage— representa el correo en sí: asunto, cuerpo, remitente, destinatarios, adjuntos.Attachment— permite agregar archivos al correo.
Ejemplo básico de envío de Email
Veamos el escenario más simple: enviar un correo de texto a través del servidor SMTP de Gmail. Tenga en cuenta que para trabajar con Gmail necesitará una contraseña de aplicación (App Password) debido a la autenticación de dos factores.
using System;using System.Net;using System.Net.Mail;
class Program{ static void Main() { var fromAddress = new MailAddress("your@gmail.com", "Su Nombre"); var toAddress = new MailAddress("recipient@example.com", "Destinatario"); const string fromPassword = "su_contraseña_de_aplicación"; const string subject = "Correo de prueba desde .NET"; const string body = "¡Hola! Este correo fue enviado con C#.";
var smtp = new SmtpClient { Host = "smtp.gmail.com", Port = 587, EnableSsl = true, DeliveryMethod = SmtpDeliveryMethod.Network, UseDefaultCredentials = false, Credentials = new NetworkCredential(fromAddress.Address, fromPassword) };
using (var message = new MailMessage(fromAddress, toAddress) { Subject = subject, Body = body }) { smtp.Send(message); }
Console.WriteLine("¡Correo enviado!"); }}Envío de correos HTML con adjuntos
A menudo es necesario enviar un correo en formato HTML con archivos adjuntos. Para ello, establezca la propiedad IsBodyHtml = true y use la colección Attachments.
using (var message = new MailMessage(fromAddress, toAddress)){ message.Subject = "Informe mensual"; message.IsBodyHtml = true; message.Body = "<h2>¡Hola!</h2><p>Su informe está adjunto.</p>";
// Agregamos un adjunto var attachment = new Attachment(@"C:\\reports\\report.pdf"); message.Attachments.Add(attachment);
smtp.Send(message);}Envío asíncrono (async/await)
Para el envío no bloqueante en aplicaciones modernas, use SendMailAsync. Esto es especialmente importante en aplicaciones web (ASP.NET Core) y programas de escritorio con interfaz de usuario.
public async Task SendEmailAsync(){ using (var message = new MailMessage(fromAddress, toAddress) { Subject = "Envío asíncrono", Body = "Correo enviado de forma asíncrona" }) { await smtp.SendMailAsync(message); }}Manejo de excepciones
Al trabajar con servidores de correo pueden ocurrir errores: credenciales incorrectas, tiempos de espera, problemas con DNS. Siempre envuelva el envío en un bloque try-catch.
try{ smtp.Send(message); Console.WriteLine("Enviado correctamente.");}catch (SmtpException ex){ Console.WriteLine($"Error SMTP: {ex.StatusCode} - {ex.Message}");}catch (Exception ex){ Console.WriteLine($"Error general: {ex.Message}");