موصل Mailgun
اربط Mailgun بـ Brevo من خلال Tajo لتوحيد بيانات البريد الإلكتروني المعاملاتي والتسويقي، ومزامنة أحداث التسليم ومقاييس التفاعل، ودمج البنية التحتية للبريد الإلكتروني في عرض عميل واحد.
نظرة عامة
| الخاصية | القيمة |
|---|---|
| المنصة | Mailgun (من Sinch) |
| الفئة | التسويق عبر البريد الإلكتروني |
| تعقيد الإعداد | سهل |
| تكامل رسمي | لا |
| البيانات المُزامَنة | أحداث، جهات اتصال، قابلية التسليم، حملات |
| طريقة المصادقة | مفتاح API (HTTP Basic Auth) |
الميزات
- مزامنة أحداث التسليم - تتبع الأحداث المُسلَّمة والمُرتدَّة والمفتوحة والمنقورة
- مقاييس التفاعل - مزامنة معدلات الفتح والنقرات مع سمات جهات اتصال Brevo
- إدارة الارتدادات - قمع العناوين المرتدة تلقائيًا في Brevo
- معالجة الشكاوى - مزامنة شكاوى البريد العشوائي لنظافة القائمة
- سمعة النطاق - مراقبة صحة نطاق الإرسال وقابلية التسليم
- تتبع البريد المعاملاتي - ربط الإرسال المعاملاتي ببيانات التسويق
المتطلبات الأساسية
قبل البدء، تأكد من توفر ما يلي:
- حساب Mailgun مع نطاق إرسال مُوثَّق
- مفتاح Mailgun API من لوحة Mailgun
- حساب Brevo مع وصول إلى API
- حساب Tajo مع صلاحيات الموصلات
المصادقة
مصادقة مفتاح API
يستخدم Mailgun مصادقة HTTP Basic Authentication مع api كاسم مستخدم ومفتاح API الخاص بك ككلمة مرور:
# 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
يوفر Mailgun مفاتيح إرسال خاصة بالنطاق ومفاتيح API على مستوى الحساب. استخدم مفاتيح إرسال النطاق لعمليات الرسائل ومفتاح API للحساب لعمليات الإدارة.
الإعداد
الإعداد الأساسي
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_UNSUBSCRIBEDنقاط نهاية واجهة البرمجة
| نقطة النهاية | الطريقة | الوصف |
|---|---|---|
https://api.mailgun.net/v3/{domain}/messages | POST | إرسال رسائل البريد الإلكتروني |
https://api.mailgun.net/v3/{domain}/events | GET | استعلام سجلات الأحداث |
https://api.mailgun.net/v3/{domain}/bounces | GET | سرد الارتدادات |
https://api.mailgun.net/v3/{domain}/complaints | GET | سرد الشكاوى |
https://api.mailgun.net/v3/{domain}/unsubscribes | GET | سرد إلغاءات الاشتراك |
https://api.mailgun.net/v3/{domain}/tags | GET | سرد الوسوم |
https://api.mailgun.net/v3/{domain}/tags/{tag}/stats | GET | الحصول على إحصائيات الوسم |
https://api.mailgun.net/v3/lists | GET | سرد القوائم البريدية |
https://api.mailgun.net/v3/domains | GET | سرد النطاقات |
https://api.mailgun.net/v4/address/validate | POST | التحقق من عنوان البريد الإلكتروني |
منطقة EU
لحسابات Mailgun في الاتحاد الأوروبي، استخدم https://api.eu.mailgun.net بدلاً من https://api.mailgun.net لجميع نقاط نهاية API.
أمثلة على الكود
تهيئة الموصل
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
// إرسال بريد إلكتروني باستخدام Mailgun 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
// استعلام أحداث Mailgun ومزامنة بيانات التفاعل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; }}
// اتّبع التقسيم للمزيد من الأحداثif (paging.next) { // جلب الصفحة التالية باستخدام عنوان paging.next}التعامل مع Mailgun Webhooks
const crypto = require('crypto');
app.post('/webhooks/mailgun', async (req, res) => { // التحقق من توقيع webhook 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 });
// معالجة قمع الارتدادات if (event === 'failed' && eventData.severity === 'permanent') { await tajo.contacts.update(email, { attributes: { MG_BOUNCE_TYPE: 'hard_bounce' }, emailBlacklisted: true }); }
res.status(200).send('OK');});مزامنة الارتدادات والشكاوى
// مزامنة العناوين المرتدة لنظافة القائمة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') });}حدود المعدل
| نقطة النهاية | الحد | ملاحظات |
|---|---|---|
| Messages API | يختلف حسب الخطة | 100/ساعة (مجاني)، غير محدود (مدفوع) |
| Events API | لا يوجد حد صريح | استخدم التقسيم بـ 300 عنصر كحد أقصى |
| Validation API | بناءً على الخطة | ادفع مقابل كل عملية تحقق |
| Webhooks | آنية | لا يوجد حد معدل على التسليم |
| Suppressions API | لا يوجد حد صريح | تطبّق حدود المعدل القياسية |
حدود الإرسال
يفرض Mailgun حدود إرسال بناءً على خطتك وسمعة نطاقك. تبدأ النطاقات الجديدة بحدود أقل تزداد مع تحسن سمعة المرسل. راقب إحصائيات نطاقك في لوحة Mailgun.
استكشاف الأخطاء وإصلاحها
| المشكلة | السبب | الحل |
|---|---|---|
| 401 Unauthorized | مفتاح API غير صالح | تحقق من مفتاح API في لوحة Mailgun |
| النطاق غير مُوثَّق | سجلات DNS مفقودة | أضف سجلات TXT وCNAME وMX المطلوبة |
| Webhook لم يُستلم | عنوان URL غير قابل للوصول | تأكد من أن عنوان URL لـ webhook قابل للوصول علنيًا |
| الأحداث مفقودة | نطاق الوقت ضيق جدًا | وسّع معاملات begin/end |
| قابلية تسليم منخفضة | سمعة النطاق | تحقق من إحصائيات النطاق والمصادقة |
وضع التصحيح
connectors: mailgun: debug: true log_level: verbose log_webhooks: true log_events: trueأفضل الممارسات
- وثّق نطاقات الإرسال - أكمل التحقق من DNS لقابلية تسليم مثلى
- استخدم webhooks للأحداث - تسليم webhook آني مقابل استطلاع Events API
- تعامل مع الارتدادات استباقيًا - اقمع الارتدادات الصعبة فورًا في Brevo
- ضع وسومًا على رسائلك - استخدم الوسوم لتصنيف وتحليل أداء البريد الإلكتروني
- راقب سمعة النطاق - تتبع مقاييس قابلية التسليم في لوحة Mailgun
- استخدم التحقق من البريد الإلكتروني - تحقق من العناوين قبل إضافتها إلى قوائم Brevo
الأمان
- HTTP Basic Auth - مفتاح API يُنقل عبر ترويسة Authorization
- توقيعات Webhook - التحقق من توقيع HMAC-SHA256
- التحقق من النطاق - مصادقة DNS عبر SPF وDKIM وDMARC
- قائمة IP المسموح بها - متاحة لخطط IP المخصصة
- تشفير TLS - تتطلب جميع نقاط نهاية API بروتوكول HTTPS
- تدوير المفاتيح - دوّر مفاتيح API دوريًا عبر لوحة Mailgun