Коннектор Mailgun

Подключите Mailgun к Brevo через Tajo для объединения транзакционных и маркетинговых данных email, синхронизации событий доставки и метрик вовлечённости, а также консолидации email-инфраструктуры в единое представление о клиенте.

Обзор

СвойствоЗначение
ПлатформаMailgun (от Sinch)
КатегорияEmail Marketing
Сложность настройкиПростая
Официальная интеграцияНет
Синхронизируемые данныеСобытия, контакты, доставляемость, кампании
Метод аутентификацииAPI Key (HTTP Basic Auth)

Возможности

  • Синхронизация событий доставки, трекинг событий доставки, отказов, открытий и кликов
  • Метрики вовлечённости, синхронизация показателей открытий и кликов в атрибуты контактов Brevo
  • Управление отказами, автоматическое исключение адресов с отказами в Brevo
  • Обработка жалоб, синхронизация жалоб на спам для гигиены списков
  • Репутация домена, мониторинг состояния домена отправителя и доставляемости
  • Трекинг транзакционных email, корреляция транзакционных отправок с маркетинговыми данными

Предварительные требования

Прежде чем начать, убедитесь, что у вас есть:

  1. Аккаунт Mailgun с верифицированным доменом отправителя
  2. API-ключ Mailgun из Mailgun Dashboard
  3. Аккаунт Brevo с доступом к API
  4. Аккаунт Tajo с разрешениями коннектора

Аутентификация

Аутентификация по API Key

Mailgun использует HTTP Basic Authentication с api в качестве имени пользователя и вашим API-ключом в качестве пароля:

Terminal window
# Получите API-ключ по адресу 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
const headers = {
'Authorization': `Basic ${Buffer.from(
`api:${process.env.MAILGUN_API_KEY}`
).toString('base64')}`
};
// Или через curl
// curl -s --user 'api:YOUR_API_KEY' ...

Типы API Key

Mailgun предоставляет ключи отправки для конкретного домена и ключи API уровня аккаунта. Используйте ключи отправки домена для операций с сообщениями и ключ API аккаунта для операций управления.

Конфигурация

Базовая настройка

connectors:
mailgun:
enabled: true
api_key: "${MAILGUN_API_KEY}"
domain: "${MAILGUN_DOMAIN}"
region: "us" # или "eu" для региона ЕС
sync:
events: true
contacts: true
bounces: true
complaints: true
schedule: "*/15 * * * *" # Каждые 15 минут
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

Эндпоинты API

ЭндпоинтМетодОписание
https://api.mailgun.net/v3/{domain}/messagesPOSTОтправка email-сообщений
https://api.mailgun.net/v3/{domain}/eventsGETЗапрос логов событий
https://api.mailgun.net/v3/{domain}/bouncesGETСписок отказов
https://api.mailgun.net/v3/{domain}/complaintsGETСписок жалоб
https://api.mailgun.net/v3/{domain}/unsubscribesGETСписок отписок
https://api.mailgun.net/v3/{domain}/tagsGETСписок тегов
https://api.mailgun.net/v3/{domain}/tags/{tag}/statsGETСтатистика тега
https://api.mailgun.net/v3/listsGETСписок рассылочных списков
https://api.mailgun.net/v3/domainsGETСписок доменов
https://api.mailgun.net/v4/address/validatePOSTВалидация email-адреса

Регион ЕС

Для аккаунтов 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

// Отправка email через Messages API Mailgun
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.' }

Синхронизация событий email в 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) {
// Получение следующей страницы по URL paging.next
}

Обработка вебхуков Mailgun

const crypto = require('crypto');
app.post('/webhooks/mailgun', async (req, res) => {
// Верификация подписи вебхука
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-записи
Вебхук не полученURL недоступенУбедитесь, что URL вебхука публично доступен
Отсутствуют событияСлишком узкий диапазон времениРасширьте параметры begin/end
Низкая доставляемостьРепутация доменаПроверьте статистику домена и аутентификацию

Режим отладки

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

Лучшие практики

  1. Верифицируйте домены отправителя, выполните DNS-верификацию для оптимальной доставляемости
  2. Используйте вебхуки для событий, доставка вебхуков в реальном времени лучше опроса Events API
  3. Проактивно обрабатывайте отказы, немедленно исключайте жёсткие отказы в Brevo
  4. Тегируйте сообщения, используйте теги для категоризации и анализа эффективности email
  5. Мониторьте репутацию домена, отслеживайте метрики доставляемости в дашборде Mailgun
  6. Используйте валидацию email, валидируйте адреса перед добавлением в списки Brevo

Безопасность

  • HTTP Basic Auth, API-ключ передаётся через заголовок Authorization
  • Подписи вебхуков, верификация подписи HMAC-SHA256
  • Верификация домена, DNS-аутентификация SPF, DKIM и DMARC
  • IP-разрешение, доступно для планов с выделенными IP
  • TLS-шифрование, все API-эндпоинты требуют HTTPS
  • Ротация ключей, периодически ротируйте API-ключи через дашборд Mailgun

Связанные ресурсы

Subscribe to updates

developer-docs

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

auto-detect
AI-ассистент

Привет! Спрашивайте меня о документации.