Envío de correo electrónico en Go (Golang): bibliotecas y ejemplos de código
El envío de correos electrónicos es una de las tareas clave para cualquier aplicación web: registro de usuarios, restablecimiento de contraseña, notificaciones y boletines. En el lenguaje Go (Golang) existen tanto herramientas estándar para trabajar con SMTP como potentes bibliotecas de terceros que simplifican el envío de correos con plantillas HTML, archivos adjuntos y soporte para diferentes servicios de correo. En este artículo, analizaremos en detalle cómo enviar correos electrónicos en Go, revisaremos las bibliotecas más populares y proporcionaremos ejemplos prácticos de código.
Biblioteca estándar net/smtp
El paquete net/smtp forma parte de la biblioteca estándar de Go y proporciona un conjunto mínimo de funciones para enviar correos a través de un servidor SMTP. Es adecuado para mensajes de texto simples, pero requiere la creación manual de encabezados y el cuerpo del mensaje de acuerdo con RFC 5322.
Ejemplo de envío de un correo de texto simple:
package main
import ( "fmt" "net/smtp")
func main() { // Datos para la conexión al servidor SMTP smtpHost := "smtp.example.com" smtpPort := "587" from := "sender@example.com" password := "your_password" to := []string{"recipient@example.com"}
// Formamos el cuerpo del correo (obligatorio con encabezados) subject := "Subject: ¡Hola desde Go!" mime := "MIME-version: 1.0;Content-Type: text/plain; charset=\\"UTF-8\\";
" body := "Este es un correo de prueba enviado con Go." msg := []byte(subject + mime + body)
// Autenticación auth := smtp.PlainAuth("", from, password, smtpHost)
// Envío err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, msg) if err != nil { fmt.Println("Error al enviar:", err) return } fmt.Println("¡Correo enviado con éxito!")}Limitaciones de net/smtp:
- No admite archivos adjuntos sin codificación Base64 manual.
- Requiere formateo independiente de los encabezados MIME.
- Incómodo para enviar correos HTML con imágenes.
Biblioteca gomail/v2
Una de las bibliotecas de terceros más populares para enviar correos electrónicos en Go es gomail (paquete gopkg.in/mail.v2). Proporciona una API conveniente para trabajar con correos: soporte para archivos adjuntos, partes HTML y de texto, configuración de la conexión SMTP, así como la posibilidad de envío a través de SSL/TLS.
Instalación:
go get gopkg.in/mail.v2Ejemplo de envío de un correo HTML con archivo adjunto:
package main
import ( "fmt" "gopkg.in/mail.v2")
func main() { m := mail.NewMessage() m.SetHeader("From", "sender@example.com") m.SetHeader("To", "recipient@example.com") m.SetHeader("Subject", "Correo HTML con archivo adjunto")
// Partes alternativas: texto y HTML m.SetBody("text/plain", "Si ve este texto, su cliente no admite HTML.") m.AddAlternative("text/html", "<h1>¡Hola!</h1><p>Esta es la versión HTML del correo.</p>")
// Agregamos un archivo adjunto m.Attach("/path/to/file.pdf")
// Configuración del cliente SMTP d := mail.NewDialer("smtp.example.com", 587, "sender@example.com", "your_password") d.StartTLSPolicy = mail.MandatoryStartTLS
if err := d.DialAndSend(m); err != nil { fmt.Println("Error:", err) return } fmt.Println("¡Correo enviado!")}Ventajas de gomail:
- API simple e intuitiva.
- Generación automática de encabezados MIME.
- Soporte para archivos adjuntos e imágenes incrustadas (CID).
- Trabajo con SSL/TLS y StartTLS.
Biblioteca go-smtp (emersion/go-smtp)
La biblioteca go-smtp de emersion es una alternativa de más bajo nivel que brinda control total sobre la conexión SMTP. Es útil si necesita