Envío de correo electrónico en Go (Golang): revisión completa de bibliotecas y herramientas
En el desarrollo web moderno, el envío de correos electrónicos sigue siendo una de las tareas clave para notificaciones, registros, recuperación de contraseñas y boletines. El lenguaje Go (Golang) ofrece varias formas efectivas de integrarse con servidores SMTP. En este artículo, analizaremos la biblioteca estándar net/smtp, la popular biblioteca de terceros gomail y la más avanzada go-smtp. Aprenderá a enviar correos electrónicos de texto plano y HTML, agregar archivos adjuntos y configurar una conexión segura.
1. Biblioteca estándar net/smtp
El paquete net/smtp está integrado en Go y no requiere instalación adicional. Proporciona funciones básicas para conectarse a un servidor SMTP, autenticarse y enviar mensajes. Sin embargo, para trabajar con requisitos modernos (HTML, archivos adjuntos, SSL/TLS), será necesario escribir más código.
Ejemplo simple de envío de un correo de texto plano
package main
import ( "fmt" "net/smtp")
func main() { // Configuración del servidor SMTP (ejemplo para Gmail) smtpHost := "smtp.gmail.com" smtpPort := "587" from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// Asunto y cuerpo del correo (formato más simple) subject := "Subject: Correo de prueba desde Go" body := "¡Hola! Este mensaje fue enviado usando net/smtp." msg := []byte(subject + "" + 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 exitosamente!")}Importante: Para Gmail, debe usar una contraseña de aplicación (no la contraseña principal) y permitir el acceso para aplicaciones menos seguras. Para otros servicios (Yandex, Mail.ru), los parámetros pueden variar.
Envío de un correo HTML a través de net/smtp
Para enviar un correo HTML, debe especificar explícitamente el encabezado Content-Type:
package main
import ( "fmt" "net/smtp")
func main() { smtpHost := "smtp.gmail.com" smtpPort := "587" from := "your_email@gmail.com" password := "your_app_password" to := []string{"recipient@example.com"}
// Formamos los encabezados MIME headers := make(map[string]string) headers["From"] = from headers["To"] = "recipient@example.com" headers["Subject"] = "Correo HTML desde Go" headers["MIME-Version"] = "1.0" headers["Content-Type"] = "text/html; charset=\\"UTF-8\\""
// Construimos el mensaje message := "" for k, v := range headers { message += fmt.Sprintf("%s: %s\\r", k, v) } message += "\\r" + "<h1>¡Hola!</h1><p>Este es un correo <b>HTML</b>.</p>"
auth := smtp.PlainAuth("", from, password, smtpHost) err := smtp.SendMail(smtpHost+":"+smtpPort, auth, from, to, []byte(message)) if err != nil { fmt.Println("Error:", err) }}La desventaja de net/smtp es la falta de soporte para archivos adjuntos y una estructura de correo multicomponente compleja. Para tales tareas, es mejor usar bibliotecas especializadas.
2. Biblioteca gomail
Gomail es una de las bibliotecas de terceros más populares para enviar correos electrónicos en Go. Proporciona una API conveniente, soporte para HTML, archivos adjuntos, incrustación de imágenes, SSL/TLS y encabezados personalizables.
Instalación
go get gopkg.in/mail.v2Ejemplo de envío de un correo HTML con archivo adjunto
package main
import ( "crypto/tls" "fmt" gomail "gopkg.in/mail.v2")
func main() { m := gomail.NewMessage( También en la biblioteca
Caching en PHP: Redis, Memcached y APCu — guía completa
mo para Go: guía completa con ejemplos prácticos
Trabajo con XML en Java: bibliotecas y herramientas para el análisis sintáctico
gRPC para Java: bibliotecas, configuración y ejemplos de uso