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.