Producto
Si estás creando con Go y necesitas un email fiable para inscripciones, recibos, restablecimiento de contraseñas o alertas, esta guía te muestra el camino más rápido.
Configurarás un remitente, enviarás tu primer mensaje con el Go SDK de Mailjet y aprenderás patrones para plantillas, archivos adjuntos, envíos masivos, webhooks y SMTP.
Se trata de un enfoque de la integración del correo electrónico basado en ejemplos y listo para la producción.
En 2009 Google lanzó un lenguaje llamado Go, a menudo conocido como "Golang". Go se introdujo como un robusto lenguaje de programación del lado del servidor. Desde entonces, nunca ha dejado de cumplir sus promesas con patrones de programación de bajo nivel y potentes estructuras de datos.
Esta guía está pensada para:
Antes de empezar necesitarás:
💡 Consejo profesional: Autentica tu dominio mediante SPF/DKIM para mejorar las tasas de entrega de la bandeja de entrada. Consulta la guía completa de autenticación para ver detalles de configuración y ejemplos.
Vamos a conseguir que envíes correos electrónicos rápidamente utilizando el SDK Go oficial de Mailjet y la API de envíos v3.1.
Primero instala el SDK Go de Mailjet:
go get github.com/mailjet/mailjet-apiv3-go/v4
A continuación configura tus variables de entorno:
export MJ_APIKEY_PUBLIC=tu_clave_api
export MJ_APIKEY_PRIVATE=tu_clave_secreta
export SENDER_EMAIL=tu_remitente_verificado@tudominio.com
Crea un archivo main.go con el siguiente código:
package main
import (
"fmt"
"log"
"os"
"github.com/mailjet/mailjet-apiv3-go/v4"
)
func main() {
mj := mailjet.NewMailjetClient(os.Getenv("MJ_APIKEY_PUBLIC"), os.Getenv("MJ_APIKEY_PRIVATE"))
msgs := []mailjet.InfoMessagesV31{
{
From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL"), Name: "Go App"},
To: &mailjet.RecipientsV31{
{Email: "recipient@example.com", Name: "Recipient"},
},
Subject: "Hello from Go + Mailjet",
TextPart: "This is a plain-text fallback.",
HTMLPart: "<h3>Hello from Go + Mailjet</h3><p>It works.</p>",
},
}
messages := mailjet.MessagesV31{Info: msgs}
res, err := mj.SendMailV31(&messages)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Status: %+v\n", res)
}
El SDK Go envuelve los puntos finales REST de Mailjet y proporciona un práctico ayudante SendMailV31 que acepta una matriz Messages. Este enfoque te proporciona toda la potencia de la API de Mailjet con una necesidad mínima de código.
Si prefieres SMTP o ya utilizas un MTA SMTP, puedes utilizar el servidor SMTP de Mailjet con tus credenciales de API.
package main
import (
"net/smtp"
"os"
)
func main() {
host := "in-v3.mailjet.com"
auth := smtp.PlainAuth("", os.Getenv("MJ_APIKEY_PUBLIC"), os.Getenv("MJ_APIKEY_PRIVATE"), host)
to := []string{"recipient@example.com"}
from := "sender@yourdomain.com"
msg := []byte(
"To: recipient@example.com\r\n" +
"From: Go App <sender@yourdomain.com>\r\n" +
"Subject: SMTP from Go via Mailjet\r\n" +
"MIME-Version: 1.0\r\n" +
"Content-Type: text/html; charset=UTF-8\r\n\r\n" +
"<p>Hello via SMTP</p>",
)
// Port 587 (TLS) or 465 (SSL) are common choices
err := smtp.SendMail(host+":587", auth, from, to, msg)
if err != nil {
log.Fatal(err)
}
}
Para más detalles, consulta la guía de configuración de SMTP.
Diseña tu plantilla de email una vez en el panel de Mailjet, y luego pasa un TemplateID y Variables de tu código Go para el contenido dinámico.
msgs := []mailjet.InfoMessagesV31{
{
From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL"), Name: "Go App"},
To: &mailjet.RecipientsV31{{Email: "destinatario@ejemplo.com", Name: "Tomás"}},
TemplateID: 123456, // sustitúyelo por el ID de tu plantilla
TemplateLanguage: true, // activa el lenguaje de plantillas de Mailjet
Variables: map[string]any{"first_name": "Tomás", "plan": "Pro"},
Subject: "Te damos la bienvenida, {{var:first_name:\"pasa sin miedo\"}}",
},
}
Para ver más ejemplos de plantillas, consulta este hilo en Stack Overflow.
Envía archivos adjuntos e inserta imágenes en línea en tus emails. El límite de tamaño total de los mensajes es de 15 MB.
// Primero lee y codifica en base64 tus archivos, luego:
msgs := []mailjet.InfoMessagesV31{
{
From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL")},
To: &mailjet.RecipientsV31{{Email: "destinatario@ejemplo.com"}},
Subject: "Factura adjunta + logotipo en línea",
HTMLPart: `<p>¡Gracias por tu compra!</p><img src="cid:logo1" alt="Logotipo de la empresa"/>`,
Attachments: &[]mailjet.AttachmentV31{
{
ContentType: "application/pdf",
Filename: "factura.pdf",
Base64Content: "<BASE64_STRING>", // tu PDF codificado en base64
},
},
InlinedAttachments: &[]mailjet.InlinedAttachmentV31{
{
AttachmentV31: mailjet.AttachmentV31{
ContentType: "image/png",
Filename: "logo.png",
Base64Content: "<BASE64_PNG>", // tu imagen codificada en base64
},
ContentID: "logo1", // referenciado en HTML como cid:logo1
},
},
},
}
Envía varios mensajes personalizados en una sola llamada a la API. Cada mensaje se valida de forma independiente, por lo que se enviarán los mensajes correctos aunque alguno falle.
msgs := []mailjet.InfoMessagesV31{
{
From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL")},
To: &mailjet.RecipientsV31{{Email: "usuario1@ejemplo.com"}},
Subject: "¡Te damos la bienvenida, usuario 1!",
HTMLPart: "<p>Hola, usuario 1</p>",
},
{
From: &mailjet.RecipientV31{Email: os.Getenv("SENDER_EMAIL")},
To: &mailjet.RecipientsV31{{Email: "usuario2@ejemplo.com"}},
Subject: "¡Te damos la bienvenida, usuario 2!",
HTMLPart: "<p>Hola, usuario 2</p>",
},
}
res, err := mj.SendMailV31(&mailjet.MessagesV31{Info: msgs})
if err != nil {
log.Fatal(err)
}
// Procesa los resultados: Cada mensaje recibe su propio estado e ID
for i, result := range res.ResultsV31 {
fmt.Printf("Message %d: Status=%s, MessageID=%d\n", i, result.Status, result.To[0].MessageID)
}
La API de envío v3.1 devuelve el estado y los ID de cada mensaje, lo que facilita la correlación de los resultados con tus mensajes originales. Utiliza el MessageID para hacer un seguimiento posterior del estado de la entrega.
Configura webhooks para recibir notificaciones en tiempo real sobre eventos de correo electrónico como entregas, aperturas, clics, rebotes y bajas.
package main
import (
"encoding/json"
"net/http"
"log"
)
type MailjetEvent struct {
Event string `json:"event"`
Time int64 `json:"time"`
MessageID int64 `json:"MessageID"`
Email string `json:"email"`
URL string `json:"url,omitempty"` // para eventos de clics
Error string `json:"error,omitempty"` // para eventos de rebotes/errores
}
func webhookHandler(w http.ResponseWriter, r *http.Request) {
defer r.Body.Close()
var events []MailjetEvent
if err := json.NewDecoder(r.Body).Decode(&events); err != nil {
http.Error(w, "bad request", http.StatusBadRequest)
return
}
// Procesa los eventos (considera el uso de una cola para la producción)
for _, event := range events {
switch event.Event {
case "sent":
log.Printf("Message %d sent to %s", event.MessageID, event.Email)
case "open":
log.Printf("Message %d opened by %s", event.MessageID, event.Email)
case "click":
log.Printf("Message %d clicked by %s (URL: %s)", event.MessageID, event.Email, event.URL)
case "bounce":
log.Printf("Message %d bounced for %s: %s", event.MessageID, event.Email, event.Error)
}
}
// Devuelve siempre 200 para acusar recibo
w.WriteHeader(http.StatusOK)
}
func main() {
http.HandleFunc("/mj/events", webhookHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Para consultar la documentación completa sobre eventos, consulta la guía de la API de seguimiento de eventos.
Aquí tienes tres aspectos esenciales de la entregabilidad que debes tener en cuenta.
Configura la autenticación SPF y DKIM de tu dominio de envío para mejorar la ubicación en la bandeja de entrada y reducir el riesgo de suplantación de identidad (
Sigue la guía completa de autenticación de dominios para obtener instrucciones de configuración paso a paso.
Si tu cuenta de Mailjet está en la infraestructura de EE. UU., configura el SDK para utilizar el punto de conexión de API de EE. UU.:
// Para cuentas de la región de EE. UU.
mj := mailjet.NewMailjetClient(apiKey, secretKey)
mj.SetAPIBase("https://api.us.mailjet.com/v3.1/")
Consideraciones sobre el cortafuegos: Comprueba el acceso a puertos de tu red; muchos proveedores bloquean el puerto 25.
Aquí tienes los problemas más comunes y cómo solucionarlos.
Utiliza el SDK oficial con SendMailV31 como se indica en la sección Inicio rápido. Es una sola llamada a una función una vez que tus claves de API están configuradas.
Sí. Apunta el paquete net/smtp de Go a in-v3.mailjet.com utilizando tu clave de API y tu clave secreta como credenciales, con el puerto 587 o 465.
Establece TemplateID, activa TemplateLanguage: true, y pasa tus datos en el campo Variables. Utiliza la sintaxis {{var:name:»por defecto»}} en tus plantillas.
Utiliza webhooks para obtener datos de eventos en tiempo real, o consulta el panel de control de Mailjet y los puntos de conexión de estadísticas de la API REST para obtener métricas agregadas.
Ahora que ya funciona el envío de emails en tu aplicación Go, considera estas mejoras:
Con esta base estarás listo para crear una funcionalidad de correo electrónico sólida y adaptable en tus aplicaciones Go. La combinación de la fiable infraestructura de Mailjet y el rendimiento de Go constituye una potente solución de email.