Docs / SDK / Go / Mail
Go — módulo Mail
Paquete github.com/webability/webability-go/mail. Envuelve la API de correo transaccional (/v1/mail/*). Para campañas masivas a listas/segmentos, ver el módulo Marketing.
Importar y crear el objeto
import (
"github.com/webability/webability-go/wa"
"github.com/webability/webability-go/mail"
)
api := wa.New("tu-client-id", "tu-token-secreto")
m := mail.New(api)
Send(req mail.SendRequest)
POST /v1/mail/send — envía un correo a un solo destinatario.
out, err := m.Send(mail.SendRequest{
From: mail.Address{Email: "no-reply@tuempresa.com", Name: "Tu Empresa"},
To: mail.Recipient{Email: "cliente@ejemplo.com", Name: "Ana",
Vars: map[string]interface{}{"nombre": "Ana"}},
Subject: "Confirma tu compra",
HTML: "<p>Hola {{nombre}}, tu compra fue confirmada.</p>",
})
if err != nil {
log.Fatal(err)
}
fmt.Println("encolado:", out.QueueKey, "estatus:", out.QueueStatus)
Devuelve *mail.SendResult{Status, QueueKey int, QueueStatus, ErrorDetail, To string}.
WaitSend (opcional): por defecto, Send encola y responde de inmediato con QueueStatus="pending" — el envío real ocurre en segundo plano y se consulta después con Status. Si necesitas confirmar el resultado real antes de continuar (por ejemplo, para decidir si reintentar con otro proveedor), pon WaitSend: true: el servidor espera hasta ~20s el resultado real y lo devuelve directo en QueueStatus ("sent" o "error" con ErrorDetail). Si se agota el tiempo, degrada a "pending" igual que sin la bandera — el QueueKey sigue siendo válido para consultar después.
out, err := m.Send(mail.SendRequest{
From: mail.Address{Email: "no-reply@tuempresa.com"},
To: mail.Recipient{Email: "cliente@ejemplo.com"},
Subject: "Confirma tu compra",
HTML: "<p>Gracias por tu compra</p>",
WaitSend: true,
})
if err != nil {
log.Fatal(err)
}
switch out.QueueStatus {
case mail.QueueStatusSent:
fmt.Println("entregado")
case mail.QueueStatusError:
fmt.Println("falló:", out.ErrorDetail)
case mail.QueueStatusPending:
fmt.Println("no se resolvió a tiempo, consulta Status(", out.QueueKey, ") después")
}
Template (opcional): en vez de Subject/HTML/Text, usa una plantilla ya registrada y activa en tu cuenta — el servidor la arma con las Vars del destinatario. Se valida que exista y esté activa antes de encolar: si no, Send devuelve un *wa.APIError de inmediato (códigos 3025/3026), no un envío que falla después en segundo plano.
out, err := m.Send(mail.SendRequest{
From: mail.Address{Email: "no-reply@tuempresa.com"},
To: mail.Recipient{Email: "cliente@ejemplo.com", Name: "Ana",
Vars: map[string]interface{}{"nombre": "Ana", "codigo": "482913"}},
Template: "recuperacion",
})
if err != nil {
if apiErr, ok := err.(*wa.APIError); ok && apiErr.Code == 3025 {
fmt.Println("la plantilla no existe para esta cuenta")
}
log.Fatal(err)
}
¿Dónde se crean las plantillas?
Las plantillas no se crean por API en ningún SDK — se agregan y editan desde Consola → Correos → Plantillas. Ahí defines el id que usarás en Template, el tipo (debe ser email), el estado (activa/inactiva) y el contenido. El SDK solo referencia el id que le pongas ahí.
Status(queueKey int)
GET /v1/mail/status/{queue_key} — consulta el estatus real de un envío hecho con Send. Solo el cliente dueño de la cuenta que lo encoló puede consultarlo.
out, err := m.Send(mail.SendRequest{ /* ... */ })
if err != nil {
log.Fatal(err)
}
status, err := m.Status(out.QueueKey)
if err != nil {
log.Fatal(err)
}
fmt.Println(status.QueueStatus) // "pending" | "processing" | "sent" | "error"
if status.QueueStatus == mail.QueueStatusError {
fmt.Println("detalle:", status.ErrorDetail)
}
Devuelve *mail.StatusResult{Status, QueueKey int, QueueStatus, ErrorDetail string}.
Constantes disponibles: mail.QueueStatusPending, mail.QueueStatusProcessing, mail.QueueStatusSent, mail.QueueStatusError.
SendBulk(req mail.SendBulkRequest)
POST /v1/mail/send-bulk — envía el mismo correo (con variables por destinatario) a varios destinatarios.
out, err := m.SendBulk(mail.SendBulkRequest{
From: mail.Address{Email: "newsletter@tuempresa.com", Name: "Tu Empresa"},
Subject: "Novedades de la semana",
HTML: "<p>Hola {{nombre}}!</p>",
Recipients: []mail.Recipient{
{Email: "ana@ejemplo.com", Vars: map[string]interface{}{"nombre": "Ana"}},
{Email: "luis@ejemplo.com", Vars: map[string]interface{}{"nombre": "Luis"}},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(out.Queued, "encolados,", out.Failed, "fallidos")
for _, r := range out.Results {
fmt.Println(r.Email, r.Status, r.Error)
}
Devuelve *mail.SendBulkResult{Status, Total, Queued, Failed int, Results []mail.SendBulkResultEntry}.
Referencia completa de la API HTTP (headers, endpoints, códigos de error): /documentacion/mail. Para campañas masivas a listas/segmentos, ver Marketing.