Connettore Mailgun
Collega Mailgun a Brevo tramite Tajo per unificare i dati delle email transazionali e marketing, sincronizzare eventi di consegna e metriche di engagement, e consolidare la tua infrastruttura email in un’unica visione cliente.
Panoramica
| Proprietà | Valore |
|---|---|
| Piattaforma | Mailgun (by Sinch) |
| Categoria | Email Marketing |
| Complessità di setup | Facile |
| Integrazione ufficiale | No |
| Dati sincronizzati | Eventi, Contatti, Deliverability, Campagne |
| Metodo di autenticazione | Chiave API (HTTP Basic Auth) |
Funzionalità
- Sync eventi di consegna - Traccia eventi di consegna, bounce, apertura e click
- Metriche di engagement - Sincronizza i tassi di apertura e click agli attributi di contatto Brevo
- Gestione bounce - Sopprimi automaticamente gli indirizzi in bounce in Brevo
- Gestione complaint - Sincronizza i complaint spam per l’igiene della lista
- Reputazione del dominio - Monitora la salute del dominio mittente e la deliverability
- Tracciamento email transazionali - Correla gli invii transazionali con i dati marketing
Prerequisiti
Prima di iniziare, assicurati di avere:
- Un account Mailgun con un dominio mittente verificato
- Una chiave API Mailgun dalla dashboard Mailgun
- Un account Brevo con accesso API
- Un account Tajo con permessi connector
Autenticazione
Autenticazione con chiave API
Mailgun utilizza HTTP Basic Authentication con api come username e la tua chiave API come password:
# Get your API key from https://app.mailgun.com/settings/api_securityexport MAILGUN_API_KEY=key-your-api-keyexport MAILGUN_DOMAIN=your-domain.comexport TAJO_API_KEY=your_tajo_api_keyexport BREVO_API_KEY=your_brevo_api_key// HTTP Basic Auth formatconst headers = { 'Authorization': `Basic ${Buffer.from( `api:${process.env.MAILGUN_API_KEY}` ).toString('base64')}`};
// Or using curl// curl -s --user 'api:YOUR_API_KEY' ...Tipi di chiave API
Mailgun fornisce chiavi di invio specifiche per dominio e chiavi API a livello account. Usa le chiavi di invio del dominio per le operazioni sui messaggi e la chiave API account per le operazioni di gestione.
Configurazione
Setup di base
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: 32Mappatura dei campi
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_UNSUBSCRIBEDEndpoint API
| Endpoint | Metodo | Descrizione |
|---|---|---|
https://api.mailgun.net/v3/{domain}/messages | POST | Invia messaggi email |
https://api.mailgun.net/v3/{domain}/events | GET | Interroga i log degli eventi |
https://api.mailgun.net/v3/{domain}/bounces | GET | Elenca i bounce |
https://api.mailgun.net/v3/{domain}/complaints | GET | Elenca i complaint |
https://api.mailgun.net/v3/{domain}/unsubscribes | GET | Elenca le disiscrizioni |
https://api.mailgun.net/v3/{domain}/tags | GET | Elenca i tag |
https://api.mailgun.net/v3/{domain}/tags/{tag}/stats | GET | Ottieni le statistiche di un tag |
https://api.mailgun.net/v3/lists | GET | Elenca le mailing list |
https://api.mailgun.net/v3/domains | GET | Elenca i domini |
https://api.mailgun.net/v4/address/validate | POST | Convalida un indirizzo email |
Regione EU
Per gli account Mailgun basati in UE, usa https://api.eu.mailgun.net invece di https://api.mailgun.net per tutti gli endpoint API.
Esempi di codice
Inizializza il connettore
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'});Invia un messaggio tramite l’API Mailgun
// Send an email using Mailgun's Messages APIconst formData = new URLSearchParams();formData.append('from', `Your App <noreply@${domain}>`);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.' }Sincronizza gli eventi email su Brevo
// Query Mailgun events and sync engagement dataconst 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 eventsif (paging.next) { // Fetch next page using paging.next URL}Gestisci i webhook 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');});Sincronizza bounce e complaint
// Sync bounced addresses for list hygieneconst 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') });}Limiti di velocità
| Endpoint | Limite | Note |
|---|---|---|
| Messages API | Varia in base al piano | 100/h (gratuito), illimitato (a pagamento) |
| Events API | Nessun limite esplicito | Usa la paginazione con max 300 elementi |
| Validation API | Basato sul piano | Pay-per-validation |
| Webhook | Tempo reale | Nessun limite di velocità sulla consegna |
| Suppressions API | Nessun limite esplicito | Si applica il rate limiting standard |
Limiti di invio
Mailgun applica limiti di invio in base al tuo piano e alla reputazione del dominio. I nuovi domini iniziano con limiti più bassi che aumentano con il miglioramento della reputazione mittente. Monitora le statistiche del dominio nella dashboard Mailgun.
Risoluzione dei problemi
| Problema | Causa | Soluzione |
|---|---|---|
| 401 Unauthorized | Chiave API non valida | Verifica la chiave API nella dashboard Mailgun |
| Dominio non verificato | Record DNS mancanti | Aggiungi i record TXT, CNAME, MX richiesti |
| Webhook non ricevuto | URL non accessibile | Assicurati che l’URL del webhook sia raggiungibile pubblicamente |
| Eventi mancanti | Intervallo temporale troppo stretto | Espandi i parametri begin/end |
| Bassa deliverability | Reputazione del dominio | Controlla statistiche del dominio e autenticazione |
Modalità debug
connectors: mailgun: debug: true log_level: verbose log_webhooks: true log_events: trueBest practice
- Verifica i domini di invio - Completa la verifica DNS per una deliverability ottimale
- Usa i webhook per gli eventi - Consegna webhook in tempo reale rispetto al polling dell’Events API
- Gestisci i bounce in modo proattivo - Sopprimi immediatamente gli hard bounce in Brevo
- Tagga i tuoi messaggi - Usa i tag per categorizzare e analizzare la performance email
- Monitora la reputazione del dominio - Traccia le metriche di deliverability nella dashboard Mailgun
- Usa la validazione email - Convalida gli indirizzi prima di aggiungerli alle liste Brevo
Sicurezza
- HTTP Basic Auth - Chiave API trasmessa tramite header Authorization
- Firme webhook - Verifica firma HMAC-SHA256
- Verifica del dominio - Autenticazione DNS SPF, DKIM e DMARC
- IP whitelisting - Disponibile per piani con IP dedicato
- Cifratura TLS - Tutti gli endpoint API richiedono HTTPS
- Rotazione delle chiavi - Ruota le chiavi API periodicamente tramite la dashboard Mailgun