Conector de Mailgun

Conecta Mailgun con Brevo a través de Tajo para unificar tus datos de email transaccional y de marketing, sincronizar eventos de entrega y métricas de engagement, y consolidar tu infraestructura de email en una única vista de cliente.

Resumen

PropiedadValor
PlataformaMailgun (by Sinch)
CategoríaEmail marketing
Complejidad de configuraciónFácil
Integración oficialNo
Datos sincronizadosEventos, Contactos, Entregabilidad, Campañas
Método de autenticaciónClave API (HTTP Basic Auth)

Funcionalidades

  • Sincronización de eventos de entrega - Registra eventos de entregado, rebotado, abierto y clicado
  • Métricas de engagement - Sincroniza tasas de apertura y clic como atributos de contacto de Brevo
  • Gestión de rebotes - Suprime automáticamente las direcciones rebotadas en Brevo
  • Gestión de quejas - Sincroniza las quejas por spam para mantener la higiene de la lista
  • Reputación del dominio - Monitoriza el estado del dominio de envío y la entregabilidad
  • Seguimiento de email transaccional - Correlaciona los envíos transaccionales con los datos de marketing

Requisitos previos

Antes de empezar, asegúrate de tener:

  1. Una cuenta de Mailgun con un dominio de envío verificado
  2. Una clave API de Mailgun desde el panel de Mailgun
  3. Una cuenta de Brevo con acceso a la API
  4. Una cuenta de Tajo con permisos de conector

Autenticación

Autenticación con clave API

Mailgun usa HTTP Basic Authentication con api como nombre de usuario y tu clave API como contraseña:

Terminal window
# Get your API key from https://app.mailgun.com/settings/api_security
export MAILGUN_API_KEY=key-your-api-key
export MAILGUN_DOMAIN=your-domain.com
export TAJO_API_KEY=your_tajo_api_key
export BREVO_API_KEY=your_brevo_api_key
// HTTP Basic Auth format
const headers = {
'Authorization': `Basic ${Buffer.from(
`api:${process.env.MAILGUN_API_KEY}`
).toString('base64')}`
};
// Or using curl
// curl -s --user 'api:YOUR_API_KEY' ...

Tipos de clave API

Mailgun ofrece sending keys específicas por dominio y claves API a nivel de cuenta. Usa las sending keys de dominio para las operaciones de mensajes y la clave API de cuenta para operaciones de gestión.

Configuración

Configuración básica

connectors:
mailgun:
enabled: true
api_key: "${MAILGUN_API_KEY}"
domain: "${MAILGUN_DOMAIN}"
region: "us" # or "eu" for EU region
sync:
events: true
contacts: true
bounces: true
complaints: true
schedule: "*/15 * * * *" # Every 15 minutes
webhook:
signing_key: "${MAILGUN_WEBHOOK_SIGNING_KEY}"
lists:
engaged: 30
bounced: 31
complained: 32

Asignación de campos

field_mapping:
email: email
first_name: FIRSTNAME
last_name: LASTNAME
open_rate: MG_OPEN_RATE
click_rate: MG_CLICK_RATE
last_delivered: MG_LAST_DELIVERED
bounce_type: MG_BOUNCE_TYPE
engagement_score: MG_ENGAGEMENT
unsubscribed: MG_UNSUBSCRIBED

Endpoints de la API

EndpointMétodoDescripción
https://api.mailgun.net/v3/{domain}/messagesPOSTEnviar mensajes de email
https://api.mailgun.net/v3/{domain}/eventsGETConsultar los logs de eventos
https://api.mailgun.net/v3/{domain}/bouncesGETListar rebotes
https://api.mailgun.net/v3/{domain}/complaintsGETListar quejas
https://api.mailgun.net/v3/{domain}/unsubscribesGETListar bajas
https://api.mailgun.net/v3/{domain}/tagsGETListar etiquetas
https://api.mailgun.net/v3/{domain}/tags/{tag}/statsGETObtener estadísticas de etiqueta
https://api.mailgun.net/v3/listsGETListar mailing lists
https://api.mailgun.net/v3/domainsGETListar dominios
https://api.mailgun.net/v4/address/validatePOSTValidar una dirección de email

Región UE

Para cuentas de Mailgun basadas en la UE, usa https://api.eu.mailgun.net en vez de https://api.mailgun.net en todos los endpoints de la API.

Ejemplos de código

Inicializar el conector

import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({
apiKey: process.env.TAJO_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY
});
await tajo.connectors.connect('mailgun', {
apiKey: process.env.MAILGUN_API_KEY,
domain: process.env.MAILGUN_DOMAIN,
region: 'us'
});

Enviar un mensaje vía la API de Mailgun

// Send an email using Mailgun's Messages API
const formData = new URLSearchParams();
formData.append('from', `Your App <noreply@${domain}>`);
formData.append('to', '[email protected]');
formData.append('subject', 'Welcome to our platform');
formData.append('html', '<h1>Welcome!</h1><p>Thanks for signing up.</p>');
formData.append('o:tag', 'welcome-email');
formData.append('o:tracking', 'yes');
const response = await fetch(
`https://api.mailgun.net/v3/${domain}/messages`,
{
method: 'POST',
headers: {
'Authorization': `Basic ${Buffer.from(`api:${apiKey}`).toString('base64')}`
},
body: formData
}
);
const result = await response.json();
// { id: '<[email protected]>', message: 'Queued. Thank you.' }

Sincronizar eventos de email con Brevo

// Query Mailgun events and sync engagement data
const eventsResponse = await fetch(
`https://api.mailgun.net/v3/${domain}/events?` +
new URLSearchParams({
begin: lastSyncDate,
ascending: 'yes',
limit: 300,
event: 'delivered OR opened OR clicked'
}),
{
headers: {
'Authorization': `Basic ${Buffer.from(`api:${apiKey}`).toString('base64')}`
}
}
);
const { items, paging } = await eventsResponse.json();
for (const event of items) {
const email = event.recipient;
switch (event.event) {
case 'delivered':
await tajo.contacts.update(email, {
attributes: { MG_LAST_DELIVERED: event.timestamp }
});
break;
case 'opened':
await tajo.events.track({
email,
event: 'email_opened',
properties: { subject: event.message.headers.subject }
});
break;
case 'clicked':
await tajo.events.track({
email,
event: 'email_clicked',
properties: { url: event.url }
});
break;
}
}
// Follow pagination for more events
if (paging.next) {
// Fetch next page using paging.next URL
}

Gestionar webhooks de Mailgun

const crypto = require('crypto');
app.post('/webhooks/mailgun', async (req, res) => {
// Verify webhook signature
const { timestamp, token, signature } = req.body.signature;
const encodedToken = crypto
.createHmac('sha256', process.env.MAILGUN_WEBHOOK_SIGNING_KEY)
.update(timestamp.concat(token))
.digest('hex');
if (encodedToken !== signature) {
return res.status(401).send('Unauthorized');
}
const eventData = req.body['event-data'];
const event = eventData.event;
const email = eventData.recipient;
await tajo.connectors.handleWebhook('mailgun', {
topic: event,
payload: eventData
});
// Handle bounce suppression
if (event === 'failed' && eventData.severity === 'permanent') {
await tajo.contacts.update(email, {
attributes: { MG_BOUNCE_TYPE: 'hard_bounce' },
emailBlacklisted: true
});
}
res.status(200).send('OK');
});

Sincronizar rebotes y quejas

// Sync bounced addresses for list hygiene
const bouncesResponse = await fetch(
`https://api.mailgun.net/v3/${domain}/bounces?limit=100`,
{
headers: {
'Authorization': `Basic ${Buffer.from(`api:${apiKey}`).toString('base64')}`
}
}
);
const { items: bounces } = await bouncesResponse.json();
for (const bounce of bounces) {
await tajo.contacts.update(bounce.address, {
attributes: {
MG_BOUNCE_TYPE: bounce.error.includes('550') ? 'hard_bounce' : 'soft_bounce',
MG_BOUNCE_DATE: bounce.created_at
},
emailBlacklisted: bounce.error.includes('550')
});
}

Límites de velocidad

EndpointLímiteNotas
Messages APIVaría según el plan100/h (free), ilimitado (de pago)
Events APISin límite explícitoUsa paginación con máx. 300 elementos
Validation APISegún el planPago por validación
WebhooksTiempo realSin límite de velocidad en la entrega
Suppressions APISin límite explícitoSe aplican límites de velocidad estándar

Límites de envío

Mailgun aplica límites de envío según tu plan y la reputación del dominio. Los dominios nuevos parten de límites más bajos que aumentan a medida que mejora la reputación del remitente. Monitoriza las estadísticas de tu dominio en el panel de Mailgun.

Resolución de problemas

ProblemaCausaSolución
401 UnauthorizedClave API no válidaVerifica la clave API en el panel de Mailgun
Dominio no verificadoFaltan registros DNSAñade los registros TXT, CNAME y MX necesarios
Webhook no recibidoURL no accesibleAsegúrate de que la URL del webhook sea accesible públicamente
Faltan eventosRango de tiempo demasiado estrechoAmplía los parámetros begin/end
Baja entregabilidadReputación del dominioRevisa las estadísticas del dominio y la autenticación

Modo depuración

connectors:
mailgun:
debug: true
log_level: verbose
log_webhooks: true
log_events: true

Buenas prácticas

  1. Verifica los dominios de envío - Completa la verificación DNS para una entregabilidad óptima
  2. Usa webhooks para los eventos - La entrega en tiempo real de webhooks frente al polling de la Events API
  3. Gestiona los rebotes de forma proactiva - Suprime los hard bounces inmediatamente en Brevo
  4. Etiqueta tus mensajes - Usa etiquetas para categorizar y analizar el rendimiento del email
  5. Monitoriza la reputación del dominio - Haz seguimiento de las métricas de entregabilidad en el panel de Mailgun
  6. Usa la validación de email - Valida las direcciones antes de añadirlas a las listas de Brevo

Seguridad

  • HTTP Basic Auth - Clave API transmitida en la cabecera Authorization
  • Firmas de webhook - Verificación de firma HMAC-SHA256
  • Verificación de dominio - Autenticación DNS con SPF, DKIM y DMARC
  • Lista blanca de IPs - Disponible en planes con IP dedicada
  • Cifrado TLS - Todos los endpoints de la API requieren HTTPS
  • Rotación de claves - Rota las claves API periódicamente desde el panel de Mailgun

Recursos relacionados

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
Asistente AI

¡Hola! Pregúntame lo que quieras sobre la documentación.