руководство · mailgun api
Как продуктовой команде безопасно внедрить Mailgun API?
Размещайте работу с Mailgun API за авторизованным серверным воркером. Подтвердите точный домен отправки, используйте учётные данные API с минимально возможными правами, создавайте надёжную внутреннюю задачу отправки и передавайте данные multipart-формы в эндпоинт Messages, привязанный к домену. Сохраняйте возвращённый Mailgun идентификатор письма, аутентифицируйте запросы вебхуков перед обработкой, дедуплицируйте события и учитывайте отказы (bounce), жалобы и отписки в момент отправки. Разделяйте приём запроса API, обработку в Mailgun, доставку на принимающий сервер и попадание во «Входящие» как разные состояния.
Определите узкую продуктовую операцию до вызова Mailgun
Начните с утверждённого продуктового события: подтверждения аккаунта, чека, оповещения безопасности или уведомления, которое запросил получатель. Размещайте Mailgun за доверенным сервисом приложения или воркером очереди, а не раскрывайте учётные данные провайдера или произвольную форму письма браузерам и мобильным клиентам. Авторизуйте вызывающую сторону, тенанта, адрес отправителя, получателя, класс письма и шаблон до формирования полей для провайдера. Сохраняйте внутреннюю запись об исходящем письме со стабильным ключом события, тенантом, ревизией шаблона, утверждёнными адресами и начальным состоянием. Эта запись — источник решений; Mailgun — транспортная зависимость. Отделение бизнес-намерения от полезной нагрузки провайдера делает повторы и аудит безопаснее и сохраняет возможность будущей смены провайдера. Транзакционный трафик и трафик, зависящий от согласия, должны оставаться раздельными в модели данных, чтобы предпочтения получателей, правила стоп-листа и инциденты с репутацией не превращались в неформальное соглашение на уровне шаблонов.
Подтвердите точный домен отправки и DNS-записи
Добавьте домен, которым управляет организация, и опубликуйте DNS-записи, которые Mailgun сейчас предоставляет для подтверждения, аутентификации, отслеживания и тех функций приёма почты, которые действительно выбраны. Прежде чем менять DNS, изучите существующие записи SPF и DMARC. Не создавайте вторую SPF-запись на одном имени хоста и не заменяйте DMARC-политику организации без участия её владельца. Подтверждайте фактические адрес From и идентификатор подписи, используемые нагрузкой, а не просто соседний родительский домен. Используйте поддомен под конкретную задачу, когда этого требуют распределение ответственности, разделение трафика или миграция. После того как Mailgun сообщит о подтверждении, изучите контрольное полученное письмо: видимый адрес From, домен подписи DKIM, обратный путь (return path), результаты аутентификации и поведение ответов. Подтверждение у провайдера — свидетельство того, что его проверка настройки пройдена. Оно не доказывает согласие получателя, приём на сервере назначения, репутацию отправителя или попадание во «Входящие». Храните историю изменений DNS и инструкции по откату вне панели провайдера.
Используйте учётные данные с ограниченными правами и правильный региональный эндпоинт
Mailgun документирует HTTP Basic-аутентификацию для своих API с учётными данными, различающимися по полномочиям и назначению. Воркер отправки должен получать только те учётные данные, которые нужны для утверждённого домена и операции. Разделяйте основные ключи аккаунта, ключи отправки для домена, материалы для подписи вебхуков и учётные данные тестовых окружений. Храните секреты непосредственно в управляемом хранилище секретов и открывайте их только тому серверному процессу, которому они нужны. Никогда не помещайте учётные данные в клиентский код, систему контроля версий, URL, логи, аналитику, шаблоны, тикеты или промпты. Выбирайте задокументированный базовый URL API для региона аккаунта, а не исходите из того, что все домены используют один хост. Отрепетируйте ротацию: создайте замену с такими же правами, обновите воркер, проверьте контрольный трафик и события, затем отзовите старые учётные данные. Настройте оповещения о неожиданных ошибках аутентификации и авторизации: они могут сигнализировать об отзыве, неверном регионе, дрейфе прав или утечке.
Формируйте один надёжный запрос к Messages API
Эндпоинт Messages в Mailgun, привязанный к домену, принимает поля multipart-формы для отправителя, получателей, темы, текстового или HTML-содержимого и задокументированных параметров: шаблонов, вложений, заголовков, тегов, переменных получателей, отслеживания и отложенной доставки. Открывайте только то подмножество, которое нужно продукту. Проверяйте синтаксис адресов и принадлежность тенанту, ограничивайте число получателей и вложений, отклоняйте внедрение переводов строк и рендерите утверждённые шаблоны с типизированными переменными. Не помещайте секреты или лишние персональные данные в теги, пользовательские переменные или заголовки: события провайдера и журналы активности могут показывать метаданные отдельно от содержимого письма. Отправляйте запрос из захваченной внутренней задачи и сохраняйте возвращённый Mailgun идентификатор письма вместе с конкретной попыткой. Держите специфичные для провайдера названия параметров в одном адаптере. Бизнес-код должен получать узкий результат — принято, отклонено или неопределённо, — а не знать каждое поле и формат ошибки Mailgun.
Проектируйте повторы с учётом приёма и неопределённости
Классифицируйте ответы, прежде чем повторять. Исправляйте некорректные поля, неавторизованные домены, неверные учётные данные, ошибки прав доступа и постоянные ошибки политики, а не отправляйте их заново. Повторяйте допустимые сбои транспорта, ошибки сервера провайдера и запросы, упёршиеся в лимит, с экспоненциальной задержкой, случайным разбросом (jitter), конечным числом попыток и ограничением возраста очереди. Ответ API Mailgun о приёме означает, что провайдер принял запрос на обработку; он не доказывает, что сервер назначения принял письмо. Тайм-аут на клиенте неоднозначен: Mailgun мог принять запрос, даже если воркер не получил ответ. Держите такую задачу в неизвестном состоянии, ищите сохранённые данные для корреляции или последующие события и применяйте продуманное правило сверки перед повторной отправкой. Транспорт Mailgun не отменяет необходимости в стабильном ключе события приложения, захвате задачи одним воркером, истории попыток и контроле риска дублей. Настройте оповещения о повторяющихся сбоях по учётным данным, домену, шаблону, тенанту и провайдеру получателя.
Аутентифицируйте запросы вебхуков до разбора
Настройте HTTPS-эндпоинт вебхука и сохраняйте точные поля, используемые в процедуре подписи Mailgun. Mailgun документирует timestamp, token и signature, вычисляемую с помощью ключа подписи вебхуков. Проверяйте подпись сравнением за постоянное время и отклоняйте временные метки вне окна актуальности приложения, прежде чем принимать событие. Отслеживайте токены или идентификаторы событий там, где это нужно для защиты от повторного воспроизведения. Храните ключ подписи вебхуков отдельно от учётных данных отправки и меняйте его по проверенному процессу. Ограничивайте размер запросов и не доверяйте URL, получателям, тегам или полям событий только потому, что тело запроса успешно разобрано. После аутентификации надёжно сохраните событие или поставьте его в очередь, прежде чем возвращать успешный ответ. Это не даст сбою процесса потерять данные о доставке. Проверка вебхука доказывает происхождение и целостность при настроенном секрете; она не доказывает, что бизнес-событие относится к ожидаемому тенанту, пока приложение не сопоставит домен и идентификаторы писем у провайдера.
Обрабатывайте повторы вебхуков и дублирующиеся события идемпотентно
Mailgun документирует повторную отправку вебхуков, если эндпоинт не вернул ожидаемый успешный ответ. Получатель должен исходить из того, что доставка может быть отложенной и повторной. Дедуплицируйте по стабильному идентификатору события провайдера, если он есть, или по консервативному составному ключу, который не может объединить разных получателей или типы событий. Храните исходное время события и время обработки раздельно. Делайте переходы состояний монотонными, чтобы более раннее наблюдение accepted или delivered не могло стереть более позднюю постоянную ошибку, жалобу или отписку только потому, что повторы пришли не по порядку. Возвращайте успех только после надёжного сохранения, но дорогую бизнес-обработку выполняйте асинхронно, чтобы эндпоинт оставался надёжным. Отслеживайте ошибки подписи, задержку ответа, объём повторов, отставание событий и записи в очереди недоставленных сообщений (dead-letter). Храните исходную полезную нагрузку провайдера только столько, сколько оправдано операционными задачами и политикой, с ограниченным доступом и минимизацией адресов. Вебхук — это поток данных, а не разрешение раскрывать историю получателей между тенантами.
Моделируйте события Mailgun, не преувеличивая доставку
Mailgun документирует типы событий accepted, delivered, временную и постоянную ошибку, opened, clicked, unsubscribed, complained, stored и связанные результаты обработки. Сопоставьте эти названия с внутренней моделью, сохраняя тип события провайдера, идентификатор письма, охват получателей, временную метку, серьёзность и доступный SMTP-ответ. Accepted описывает приём в Mailgun или продвижение по очереди. Delivered описывает задокументированное наблюдение о доставке — обычно приём сервером назначения, — но не показывает итоговую папку в ящике. Открытия и клики — это инструменты измерения вовлечённости, а не доказательство передачи, и на них могут влиять технологии защиты приватности. Временные ошибки могут оправдывать ограниченные повторы внутри транспортной системы; постоянные ошибки, жалобы и отписки должны обновлять состояние безопасности получателя до отправки любой последующей задачи приложения. Ведите журнал событий только на добавление и выводите видимый пользователю статус по явным правилам, чтобы поддержка могла отличать данные от их интерпретации.
Учитывайте ошибки, жалобы и отписки в момент отправки
Mailgun документирует отслеживание ошибок доставки, жалоб на спам и отписок. Загружайте эти сигналы в принадлежащую продукту модель безопасности получателей с тенантом, адресом, классом писем, исходным событием, причиной и временем вступления в силу. Проверяйте это состояние непосредственно перед каждой отправкой, а не только при импорте списка для кампании. Жёсткий отказ или жалоба должны останавливать небезопасные повторы в соответствующих рамках. Обработка отписок должна учитывать класс письма и текущие требования получателей или закона; её нельзя регулярно обходить через параметры провайдера. Защищайте любое ручное удаление из стоп-листа строгой авторизацией, видимой причиной и историей аудита. Данные стоп-листа провайдера — ценное операционное свидетельство, но не полный реестр согласий. Храните источник согласия, предпочтения, решения по политике для критичных писем и прошлую историю у провайдера отдельно, чтобы миграция не лишила получателей защиты. Протестируйте распространение стоп-листа, дублирующиеся жалобы, отложенные отказы и исключительную реактивацию на контролируемых адресах.
Рассмотрите SendHQ как альтернативу Mailgun
SendHQ предлагает транзакционные и маркетинговые письма по согласию получателей, отправку с подтверждённого домена, входящую почту, события доставки и стоп-листы. Перед миграцией изучите публичную документацию API и протестируйте аутентификацию, полезную нагрузку (payload), ошибки, идентификаторы, события, домены и процессы безопасности получателей.
Частые вопросы
Какой эндпоинт отправляет письма через Mailgun API?
Mailgun документирует эндпоинт `POST /v3/{domain}/messages`, привязанный к домену, с данными multipart-формы и HTTP Basic-аутентификацией. Вызывайте его только из авторизованного серверного кода.
Можно ли размещать API-ключ Mailgun в браузерном коде?
Нет. Храните подходящие учётные данные с минимальными правами в серверном менеджере секретов. Разделяйте продакшен, тестовые окружения, администрирование аккаунта, отправку для домена и полномочия на подпись вебхуков.
Означает ли приём запроса Mailgun API, что письмо доставлено?
Нет. Это значит, что Mailgun принял запрос на обработку. Аутентифицированные события позже могут сообщить о доставке на сервер назначения или об ошибке, а попадание во «Входящие» остаётся отдельным результатом на стороне получателя.
Как аутентифицировать вебхуки Mailgun?
Перед обработкой проверяйте задокументированные Mailgun timestamp, token и signature с помощью ключа подписи вебхуков. Применяйте проверки актуальности и защиту от повторного воспроизведения, затем надёжно сохраняйте событие перед подтверждением.
Нужно ли повторять каждый неудачный запрос к Mailgun API?
Нет. Исправляйте ошибки валидации, аутентификации, домена, прав доступа и постоянные ошибки политики. Для допустимых временных сбоев используйте ограниченную задержку, а неоднозначные тайм-ауты сверяйте перед повторной отправкой.
Может ли SendHQ заменить Mailgun?
Возможно. SendHQ предлагает транзакционные и маркетинговые письма по согласию получателей, отправку с подтверждённого домена, входящую почту, события доставки и стоп-листы. Перед миграцией изучите публичную документацию API и протестируйте свою интеграцию.
Источники
- Mailgun Messages API: отправка писем — Mailgun
- Аутентификация в Mailgun API — Mailgun
- Подтверждение домена в Mailgun — Mailgun
- Типы событий Mailgun — Mailgun
- Защита вебхуков Mailgun — Mailgun
- Повторная отправка вебхуков Mailgun — Mailgun
- Отслеживание ошибок доставки в Mailgun — Mailgun
- Отслеживание жалоб на спам в Mailgun — Mailgun
- Отслеживание отписок в Mailgun — Mailgun
- RFC 5321: простой протокол передачи почты (SMTP) — RFC Editor
- Контракт OpenAPI SendHQ — SendHQ