Mailgun Connector
เชื่อมต่อ Mailgun กับ Brevo ผ่าน Tajo เพื่อรวมข้อมูลอีเมล transactional และ marketing ซิงค์เหตุการณ์การส่งและ metrics engagement และรวมโครงสร้างพื้นฐานอีเมลของคุณเป็น customer view เดียว
ภาพรวม
| คุณสมบัติ | ค่า |
|---|---|
| แพลตฟอร์ม | Mailgun (by Sinch) |
| หมวดหมู่ | Email Marketing |
| ความซับซ้อนในการตั้งค่า | ง่าย |
| การผสานรวมอย่างเป็นทางการ | ไม่ |
| ข้อมูลที่ซิงค์ | เหตุการณ์ ผู้ติดต่อ Deliverability แคมเปญ |
| วิธีการยืนยันตัวตน | API Key (HTTP Basic Auth) |
ฟีเจอร์
- การซิงค์เหตุการณ์การส่ง - ติดตามเหตุการณ์ delivered, bounced, opened และ clicked
- Engagement metrics - ซิงค์อัตราการเปิดและคลิกไปยัง Brevo contact attributes
- การจัดการ Bounce - ระงับที่อยู่ที่ bounce โดยอัตโนมัติใน Brevo
- การจัดการ Complaint - ซิงค์การร้องเรียน spam สำหรับการดูแล list
- ชื่อเสียง Domain - ตรวจสอบสุขภาพของ sending domain และ deliverability
- การติดตาม Transactional email - เชื่อมโยงการส่ง transactional กับข้อมูล marketing
ข้อกำหนดเบื้องต้น
ก่อนเริ่มต้น ตรวจสอบให้แน่ใจว่าคุณมี:
- บัญชี Mailgun ที่มี sending domain ที่ได้รับการยืนยัน
- Mailgun API key จาก Mailgun Dashboard
- บัญชี Brevo ที่มีสิทธิ์เข้าถึง API
- บัญชี Tajo ที่มีสิทธิ์ connector
การยืนยันตัวตน
การยืนยันตัวตนด้วย API Key
Mailgun ใช้ HTTP Basic Authentication โดยใช้ api เป็น username และ API key ของคุณเป็น 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' ...ประเภท API Key
Mailgun มี domain-specific sending keys และ account-level API keys ใช้ domain sending keys สำหรับการดำเนินการข้อความ และ account API key สำหรับการดำเนินการจัดการ
การกำหนดค่า
การตั้งค่าพื้นฐาน
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การแมปฟิลด์
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 | เมธอด | คำอธิบาย |
|---|---|---|
https://api.mailgun.net/v3/{domain}/messages | POST | ส่งข้อความอีเมล |
https://api.mailgun.net/v3/{domain}/events | GET | Query บันทึกเหตุการณ์ |
https://api.mailgun.net/v3/{domain}/bounces | GET | แสดงรายการ bounces |
https://api.mailgun.net/v3/{domain}/complaints | GET | แสดงรายการการร้องเรียน |
https://api.mailgun.net/v3/{domain}/unsubscribes | GET | แสดงรายการการยกเลิกสมัคร |
https://api.mailgun.net/v3/{domain}/tags | GET | แสดงรายการ tags |
https://api.mailgun.net/v3/{domain}/tags/{tag}/stats | GET | ดึงสถิติ tag |
https://api.mailgun.net/v3/lists | GET | แสดงรายการ mailing lists |
https://api.mailgun.net/v3/domains | GET | แสดงรายการ domains |
https://api.mailgun.net/v4/address/validate | POST | ตรวจสอบที่อยู่อีเมล |
EU Region
สำหรับบัญชี Mailgun ที่ใช้ EU ใช้ https://api.eu.mailgun.net แทน https://api.mailgun.net สำหรับ API endpoints ทั้งหมด
ตัวอย่างโค้ด
เริ่มต้น Connector
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'});ส่งข้อความผ่าน 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.' }ซิงค์เหตุการณ์อีเมลไปยัง 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}จัดการ 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');});ซิงค์ Bounces และ Complaints
// 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') });}ขีดจำกัดอัตรา
| Endpoint | ขีดจำกัด | หมายเหตุ |
|---|---|---|
| Messages API | ขึ้นอยู่กับแผน | 100/ชั่วโมง (ฟรี), ไม่จำกัด (有料) |
| Events API | ไม่มีขีดจำกัดชัดเจน | ใช้ pagination สูงสุด 300 รายการ |
| Validation API | ตามแผน | คิดค่าบริการต่อการตรวจสอบ |
| Webhooks | Real-time | ไม่มี rate limit ในการส่ง |
| Suppressions API | ไม่มีขีดจำกัดชัดเจน | ใช้ standard rate limiting |
ขีดจำกัดการส่ง
Mailgun บังคับใช้ขีดจำกัดการส่งตามแผนและชื่อเสียงของ domain ของคุณ Domains ใหม่เริ่มต้นด้วยขีดจำกัดที่ต่ำกว่าซึ่งเพิ่มขึ้นเมื่อชื่อเสียงผู้ส่งของคุณดีขึ้น ตรวจสอบสถิติ domain ของคุณใน Mailgun dashboard
การแก้ไขปัญหา
| ปัญหา | สาเหตุ | วิธีแก้ |
|---|---|---|
| 401 Unauthorized | API key ไม่ถูกต้อง | ตรวจสอบ API key ใน Mailgun dashboard |
| Domain ไม่ได้รับการยืนยัน | DNS records หายไป | เพิ่ม TXT, CNAME, MX records ที่จำเป็น |
| ไม่ได้รับ Webhook | URL ไม่สามารถเข้าถึงได้ | ตรวจสอบว่า webhook URL สามารถเข้าถึงได้สาธารณะ |
| เหตุการณ์หายไป | ช่วงเวลาแคบเกินไป | ขยายพารามิเตอร์ begin/end |
| Deliverability ต่ำ | ชื่อเสียง domain | ตรวจสอบสถิติ domain และการยืนยันตัวตน |
โหมด Debug
connectors: mailgun: debug: true log_level: verbose log_webhooks: true log_events: trueแนวทางปฏิบัติที่ดีที่สุด
- ยืนยัน sending domains - ทำการยืนยัน DNS ให้สมบูรณ์เพื่อ deliverability ที่ดีที่สุด
- ใช้ webhooks สำหรับเหตุการณ์ - การส่ง webhook แบบ real-time แทนการ polling Events API
- จัดการ bounces เชิงรุก - ระงับ hard bounces ทันทีใน Brevo
- ติด tag ข้อความของคุณ - ใช้ tags เพื่อจัดหมวดหมู่และวิเคราะห์ประสิทธิภาพอีเมล
- ตรวจสอบชื่อเสียง domain - ติดตาม metrics deliverability ใน Mailgun dashboard
- ใช้การตรวจสอบอีเมล - ตรวจสอบที่อยู่ก่อนเพิ่มในรายการ Brevo
ความปลอดภัย
- HTTP Basic Auth - API key ส่งผ่าน Authorization header
- Webhook signatures - การตรวจสอบ HMAC-SHA256 signature
- การยืนยัน Domain - การยืนยันตัวตน DNS ด้วย SPF, DKIM และ DMARC
- IP whitelisting - มีให้สำหรับแผน dedicated IP
- การเข้ารหัส TLS - API endpoints ทั้งหมดต้องการ HTTPS
- Key rotation - หมุนเวียน API keys เป็นระยะผ่าน Mailgun dashboard