Envío de email en C# (.NET): desde SmtpClient hasta MailKit
El envío de correos electrónicos es una de las tareas clave en el desarrollo de aplicaciones web, servicios de notificaciones y sistemas corporativos. En el ecosistema .NET existen tanto herramientas integradas como bibliotecas de terceros que simplifican el trabajo con SMTP, SSL/TLS y escenarios complejos. En este artículo analizaremos en detalle cómo enviar un email en C#, utilizando el clásico SmtpClient y la biblioteca moderna MailKit.
1. SmtpClient integrado (System.Net.Mail)
La clase SmtpClient está disponible en .NET Framework y .NET Core/5+ (con algunas limitaciones). Permite configurar rápidamente el envío de correos a través de cualquier servidor SMTP.
Ejemplo básico de envío de email
using System.Net;using System.Net.Mail;
var smtpClient = new SmtpClient("smtp.gmail.com"){ Port = 587, Credentials = new NetworkCredential("your_email@gmail.com", "your_app_password"), EnableSsl = true};
var mailMessage = new MailMessage{ From = new MailAddress("your_email@gmail.com"), Subject = "Correo de prueba desde C#", Body = "¡Hola! Este mensaje fue enviado a través de SmtpClient.", IsBodyHtml = false};
mailMessage.To.Add("recipient@example.com");
try{ smtpClient.Send(mailMessage); Console.WriteLine("¡Correo enviado exitosamente!");}catch (Exception ex){ Console.WriteLine($"Error al enviar: {ex.Message}");}Importante: Para Gmail se requiere una contraseña de aplicación, no la contraseña normal. Para otros servicios (Yandex, Mail.ru) verifique la configuración SMTP.
Envío de correo HTML con archivo adjunto
var message = new MailMessage();message.From = new MailAddress("sender@example.com");message.To.Add("user@example.com");message.Subject = "Informe mensual";message.IsBodyHtml = true;message.Body = "<h2>Informe mensual</h2><p>Se adjunta archivo PDF.</p>";
// Agregar archivo adjuntovar attachment = new Attachment(@"C:\\Reports\\report.pdf");message.Attachments.Add(attachment);
using (var client = new SmtpClient("smtp.example.com", 587)){ client.Credentials = new NetworkCredential("login", "password"); client.EnableSsl = true; client.Send(message);}Los archivos adjuntos pueden ser de cualquier tipo: imágenes, documentos, archivos comprimidos. Para enviar desde memoria use MemoryStream.
2. Envío asíncrono
En aplicaciones modernas es recomendable no bloquear el hilo. Use SendMailAsync:
public async Task SendEmailAsync(){ using var client = new SmtpClient("smtp.example.com", 587); client.Credentials = new NetworkCredential("login", "password"); client.EnableSsl = true;
var message = new MailMessage("from@example.com", "to@example.com") { Subject = "Envío asíncrono", Body = "Este correo fue enviado de forma asíncrona." };
await client.SendMailAsync(message); Console.WriteLine("¡Enviado de forma asíncrona!");}3. Problemas de SmtpClient y alternativas
A pesar de su simplicidad, SmtpClient tiene desventajas:
- API obsoleta (en .NET 5+ está marcado como obsoleto);
- Mala compatibilidad con protocolos de autenticación modernos (OAuth2);
- Falta de soporte integrado para S/MIME y escenarios avanzados.
Por ello, Microsoft recomienda usar bibliotecas de terceros como MailKit.
4. MailKit — biblioteca moderna para trabajar con email
MailKit es una biblioteca multiplataforma de código abierto. Soporta SMTP, POP3, IMAP, SSL/TLS, asincronía, OAuth2 y mucho más.
Instalación mediante NuGet
\También en la biblioteca
Análisis de HTML en Java: bibliotecas Jsoup y HtmlUnit
Parseo de HTML en Swift: librería SwiftSoup para iOS/macOS
Viper para Go: guía completa con ejemplos