Konektor Mailgun
Hubungkan Mailgun ke Brevo melalui Tajo untuk menyatukan data email transaksional dan marketing Anda, menyinkronkan event pengiriman serta metrik keterlibatan, dan mengonsolidasikan infrastruktur email Anda ke dalam satu tampilan pelanggan.
Ikhtisar
| Properti | Nilai |
|---|---|
| Platform | Mailgun (dari Sinch) |
| Kategori | Email marketing |
| Kompleksitas setup | Mudah |
| Integrasi resmi | Tidak |
| Data yang disinkronkan | Event, kontak, deliverability, kampanye |
| Metode autentikasi | API key (HTTP Basic Auth) |
Fitur
- Sinkronisasi event pengiriman - Lacak event delivered, bounced, opened, dan clicked
- Metrik keterlibatan - Sinkronkan open rate dan click rate ke atribut kontak Brevo
- Pengelolaan bounce - Otomatis menekan alamat yang bounce di Brevo
- Penanganan keluhan - Sinkronkan keluhan spam untuk menjaga higienitas daftar
- Reputasi domain - Pantau kesehatan domain pengirim dan deliverability
- Pelacakan email transaksional - Korelasikan pengiriman transaksional dengan data marketing
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
- Akun Mailgun dengan domain pengirim yang terverifikasi
- API key Mailgun dari Mailgun Dashboard
- Akun Brevo dengan akses API
- Akun Tajo dengan izin konektor
Autentikasi
Autentikasi API key
Mailgun memakai HTTP Basic Authentication dengan api sebagai username dan API key Anda sebagai 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' ...Tipe API key
Mailgun menyediakan sending key khusus domain dan API key tingkat akun. Gunakan sending key domain untuk operasi pesan dan API key akun untuk operasi pengelolaan.
Konfigurasi
Setup dasar
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: 32Pemetaan field
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 | Method | Deskripsi |
|---|---|---|
https://api.mailgun.net/v3/{domain}/messages | POST | Mengirim pesan email |
https://api.mailgun.net/v3/{domain}/events | GET | Mengueri log event |
https://api.mailgun.net/v3/{domain}/bounces | GET | Menampilkan bounce |
https://api.mailgun.net/v3/{domain}/complaints | GET | Menampilkan keluhan |
https://api.mailgun.net/v3/{domain}/unsubscribes | GET | Menampilkan unsubscribe |
https://api.mailgun.net/v3/{domain}/tags | GET | Menampilkan tag |
https://api.mailgun.net/v3/{domain}/tags/{tag}/stats | GET | Mengambil statistik tag |
https://api.mailgun.net/v3/lists | GET | Menampilkan mailing list |
https://api.mailgun.net/v3/domains | GET | Menampilkan domain |
https://api.mailgun.net/v4/address/validate | POST | Memvalidasi alamat email |
Region EU
Untuk akun Mailgun yang berbasis di EU, gunakan https://api.eu.mailgun.net alih-alih https://api.mailgun.net untuk seluruh endpoint API.
Contoh kode
Inisialisasi konektor
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'});Mengirim pesan melalui 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.' }Sinkronisasi event email ke 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}Menangani 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');});Sinkronisasi bounce dan keluhan
// 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') });}Batas rate
| Endpoint | Batas | Catatan |
|---|---|---|
| Messages API | Bergantung paket | 100/jam (gratis), tanpa batas (berbayar) |
| Events API | Tidak ada batas eksplisit | Gunakan paginasi dengan maksimum 300 item |
| Validation API | Bergantung paket | Bayar per validasi |
| Webhook | Real-time | Tidak ada batas rate pada pengiriman |
| Suppressions API | Tidak ada batas eksplisit | Berlaku pembatasan rate standar |
Batas pengiriman
Mailgun menerapkan batas pengiriman berdasarkan paket dan reputasi domain Anda. Domain baru dimulai dengan batas yang lebih rendah dan meningkat seiring membaiknya reputasi pengirim Anda. Pantau statistik domain Anda di dashboard Mailgun.
Pemecahan masalah
| Masalah | Penyebab | Solusi |
|---|---|---|
| 401 Unauthorized | API key tidak valid | Periksa API key di dashboard Mailgun |
| Domain belum terverifikasi | Record DNS belum ada | Tambahkan record TXT, CNAME, dan MX yang dibutuhkan |
| Webhook tidak diterima | URL tidak dapat diakses | Pastikan URL webhook dapat dijangkau publik |
| Event hilang | Rentang waktu terlalu sempit | Perlebar parameter begin/end |
| Deliverability rendah | Reputasi domain | Periksa statistik domain dan autentikasinya |
Mode debug
connectors: mailgun: debug: true log_level: verbose log_webhooks: true log_events: truePraktik terbaik
- Verifikasi domain pengirim - Selesaikan verifikasi DNS demi deliverability optimal
- Gunakan webhook untuk event - Pengiriman webhook real-time lebih baik daripada polling Events API
- Tangani bounce secara proaktif - Tekan hard bounce segera di Brevo
- Beri tag pada pesan Anda - Gunakan tag untuk mengategorikan dan menganalisis performa email
- Pantau reputasi domain - Lacak metrik deliverability di dashboard Mailgun
- Gunakan validasi email - Validasi alamat sebelum menambahkannya ke daftar Brevo
Keamanan
- HTTP Basic Auth - API key dikirim melalui header Authorization
- Tanda tangan webhook - Verifikasi tanda tangan HMAC-SHA256
- Verifikasi domain - Autentikasi DNS SPF, DKIM, dan DMARC
- Whitelist IP - Tersedia untuk paket dedicated IP
- Enkripsi TLS - Seluruh endpoint API mewajibkan HTTPS
- Rotasi key - Rotasikan API key secara berkala melalui dashboard Mailgun