Mailgun-connector

Verbind Mailgun met Brevo via Tajo om je transactionele en marketing-e-maildata te verenigen, leverings-events en engagement-metrics te synchroniseren en je e-mailinfrastructuur te consolideren in één klantbeeld.

Overzicht

EigenschapWaarde
PlatformMailgun (by Sinch)
CategorieEmail Marketing
SetupcomplexiteitEenvoudig
Officiële integratieNee
Gesynchroniseerde dataEvents, Contacten, Deliverability, Campagnes
Auth-methodeAPI-sleutel (HTTP Basic Auth)

Functies

  • Leverings-event-sync - Track events voor delivered, bounced, opened en clicked
  • Engagement-metrics - Synchroniseer open- en click-rates naar Brevo-contactattributen
  • Bouncebeheer - Onderdruk gebouncete adressen automatisch in Brevo
  • Klachtafhandeling - Synchroniseer spamklachten voor lijsthygiëne
  • Domeinreputatie - Monitor de gezondheid en deliverability van je senderdomein
  • Transactionele e-mail-tracking - Correleer transactionele sends met marketingdata

Vereisten

Voordat je begint, zorg dat je beschikt over:

  1. Een Mailgun-account met een geverifieerd senderdomein
  2. Een Mailgun API-sleutel uit het Mailgun Dashboard
  3. Een Brevo-account met API-toegang
  4. Een Tajo-account met connector-rechten

Authenticatie

API-sleutel-authenticatie

Mailgun gebruikt HTTP Basic Authentication met api als gebruikersnaam en je API-sleutel als wachtwoord:

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' ...

Typen API-sleutels

Mailgun biedt domeinspecifieke sending keys en account-level API-sleutels. Gebruik domain sending keys voor berichtenoperaties en de account-API-sleutel voor beheeroperaties.

Configuratie

Basisopzet

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

Veldmapping

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

API-endpoints

EndpointMethodeBeschrijving
https://api.mailgun.net/v3/{domain}/messagesPOSTE-mailberichten verzenden
https://api.mailgun.net/v3/{domain}/eventsGETEvent-logs opvragen
https://api.mailgun.net/v3/{domain}/bouncesGETBounces opvragen
https://api.mailgun.net/v3/{domain}/complaintsGETKlachten opvragen
https://api.mailgun.net/v3/{domain}/unsubscribesGETUitschrijvingen opvragen
https://api.mailgun.net/v3/{domain}/tagsGETTags opvragen
https://api.mailgun.net/v3/{domain}/tags/{tag}/statsGETTag-statistieken ophalen
https://api.mailgun.net/v3/listsGETMailinglijsten opvragen
https://api.mailgun.net/v3/domainsGETDomeinen opvragen
https://api.mailgun.net/v4/address/validatePOSTE-mailadres valideren

EU-regio

Gebruik voor Mailgun-accounts in de EU https://api.eu.mailgun.net in plaats van https://api.mailgun.net voor alle API-endpoints.

Codevoorbeelden

Connector initialiseren

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'
});

Bericht versturen via de Mailgun API

// 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.' }

E-mail-events naar Brevo synchroniseren

// 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
}

Mailgun-webhooks afhandelen

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');
});

Bounces en klachten synchroniseren

// 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')
});
}

Ratelimits

EndpointLimietOpmerkingen
Messages APIVarieert per plan100/uur (free), onbeperkt (betaald)
Events APIGeen expliciete limietGebruik paginatie met max 300 items
Validation APIOp basis van planPay-per-validation
WebhooksRealtimeGeen ratelimit op levering
Suppressions APIGeen expliciete limietStandaard rate-limiting van toepassing

Verzendlimieten

Mailgun hanteert verzendlimieten op basis van je plan en domeinreputatie. Nieuwe domeinen starten met lagere limieten die toenemen naarmate je sender-reputatie verbetert. Monitor je domeinstatistieken in het Mailgun-dashboard.

Probleemoplossing

ProbleemOorzaakOplossing
401 UnauthorizedOngeldige API-sleutelVerifieer de API-sleutel in het Mailgun-dashboard
Domein niet geverifieerdOntbrekende DNS-recordsVoeg de vereiste TXT-, CNAME- en MX-records toe
Webhook niet ontvangenURL niet bereikbaarZorg dat de webhook-URL publiekelijk bereikbaar is
Events ontbrekenTijdsbereik te smalVerruim begin/end-parameters
Lage deliverabilityDomeinreputatieControleer domeinstats en authenticatie

Debugmodus

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

Best practices

  1. Verifieer senderdomeinen - Rond DNS-verificatie af voor optimale deliverability
  2. Gebruik webhooks voor events - Realtime-webhook-levering in plaats van polling van de Events API
  3. Handel bounces proactief af - Onderdruk hard bounces direct in Brevo
  4. Tag je berichten - Gebruik tags om e-mailprestaties te categoriseren en analyseren
  5. Monitor domeinreputatie - Volg deliverabilitymetrics in het Mailgun-dashboard
  6. Gebruik e-mailvalidatie - Valideer adressen voordat je ze aan Brevo-lijsten toevoegt

Beveiliging

  • HTTP Basic Auth - API-sleutel verzonden via Authorization-header
  • Webhook-signatures - HMAC-SHA256-signatureverificatie
  • Domeinverificatie - SPF, DKIM en DMARC DNS-authenticatie
  • IP-whitelisting - Beschikbaar voor dedicated IP-plannen
  • TLS-encryptie - Alle API-endpoints vereisen HTTPS
  • Sleutelrotatie - Rouleer API-sleutels periodiek via het Mailgun-dashboard

Gerelateerde resources

Subscribe to updates

developer-docs

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

auto-detect
AI-assistent

Hallo! Stel me vragen over de documentatie.