Envío de correo electrónico en Go (Golang): revisión de bibliotecas y herramientas
Go (Golang) es un lenguaje compilado moderno, ideal para crear servicios backend, microservicios y automatización. Una de las tareas comunes es el envío programático de correos electrónicos. En este artículo, analizaremos en detalle las herramientas estándar de Go para trabajar con SMTP, las bibliotecas de terceros más populares y ejemplos de envío de correos simples y HTML con archivos adjuntos.
Paquete estándar net/smtp
En la biblioteca estándar de Go existe el paquete net/smtp, que proporciona funcionalidades básicas para enviar correos electrónicos a través de un servidor SMTP. Es simple, pero requiere la construcción manual del cuerpo del mensaje (incluyendo encabezados y tipos MIME).
Ejemplo simple de envío de un correo de texto
package main
import ( "fmt" "net/smtp")
func main() { // Datos de autenticación from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// Servidor SMTP (por ejemplo, Gmail) smtpHost := "smtp.gmail.com" smtpPort := "587"
// Cuerpo del correo (obligatorio con encabezados) subject := "Subject: ¡Hola desde Go!" body := "Este es un correo de prueba enviado con net/smtp." message := []byte(subject + "" + body)
// Autenticación auth := smtp.PlainAuth("", from, password, smtpHost)
// Envío err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, message) if err != nil { fmt.Println("Error al enviar:", err) return } fmt.Println("¡Correo enviado exitosamente!")}Importante: Para Gmail se necesita una contraseña de aplicación, no la contraseña normal.
Envío de correo HTML y correo con archivos adjuntos
El paquete net/smtp no puede generar automáticamente mensajes MIME. Para correos HTML o archivos adjuntos, es necesario construir manualmente los encabezados Content-Type y codificar los archivos adjuntos en base64. Esto es engorroso, por lo que para correos complejos es mejor usar bibliotecas de terceros.
Bibliotecas de terceros populares para enviar correos electrónicos en Go
Existen varias bibliotecas maduras que simplifican enormemente el trabajo:
- go-gomail/gomail — una de las más populares. Soporta HTML, archivos adjuntos, incrustación de imágenes y múltiples destinatarios.
- jordan-wright/email — biblioteca ligera con una API conveniente.
- sendgrid/sendgrid-go — cliente oficial para el servicio SendGrid (adecuado para envíos masivos).
Ejemplo con go-gomail
package main
import ( "fmt" "gopkg.in/gomail.v2")
func main() { m := gomail.NewMessage() m.SetHeader("From", "your_email@gmail.com") m.SetHeader("To", "recipient@example.com") m.SetHeader("Subject", "Correo HTML con archivo adjunto") m.SetBody("text/html", "<h1>¡Hola!</h1><p>Este es un correo <b>HTML</b>.</p>") m.Attach("/path/to/file.pdf") // Archivo adjunto
d := gomail.NewDialer("smtp.gmail.com", 587, "your_email@gmail.com", "your_app_password")
if err := d.DialAndSend(m); err != nil { fmt.Println("Error:", err) return } fmt.Println("¡Correo enviado!")}Envío asíncrono y pool de conexiones
Si es necesario enviar muchos correos (por ejemplo, después del registro de usuarios), es importante no bloquear el hilo principal. Go maneja la concurrencia de manera excelente:
También en la biblioteca
Biblioteca estándar de Swift: revisión completa para iOS/macOS
Rate Limiting en Go (Golang): bibliotecas, patrones y ejemplos de implementación
Java Management Extensions (JMX) — monitoreo de aplicaciones Java
Cliente Redis para TypeScript: ioredis y redis (node-redis)