Mailgun Connector
Verbinde Mailgun über Tajo mit Brevo, um deine Transactional- und Marketing-E-Mail-Daten zu vereinheitlichen, Zustell-Events und Engagement-Metriken zu synchronisieren und deine E-Mail-Infrastruktur in einer einzigen Kundensicht zu konsolidieren.
Überblick
| Eigenschaft | Wert |
|---|---|
| Plattform | Mailgun (by Sinch) |
| Kategorie | E-Mail-Marketing |
| Einrichtungsaufwand | Einfach |
| Offizielle Integration | Nein |
| Synchronisierte Daten | Events, Kontakte, Zustellbarkeit, Kampagnen |
| Auth-Methode | API-Schlüssel (HTTP Basic Auth) |
Funktionen
- Zustell-Event-Sync - Tracke Delivered-, Bounced-, Opened- und Clicked-Events
- Engagement-Metriken - Synchronisiere Open- und Click-Rates in Brevo-Kontaktattribute
- Bounce-Management - Unterdrücke gebouncte Adressen automatisch in Brevo
- Umgang mit Spam-Beschwerden - Synchronisiere Spam-Complaints für die Listen-Hygiene
- Domain-Reputation - Überwache die Gesundheit der Sender-Domain und die E-Mail-Zustellbarkeit
- Tracking von Transactional-E-Mails - Verbinde Transactional-Sends mit Marketingdaten
Voraussetzungen
Bevor du beginnst, stelle sicher, dass du Folgendes hast:
- Ein Mailgun-Konto mit einer verifizierten Sender-Domain
- Einen Mailgun-API-Schlüssel aus dem Mailgun-Dashboard
- Ein Brevo-Konto mit API-Zugriff
- Ein Tajo-Konto mit Connector-Berechtigungen
Authentifizierung
API-Schlüssel-Authentifizierung
Mailgun nutzt HTTP Basic Authentication mit api als Benutzername und deinem API-Schlüssel als Passwort:
# 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' ...API-Schlüssel-Typen
Mailgun bietet domain-spezifische Sending Keys und kontoweite API-Schlüssel an. Nutze Domain-Sending-Keys für Messaging-Operationen und den Account-API-Schlüssel für administrative Aufgaben.
Konfiguration
Grundeinrichtung
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: 32Feldzuordnung
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-Endpoints
| Endpoint | Methode | Beschreibung |
|---|---|---|
https://api.mailgun.net/v3/{domain}/messages | POST | E-Mail-Nachrichten versenden |
https://api.mailgun.net/v3/{domain}/events | GET | Event-Logs abfragen |
https://api.mailgun.net/v3/{domain}/bounces | GET | Bounces auflisten |
https://api.mailgun.net/v3/{domain}/complaints | GET | Complaints auflisten |
https://api.mailgun.net/v3/{domain}/unsubscribes | GET | Abmeldungen auflisten |
https://api.mailgun.net/v3/{domain}/tags | GET | Tags auflisten |
https://api.mailgun.net/v3/{domain}/tags/{tag}/stats | GET | Statistiken für ein Tag abrufen |
https://api.mailgun.net/v3/lists | GET | Mailing-Listen auflisten |
https://api.mailgun.net/v3/domains | GET | Domains auflisten |
https://api.mailgun.net/v4/address/validate | POST | E-Mail-Adresse validieren |
EU-Region
Nutze für Mailgun-Konten in der EU https://api.eu.mailgun.net statt https://api.mailgun.net für alle API-Endpoints.
Code-Beispiele
Connector initialisieren
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'});Eine Nachricht über die Mailgun-API senden
// 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.' }E-Mail-Events mit Brevo synchronisieren
// 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}Mailgun-Webhooks verarbeiten
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 und Complaints synchronisieren
// 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') });}Rate Limits
| Endpoint | Limit | Hinweise |
|---|---|---|
| Messages API | Variiert je nach Plan | 100/Std. (Free), unbegrenzt (Paid) |
| Events API | Kein explizites Limit | Pagination mit max. 300 Items nutzen |
| Validation API | Abhängig vom Plan | Pay-per-Validation |
| Webhooks | Echtzeit | Kein Rate Limit bei der Zustellung |
| Suppressions API | Kein explizites Limit | Standard-Rate-Limiting gilt |
Versand-Limits
Mailgun wendet Versand-Limits abhängig von deinem Plan und der Domain-Reputation an. Neue Domains starten mit niedrigeren Limits, die mit steigender Absender-Reputation zunehmen. Behalte die Domain-Statistiken im Mailgun-Dashboard im Blick.
Fehlerbehebung
| Problem | Ursache | Lösung |
|---|---|---|
| 401 Unauthorized | Ungültiger API-Schlüssel | API-Schlüssel im Mailgun-Dashboard prüfen |
| Domain nicht verifiziert | DNS-Einträge fehlen | Erforderliche TXT-, CNAME-, MX-Einträge ergänzen |
| Webhook nicht empfangen | URL nicht erreichbar | Sicherstellen, dass die Webhook-URL öffentlich erreichbar ist |
| Events fehlen | Zeitraum zu eng | Die Parameter begin/end erweitern |
| Niedrige Zustellbarkeit | Domain-Reputation | Domain-Statistiken und Authentifizierung überprüfen |
Debug-Modus
connectors: mailgun: debug: true log_level: verbose log_webhooks: true log_events: trueBest Practices
- Sender-Domains verifizieren - Schließe die DNS-Verifizierung für eine optimale E-Mail-Zustellbarkeit ab
- Webhooks für Events nutzen - Echtzeit-Webhook-Zustellung statt Polling der Events-API
- Proaktiv mit Bounces umgehen - Hard Bounces sofort in Brevo unterdrücken
- Nachrichten taggen - Nutze Tags, um die E-Mail-Performance zu kategorisieren und zu analysieren
- Domain-Reputation überwachen - Verfolge die Zustellbarkeitsmetriken im Mailgun-Dashboard
- E-Mail-Validierung nutzen - Validiere Adressen, bevor du sie zu Brevo-Listen hinzufügst
Sicherheit
- HTTP Basic Auth - Der API-Schlüssel wird über den Authorization-Header übertragen
- Webhook-Signaturen - HMAC-SHA256-Signaturprüfung
- Domain-Verifizierung - SPF-, DKIM- und DMARC-DNS-Authentifizierung
- IP-Whitelisting - Verfügbar bei Plänen mit dedizierter IP
- TLS-Verschlüsselung - Alle API-Endpoints erfordern HTTPS
- Schlüsselrotation - Rotiere API-Schlüssel regelmäßig über das Mailgun-Dashboard