Mailgun-koppling
Anslut Mailgun till Brevo via Tajo för att enhetliga dina transaktions- och marknadsföringsmejldata, synka leveranshändelser och engagemangsmått och konsolidera din e-postinfrastruktur till en enda kundvy.
Översikt
| Egenskap | Värde |
|---|---|
| Plattform | Mailgun (av Sinch) |
| Kategori | E-postmarknadsföring |
| Installationskomplexitet | Enkel |
| Officiell integration | Nej |
| Data som synkas | Händelser, kontakter, leveransbarhet, kampanjer |
| Autentiseringsmetod | API-nyckel (HTTP Basic Auth) |
Funktioner
- Synk av leveranshändelser - Spåra händelser för delivered, bounced, opened och clicked
- Engagemangsmått - Synka öppnings- och klickfrekvenser till Brevo-kontaktattribut
- Bouncehantering - Undertryck automatiskt studsade adresser i Brevo
- Klagomålshantering - Synka spam-klagomål för listhygien
- Domänreputation - Övervaka avsändardomänens hälsa och leveransbarhet
- Spårning av transaktionsmejl - Korrelera transaktionsutskick med marknadsföringsdata
Förutsättningar
Innan du börjar, se till att du har:
- Ett Mailgun-konto med en verifierad avsändardomän
- En Mailgun API-nyckel från Mailgun Dashboard
- Ett Brevo-konto med API-åtkomst
- Ett Tajo-konto med kopplingsbehörigheter
Autentisering
API-nyckelautentisering
Mailgun använder HTTP Basic Authentication med api som användarnamn och din API-nyckel som lösenord:
# 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' ...Typer av API-nycklar
Mailgun tillhandahåller domänspecifika avsändarnycklar och API-nycklar på kontonivå. Använd domänavsändarnycklar för meddelandeoperationer och API-nyckeln på kontonivå för hanteringsoperationer.
Konfiguration
Grundläggande konfiguration
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: 32Fältmappning
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-ändpunkter
| Ändpunkt | Metod | Beskrivning |
|---|---|---|
https://api.mailgun.net/v3/{domain}/messages | POST | Skicka e-postmeddelanden |
https://api.mailgun.net/v3/{domain}/events | GET | Fråga händelseloggar |
https://api.mailgun.net/v3/{domain}/bounces | GET | Lista studsar |
https://api.mailgun.net/v3/{domain}/complaints | GET | Lista klagomål |
https://api.mailgun.net/v3/{domain}/unsubscribes | GET | Lista avprenumerationer |
https://api.mailgun.net/v3/{domain}/tags | GET | Lista taggar |
https://api.mailgun.net/v3/{domain}/tags/{tag}/stats | GET | Hämta taggstatistik |
https://api.mailgun.net/v3/lists | GET | Lista utskickslistor |
https://api.mailgun.net/v3/domains | GET | Lista domäner |
https://api.mailgun.net/v4/address/validate | POST | Validera e-postadress |
EU-region
För EU-baserade Mailgun-konton, använd https://api.eu.mailgun.net istället för https://api.mailgun.net för alla API-ändpunkter.
Kodexempel
Initiera kopplingen
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'});Skicka ett meddelande via Mailgun API
// 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.' }Synka e-posthändelser till 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}Hantera Mailgun-webhooks
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');});Synka studsar och klagomål
// 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') });}API-gränser
| Ändpunkt | Gräns | Noteringar |
|---|---|---|
| Messages API | Varierar per plan | 100/h (gratis), obegränsat (betald) |
| Events API | Ingen explicit gräns | Använd paginering med max 300 objekt |
| Validation API | Baserat på plan | Betala per validering |
| Webhooks | Realtid | Ingen rate limit på leverans |
| Suppressions API | Ingen explicit gräns | Standard rate limiting tillämpas |
Utskicksgränser
Mailgun tillämpar utskicksgränser baserat på din plan och domänreputation. Nya domäner börjar med lägre gränser som ökar när din avsändarreputation förbättras. Övervaka din domänstatistik i Mailgun-dashboarden.
Felsökning
| Problem | Orsak | Lösning |
|---|---|---|
| 401 Unauthorized | Ogiltig API-nyckel | Verifiera API-nyckeln i Mailgun-dashboarden |
| Domänen är inte verifierad | DNS-poster saknas | Lägg till nödvändiga TXT-, CNAME- och MX-poster |
| Webhook tas inte emot | URL ej åtkomlig | Säkerställ att webhook-URL:en är publikt nåbar |
| Händelser saknas | Tidsintervallet är för snävt | Utöka parametrarna begin/end |
| Låg leveransbarhet | Domänreputation | Kontrollera domänstatistik och autentisering |
Debug-läge
connectors: mailgun: debug: true log_level: verbose log_webhooks: true log_events: trueBästa praxis
- Verifiera avsändardomäner - Slutför DNS-verifiering för optimal leveransbarhet
- Använd webhooks för händelser - Webhook-leverans i realtid är bättre än att pollla Events API:et
- Hantera studsar proaktivt - Undertryck hårda studsar omedelbart i Brevo
- Tagga dina meddelanden - Använd taggar för att kategorisera och analysera e-postprestanda
- Övervaka domänreputation - Följ leveransmått i Mailgun-dashboarden
- Använd e-postvalidering - Validera adresser innan du lägger till dem i Brevo-listor
Säkerhet
- HTTP Basic Auth - API-nyckel skickas via Authorization-header
- Webhook-signaturer - Verifiering med HMAC-SHA256-signatur
- Domänverifiering - DNS-autentisering med SPF, DKIM och DMARC
- IP-whitelist - Tillgängligt för planer med dedikerad IP
- TLS-kryptering - Alla API-ändpunkter kräver HTTPS
- Nyckelrotation - Rotera API-nycklar regelbundet via Mailgun-dashboarden