Mailgun-kobling
Koble Mailgun til Brevo gjennom Tajo for å forene transaksjonelle og markedsføringsrelaterte e-postdata, synkronisere leveranshendelser og engasjementsmålinger og konsolidere e-postinfrastrukturen din til ett enkelt kundebilde.
Oversikt
| Egenskap | Verdi |
|---|---|
| Plattform | Mailgun (fra Sinch) |
| Kategori | E-postmarkedsføring |
| Oppsettskompleksitet | Enkel |
| Offisiell integrasjon | Nei |
| Synkroniserte data | Hendelser, kontakter, leveringskvalitet, kampanjer |
| Autentiseringsmetode | API-nøkkel (HTTP Basic Auth) |
Funksjoner
- Synkronisering av leveranshendelser - Spor levert, returnert, åpnet og klikket-hendelser
- Engasjementsmålinger - Synkroniser åpnings- og klikkrater til Brevo-kontaktattributter
- Returhåndtering - Undertrykk returnerte adresser i Brevo automatisk
- Klagehåndtering - Synkroniser spamklager for listehygiene
- Domenerenommé - Overvåk sendedomenets helse og leveringskvalitet
- Sporing av transaksjonell e-post - Korreler transaksjonelle sendinger med markedsføringsdata
Forutsetninger
Før du begynner, sørg for at du har:
- En Mailgun-konto med et verifisert sendedomene
- En Mailgun API-nøkkel fra Mailgun-dashbordet
- En Brevo-konto med API-tilgang
- En Tajo-konto med konnektor-rettigheter
Autentisering
API-nøkkelautentisering
Mailgun bruker HTTP Basic Authentication med api som brukernavn og API-nøkkelen din som passord:
# Hent API-nøkkelen din fra 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')}`};
// Eller med curl// curl -s --user 'api:YOUR_API_KEY' ...API-nøkkeltyper
Mailgun tilbyr domenespesifikke sendenøkler og API-nøkler på kontonivå. Bruk domene-sendenøkler for meldingsoperasjoner og konto-API-nøkkelen for administrasjonsoperasjoner.
Konfigurasjon
Grunnleggende oppsett
connectors: mailgun: enabled: true api_key: "${MAILGUN_API_KEY}" domain: "${MAILGUN_DOMAIN}" region: "us" # eller "eu" for EU-region
sync: events: true contacts: true bounces: true complaints: true schedule: "*/15 * * * *" # Hvert 15. minutt
webhook: signing_key: "${MAILGUN_WEBHOOK_SIGNING_KEY}"
lists: engaged: 30 bounced: 31 complained: 32Feltmapping
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_UNSUBSCRIBEDAPI-endepunkter
| Endepunkt | Metode | Beskrivelse |
|---|---|---|
https://api.mailgun.net/v3/{domain}/messages | POST | Send e-postmeldinger |
https://api.mailgun.net/v3/{domain}/events | GET | Spør hendelseslogger |
https://api.mailgun.net/v3/{domain}/bounces | GET | List returer |
https://api.mailgun.net/v3/{domain}/complaints | GET | List klager |
https://api.mailgun.net/v3/{domain}/unsubscribes | GET | List avmeldinger |
https://api.mailgun.net/v3/{domain}/tags | GET | List tagger |
https://api.mailgun.net/v3/{domain}/tags/{tag}/stats | GET | Hent tagg-statistikk |
https://api.mailgun.net/v3/lists | GET | List sendelister |
https://api.mailgun.net/v3/domains | GET | List domener |
https://api.mailgun.net/v4/address/validate | POST | Valider e-postadresse |
EU-region
For EU-baserte Mailgun-kontoer, bruk https://api.eu.mailgun.net i stedet for https://api.mailgun.net for alle API-endepunkter.
Kodeeksempler
Initialiser kobling
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'});Send en melding via Mailgun API
// Send en e-post med Mailguns 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.' }Synkroniser e-posthendelser til Brevo
// Spør Mailgun-hendelser og synkroniser engasjementsdataconst 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; }}
// Følg paginering for flere hendelserif (paging.next) { // Hent neste side med paging.next-URL}Håndter Mailgun-webhooks
const crypto = require('crypto');
app.post('/webhooks/mailgun', async (req, res) => { // Verifiser webhook-signatur 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 });
// Håndter returundertrykking if (event === 'failed' && eventData.severity === 'permanent') { await tajo.contacts.update(email, { attributes: { MG_BOUNCE_TYPE: 'hard_bounce' }, emailBlacklisted: true }); }
res.status(200).send('OK');});Synkroniser returer og klager
// Synkroniser returnerte adresser for listehygieneconst 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') });}Ratebegrensninger
| Endepunkt | Grense | Merknader |
|---|---|---|
| Messages API | Varierer etter plan | 100/time (gratis), ubegrenset (betalt) |
| Events API | Ingen eksplisitt grense | Bruk paginering med maks 300 elementer |
| Validation API | Basert på plan | Betaling per validering |
| Webhooks | Sanntid | Ingen ratebegrensning på levering |
| Suppressions API | Ingen eksplisitt grense | Standard ratebegrensning gjelder |
Sendegrenser
Mailgun håndhever sendegrenser basert på planen din og domenerenommé. Nye domener starter med lavere grenser som øker når senderens omdømme forbedres. Overvåk domenestatistikken i Mailgun-dashbordet.
Feilsøking
| Problem | Årsak | Løsning |
|---|---|---|
| 401 Unauthorized | Ugyldig API-nøkkel | Verifiser API-nøkkelen i Mailgun-dashbordet |
| Domene ikke verifisert | DNS-poster mangler | Legg til nødvendige TXT-, CNAME-, MX-poster |
| Webhook ikke mottatt | URL ikke tilgjengelig | Sørg for at webhook-URL er offentlig tilgjengelig |
| Manglende hendelser | Tidsintervall for smalt | Utvid begin-/end-parameterne |
| Lav leveringskvalitet | Domenerenommé | Sjekk domenestatistikk og autentisering |
Feilsøkingsmodus
connectors: mailgun: debug: true log_level: verbose log_webhooks: true log_events: trueBeste praksis
- Verifiser sendedomener - Fullfør DNS-verifisering for optimal leveringskvalitet
- Bruk webhooks for hendelser - Sanntids webhook-levering fremfor polling av Events API
- Håndter returer proaktivt - Undertrykk harde returer umiddelbart i Brevo
- Tagg meldingene dine - Bruk tagger for å kategorisere og analysere e-postytelse
- Overvåk domenerenommé - Spor leveringskvalitetsmetrikker i Mailgun-dashbordet
- Bruk e-postvalidering - Valider adresser før de legges til i Brevo-lister
Sikkerhet
- HTTP Basic Auth - API-nøkkel overføres via Authorization-header
- Webhook-signaturer - HMAC-SHA256-signaturverifisering
- Domeneverifisering - SPF-, DKIM- og DMARC-DNS-autentisering
- IP-hviteliste - Tilgjengelig for dedikerte IP-planer
- TLS-kryptering - Alle API-endepunkter krever HTTPS
- Nøkkelrotasjon - Roter API-nøkler regelmessig via Mailgun-dashbordet