Envío de correo electrónico a través de Gmail en .NET: 4 enfoques con código en C#

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Por qué enviar correos electrónicos a través de Gmail en .NET es un dolor de cabeza (y cómo evitarlo)

\n\n

Si alguna vez has intentado configurar el envío de correos electrónicos a través de Gmail en tu aplicación .NET, sabes que es una tarea que parece simple pero se convierte en una odisea. Escribes 10 líneas de código, ejecutas y obtienes un SmtpException con un texto misterioso sobre "aplicación no segura". ¿Te suena familiar?

\n\n

En Stack Overflow, la pregunta "Sending email in .NET through Gmail" ha acumulado miles de visitas y cientos de respuestas. La gente lucha con este problema durante años. En este artículo, analizaremos 4 enfoques reales en C#, desde los clásicos hasta las soluciones modernas, y descubriremos cuál vale la pena usar en 2025.

\n\n

Advertencia: ese código que encontraste en un blog de 2015 probablemente ya no funciona. Google endurece constantemente sus políticas de seguridad. Pero no te preocupes, te mostraremos opciones que funcionan.

\n\n

Enfoque 1: SmtpClient clásico (y por qué está obsoleto)

\n\n

La forma más obvia es usar el SmtpClient incorporado de System.Net.Mail. Así es como se veía en "los viejos tiempos":

\n\n
using System.Net;\nusing System.Net.Mail;\n\nvar message = new MailMessage("your@gmail.com", "recipient@example.com")\n{\n    Subject = "Correo de prueba desde .NET",\n    Body = "¡Hola! Esto es una prueba."\n};\n\nusing var client = new SmtpClient("smtp.gmail.com", 587)\n{\n    Credentials = new NetworkCredential("your@gmail.com", "your-password"),\n    EnableSsl = true\n};\n\nclient.Send(message);
\n\n

En 2010-2015 esto funcionaba. Pero hoy Google ha bloqueado el inicio de sesión con contraseña normal para la mayoría de las cuentas. Necesitarás:

\n
    \n
  • Contraseña de aplicación (App Password) — pero solo con la autenticación de dos factores activada
  • \n
  • O permitir el "acceso a aplicaciones no seguras" — opción que Google ya eliminó
  • \n
\n\n

Desventajas del enfoque:

\n
    \n
  • SmtpClient está marcado como Obsolete en .NET 5+
  • \n
  • No admite protocolos de autenticación modernos (OAuth 2.0)
  • \n
  • La contraseña de aplicación no es eterna; debe actualizarse manualmente
  • \n
\n\n

Cuándo usarlo: solo para prototipos rápidos o herramientas internas donde la seguridad no sea crítica.

\n\n

Enfoque 2: MailKit — moderno y potente

\n\n

Si buscas una solución de nivel profesional, usa la biblioteca MailKit del desarrollador de Mono. No solo funciona, sino que se mantiene activamente.

\n\n

Primero, instala el paquete:

\n
dotnet add package MailKit
\n\n

Ahora el código usando App Password:

\n\n
using MailKit.Net.Smtp;\nusing MimeKit;\n\nvar message = new MimeMessage();\nmessage.From.Add(new MailboxAddress("Tu nombre", "your@gmail.com"));\nmessage.To.Add(new MailboxAddress("Destinatario", "recipient@example.com"));\nmessage.Subject = "Correo a través de MailKit";\nmessage.Body = new TextPart("plain") { Text = "¡Hola desde .NET!" };\n\nusing var client = new SmtpClient();\nawait client.ConnectAsync("smtp.gmail.com", 587, MailKit.Security.SecureSocketOptions.StartTls);\nawait client.AuthenticateAsync("your@gmail.com", "tu-contraseña-de-aplicación");\nawait client.SendAsync(message);\nawait client.DisconnectAsync(true);
\n\n

¿Por qué MailKit es mejor que SmtpClient?

\n
    \n
  • Métodos asíncronos — no bloquea el hilo
  • \n
  • Soporte para MIME, firmas, cifrado
  • \n
  • Funciona en todas las plataformas .NET (incluyendo .NET MAUI y Unity)
  • \n
  • No está marcado como obsoleto
  • \n
\n\n

Pero este enfoque también tiene una limitación: App Password es una solución temporal. Si tu cuenta de Google se ve comprometida, un atacante podría enviar correos en tu nombre.

\n\n

Enfoque 3: Google API + OAuth 2.0 (para proyectos serios)

\n\n

La forma más correcta y segura es usar

Blogs

Book Recommendations