Envío de correo electrónico en Go (Golang): bibliotecas y ejemplos de código

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

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.v2


Ejemplo 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

Recommendations