[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-list-1":3},{"count":4,"next":5,"previous":5,"results":6},3,null,[7,24,38],{"id":8,"body":9,"uuid":10,"created_at":11,"updated_at":12,"brand":13,"header":14,"short_body":15,"image":16,"published":17,"published_at":18,"tags":19},33,"\u003Cp>Вопрос «\u003Cstrong>SMTP или API\u003C\u002Fstrong>» звучит почти в каждом подключении, и почти всегда за ним стоит другой вопрос: сколько кода придётся написать сейчас и о чём придётся жалеть через полгода. В FMailer доступны три способа отправки — SMTP-релей, REST API и официальный Python SDK, — и все три работают через один и тот же токен домена, попадают в один и тот же журнал и порождают одни и те же вебхуки.\u003C\u002Fp>\n\u003Cp>Разница не в доставке. Письмо, отправленное по SMTP, и письмо, отправленное POST-запросом, подписываются одним и тем же ключом DKIM вашего домена, уходят через одну очередь и получают один и тот же ответ принимающего сервера. Разница в том, что вы можете сказать о письме при отправке и что узнаете о нём в ответе.\u003C\u002Fp>\n\u003Cp>Ниже — короткий ответ для тех, кто выбирает прямо сейчас, а затем разбор каждого способа: что он умеет, чего не умеет, как выглядит код и в каких проектах он оказывается правильным. В конце — сравнительная таблица, частые ошибки и ответы на типичные вопросы.\u003C\u002Fp>\n\u003Ch2>Короткий ответ\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>SMTP\u003C\u002Fstrong> — если приложение уже отправляет почту. Меняются хост, логин и пароль в конфиге, код не трогается вообще. Самый быстрый переезд: обычно час вместе с DNS.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>REST API\u003C\u002Fstrong> — если вы пишете интеграцию с нуля или вам нужно то, чего в SMTP нет: серверные шаблоны, \u003Ccode>idempotency_key\u003C\u002Fcode>, метки, пакетная отправка, явный флаг рассылки, \u003Ccode>message_id\u003C\u002Fcode> в ответе, отслеживание кликов.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>SDK\u003C\u002Fstrong> — тот же REST API, но на Python и в две строки, с асинхронной отправкой через пул потоков. Разумный старт для Django- и FastAPI-бэкендов, где не хочется собирать HTTP-запрос руками.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Можно пользоваться всеми тремя одновременно: способ отправки записывается у каждого письма отдельным полем, статистика и вебхуки от этого не меняются.\u003C\u002Fp>\n\u003Ch2>Один токен на все три способа\u003C\u002Fh2>\n\u003Cp>Начать стоит с того, что объединяет все варианты. В FMailer учётные данные выдаются \u003Cstrong>на домен\u003C\u002Fstrong>, а не на аккаунт: у токена есть логин и пароль, и это ровно те же логин и пароль, которые:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>подставляются в SMTP-клиент как имя пользователя и пароль;\u003C\u002Fli>\n\u003Cli>уходят в объекте \u003Ccode>auth\u003C\u002Fcode> в теле POST-запроса к REST API;\u003C\u002Fli>\n\u003Cli>передаются как HTTP Basic при чтении отправленного через \u003Ccode>GET\u003C\u002Fcode>-методы.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Отдельный токен на каждый домен — это не формальность. Разработка, продакшен и маркетинговый домен разводятся разными учётными данными, и утечка одного из них не открывает остальные. Токен при этом открывает только \u003Ccode>\u002Fexternal\u002F\u003C\u002Fcode> — это не ключ от аккаунта: домены, биллинг и команда ему недоступны.\u003C\u002Fp>\n\u003Cp>Ещё одна общая вещь: \u003Cstrong>отправитель проверяется по подключённому домену\u003C\u002Fstrong>. Адрес в \u003Ccode>From\u003C\u002Fcode> должен принадлежать домену, который вы подтвердили, — иначе письмо будет отклонено, каким бы способом вы его ни отправляли. Это защита от подделки отправителя, и она одинакова для SMTP и API.\u003C\u002Fp>\n\u003Cp>И третья: DNS не нужен, чтобы увидеть первое письмо. У каждого аккаунта есть \u003Cstrong>песочница\u003C\u002Fstrong> — учётные данные на общем домене с настоящим DKIM и настоящей доставкой; отправлять из неё можно только на адрес своего аккаунта. Интеграцию можно собрать и проверить, пока кто-то ещё ищет доступ к DNS-панели.\u003C\u002Fp>\n\u003Ch2>SMTP-релей: переезд без единой строки кода\u003C\u002Fh2>\n\u003Cp>SMTP — протокол 1982 года, и это его главное достоинство: его умеет всё. Django, Laravel, Rails, Spring Boot, ASP.NET, WordPress, 1С-Битрикс, самописный скрипт на PHP, который никто не открывал четыре года, — везде есть форма с полями «сервер», «порт», «логин», «пароль».\u003C\u002Fp>\n\u003Ch3>Параметры подключения\u003C\u002Fh3>\n\u003Cpre>\u003Ccode>host:  smtp.fmailer.ru\nport:  587, 8587   — STARTTLS\n       465, 8465   — SSL\u002FTLS\n       25,  8025   — без шифрования\nlogin: логин токена домена\npass:  пароль токена домена\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Дублирующие порты (8587, 8465, 8025) нужны, когда хостинг-провайдер блокирует стандартные — это встречается чаще, чем хотелось бы. Порты без шифрования оставлены для окружений, где TLS невозможен; в продакшене их использовать не надо: по ним в открытом виде уезжает пароль токена.\u003C\u002Fp>\n\u003Ch3>Как это выглядит в коде\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-python\">import smtplib\nfrom email.message import EmailMessage\n\nmsg = EmailMessage()\nmsg[&quot;From&quot;] = &quot;Магазин &lt;noreply@mail.example.ru&gt;&quot;\nmsg[&quot;To&quot;] = &quot;client@example.ru&quot;\nmsg[&quot;Subject&quot;] = &quot;Подтверждение заказа №4417&quot;\nmsg.set_content(&quot;Заказ принят. Доставка — завтра до 18:00.&quot;)\n\nwith smtplib.SMTP(&quot;smtp.fmailer.ru&quot;, 587) as smtp:\n    smtp.starttls()\n    smtp.login(&quot;&lt;логин токена&gt;&quot;, &quot;&lt;пароль токена&gt;&quot;)\n    smtp.send_message(msg)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>В реальном проекте этого кода обычно нет вовсе — есть четыре строки в настройках. Для Django, Laravel, Ruby on Rails, Express.js, Spring Boot, ASP.NET, NestJS, Next.js, FastAPI, Flask, Symfony и популярных CMS готовые конфигурации лежат в документации отдельными страницами.\u003C\u002Fp>\n\u003Ch3>Что стоит знать про SMTP заранее\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>Несколько получателей — это несколько писем.\u003C\u002Fstrong> Письмо, адресованное нескольким людям, превращается в системе в отдельное письмо на каждого адресата, и для \u003Ccode>To\u003C\u002Fcode>, и для \u003Ccode>Cc\u003C\u002Fcode>, и для \u003Ccode>Bcc\u003C\u002Fcode>. У каждого свой \u003Ccode>Message-ID\u003C\u002Fcode>, свой вебхук доставки и своё место в лимитах тарифа — именно поэтому отказ, открытие или отписку можно отнести к конкретному человеку. Потолок — 100 получателей на письмо; следующему адресу сервер ответит \u003Ccode>452 4.5.3 Too many recipients\u003C\u002Fcode>, и это просьба отправить остальных отдельной транзакцией, а не отказ.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Заголовок \u003Ccode>Bcc\u003C\u002Fcode> удаляется при приёме.\u003C\u002Fstrong> Так и положено серверу отправки (RFC 5321 §7.2): скрытые получатели уже есть в конверте, а уцелевший \u003Ccode>Bcc\u003C\u002Fcode> сообщил бы каждому читателю, кто ещё был в письме. Большинство почтовых библиотек убирают его сами — поэтому те, что не убирают, и остаются незамеченными.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Адрес конверта по умолчанию совпадает с вашим \u003Ccode>From\u003C\u002Fcode>.\u003C\u002Fstrong> Это необычно и сделано намеренно: SPF проверяется по вашему домену и выравнивается с \u003Ccode>From\u003C\u002Fcode> для DMARC. Обратная сторона — отложенные отказы приходят на адрес из \u003Ccode>From\u003C\u002Fcode>, а если это \u003Ccode>noreply@\u003C\u002Fcode>, их никто не прочитает. Для такого случая домену задаётся \u003Cstrong>return path\u003C\u002Fstrong> — адрес, который вы действительно читаете, обязательно на самом домене, а не на поддомене.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Тип письма определяется эвристикой.\u003C\u002Fstrong> По SMTP невозможно сказать «это рассылка» явно — нет такого поля в протоколе. FMailer классифицирует письмо сам и на массовом проставляет заголовки отписки в один клик, но эвристика есть эвристика: она может ошибиться в обе стороны. Если вы отправляете маркетинговые письма, это первый аргумент в пользу API, где флаг \u003Ccode>mass_mail\u003C\u002Fcode> ставится руками.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Отслеживание кликов по SMTP не работает.\u003C\u002Fstrong> Переписывание ссылок через ваш хост \u003Ccode>stats.&lt;домен&gt;\u003C\u002Fcode> доступно только для писем, отправленных через API: по SMTP приходит уже готовый MIME, части которого могут быть закодированы, и правка адресов внутри них — верный способ испортить тело письма. Пиксель открытий при этом работает в обоих случаях.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Ответ сервера — это код SMTP, а не JSON.\u003C\u002Fstrong> Вы узнаете, что письмо принято, но \u003Ccode>message_id\u003C\u002Fcode>, идемпотентность и машинный разбор результата остаются за бортом.\u003C\u002Fp>\n\u003Ch3>Когда SMTP — правильный выбор\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Приложение уже отправляет почту, и надо просто сменить провайдера.\u003C\u002Fli>\n\u003Cli>Письма отправляет коробочный продукт или CMS, куда своего кода не добавить.\u003C\u002Fli>\n\u003Cli>Стек не Python и не JavaScript, а писать HTTP-клиент ради писем не хочется.\u003C\u002Fli>\n\u003Cli>Нужен самый быстрый способ увидеть первое доставленное письмо.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Проверить, что соединение вообще устанавливается, можно до всякого кода:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">openssl s_client -starttls smtp -crlf -connect smtp.fmailer.ru:587\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Если соединение не устанавливается — почти всегда дело в том, что исходящий SMTP закрыт на стороне вашего хостинга. Это, кстати, второй по частоте аргумент в пользу API: HTTPS наружу открыт всегда.\u003C\u002Fp>\n\u003Ch2>REST API: когда письму нужно больше, чем текст и адрес\u003C\u002Fh2>\n\u003Cp>REST API живёт на \u003Ccode>https:\u002F\u002Fapi.fmailer.ru\u003C\u002Fcode>, все запросы — \u003Ccode>POST\u003C\u002Fcode> с телом в JSON, логин и пароль токена передаются в объекте \u003Ccode>auth\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>Отправка готового письма\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">curl -X POST https:\u002F\u002Fapi.fmailer.ru\u002Fexternal\u002Fsend_email_simple\u002F \\\n  -H &quot;Content-Type: application\u002Fjson&quot; \\\n  -d '{\n    &quot;recipient&quot;: &quot;client@example.ru&quot;,\n    &quot;subject&quot;: &quot;Подтверждение заказа №4417&quot;,\n    &quot;body&quot;: &quot;&lt;p&gt;Заказ принят. Доставка — завтра до 18:00.&lt;\u002Fp&gt;&quot;,\n    &quot;text&quot;: &quot;Заказ принят. Доставка — завтра до 18:00.&quot;,\n    &quot;sender&quot;: &quot;Магазин &lt;noreply@mail.example.ru&gt;&quot;,\n    &quot;idempotency_key&quot;: &quot;order-4417&quot;,\n    &quot;tags&quot;: {&quot;stream&quot;: &quot;order&quot;, &quot;lang&quot;: &quot;ru&quot;},\n    &quot;auth&quot;: {&quot;username&quot;: &quot;&lt;логин токена&gt;&quot;, &quot;password&quot;: &quot;&lt;пароль токена&gt;&quot;}\n  }'\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Ответ — не «принято», а перечисление того, что именно принято:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n    &quot;ok&quot;: true,\n    &quot;emails&quot;: [\n        {\n            &quot;ok&quot;: true,\n            &quot;message_id&quot;: &quot;&lt;uuid@mail.example.ru&gt;&quot;,\n            &quot;uuid&quot;: &quot;uuid&quot;,\n            &quot;recipient&quot;: &quot;client@example.ru&quot;,\n            &quot;kind&quot;: &quot;to&quot;,\n            &quot;idempotency_key&quot;: &quot;order-4417&quot;,\n            &quot;replayed&quot;: false\n        }\n    ]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>message_id\u003C\u002Fcode> — это тот же идентификатор, который придёт потом в вебхуке доставки. Сохранив его рядом с заказом, вы связываете событие с сущностью в своей базе, не запрашивая ничего дополнительно. По SMTP такой связи в ответе нет.\u003C\u002Fp>\n\u003Ch3>Что API умеет, а SMTP — нет\u003C\u002Fh3>\n\u003Cp>\u003Cstrong>\u003Ccode>idempotency_key\u003C\u002Fcode>.\u003C\u002Fstrong> Ваш собственный идентификатор события — номер заказа, идентификатор попытки входа. Повторный запрос с тем же ключом не создаёт второе письмо, поэтому ретрай после таймаута безопасен. В ответе такое письмо приходит с \u003Ccode>replayed: true\u003C\u002Fcode> — без второй отправки и без повторного расхода лимитов. Это самое ценное, что даёт API, и первое, что стоит поставить.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Серверные шаблоны.\u003C\u002Fstrong> Вместо темы и тела передаётся \u003Ccode>tpl\u003C\u002Fcode> — slug шаблона из панели, \u003Ccode>lang\u003C\u002Fcode> и \u003Ccode>params\u003C\u002Fcode> с данными для подстановки:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n    &quot;recipient&quot;: &quot;client@example.ru&quot;,\n    &quot;tpl&quot;: &quot;order-confirmed&quot;,\n    &quot;lang&quot;: &quot;ru&quot;,\n    &quot;sender&quot;: &quot;Магазин &lt;noreply@mail.example.ru&gt;&quot;,\n    &quot;idempotency_key&quot;: &quot;order-4417&quot;,\n    &quot;params&quot;: {&quot;order&quot;: &quot;4417&quot;, &quot;delivery&quot;: &quot;завтра до 18:00&quot;},\n    &quot;auth&quot;: {&quot;username&quot;: &quot;&lt;логин токена&gt;&quot;, &quot;password&quot;: &quot;&lt;пароль токена&gt;&quot;}\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Вёрстка письма перестаёт быть частью релиза приложения: у одного шаблона может быть русская и английская версия, а оформление настраивается под ваш бренд.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Явный флаг рассылки.\u003C\u002Fstrong> \u003Ccode>mass_mail: true\u003C\u002Fcode> добавляет заголовки \u003Ccode>List-Unsubscribe\u003C\u002Fcode> и \u003Ccode>List-Unsubscribe-Post\u003C\u002Fcode> — ту самую отписку в одно нажатие, которую Gmail, Yahoo и Apple ожидают от массовых отправителей. Флаг работает в одну сторону: \u003Ccode>true\u003C\u002Fcode> помечает письмо рассылкой, \u003Ccode>false\u003C\u002Fcode> просто оставляет решение эвристике.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Метки.\u003C\u002Fstrong> \u003Ccode>tags\u003C\u002Fcode> — объект вида \u003Ccode>{\"stream\": \"password-reset\", \"lang\": \"en\"}\u003C\u002Fcode>. В письмо они не попадают и на доставку не влияют; нужны они для чтения почты обратно: фильтр в журнале, поле в вебхуке, разбивка в аналитике. Именно метки отвечают на вопрос, на который не отвечает ничто другое: к какому потоку относится письмо. До 10 меток на письмо.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Вложения.\u003C\u002Fstrong> Массив \u003Ccode>attachments\u003C\u002Fcode> с именем файла и байтами в base64: до 20 файлов, по 10 МБ каждый и 10 МБ суммарно, всё тело запроса — не больше 16 МБ. Исполняемые типы отклоняются по расширению и заявленному типу — тот же список, который применяет к вашей почте Gmail на приёме.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Пакетная отправка.\u003C\u002Fstrong> \u003Ccode>POST \u002Fexternal\u002Fsend_email_batch\u002F\u003C\u002Fcode> принимает до 100 писем в одном запросе: \u003Ccode>auth\u003C\u002Fcode> читается один раз на всю пачку, обычные и шаблонные письма можно смешивать. Ошибка в одном элементе отклоняет всю пачку с указанием индекса — это лучше, чем наполовину ушедшая рассылка. Ответ плоский и упорядоченный, по элементу на письмо.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Темы подписки.\u003C\u002Fstrong> Поле \u003Ccode>topic\u003C\u002Fcode> привязывает письмо к теме («Новости продукта», «Статусы заказов»), и получатель, отказавшийся от темы, продолжает получать всё остальное, включая сброс пароля. Неизвестный slug — это ошибка 400, а не тихое игнорирование.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Чтение отправленного.\u003C\u002Fstrong> Тот же токен, которым вы отправляете, умеет читать — через HTTP Basic:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">curl https:\u002F\u002Fapi.fmailer.ru\u002Fexternal\u002Femails\u002F \\\n  -u &quot;$TOKEN_USERNAME:$TOKEN_PASSWORD&quot;\n\ncurl &quot;https:\u002F\u002Fapi.fmailer.ru\u002Fexternal\u002Fstats\u002F?start=2026-08-01&amp;end=2026-08-28&quot; \\\n  -u &quot;$TOKEN_USERNAME:$TOKEN_PASSWORD&quot;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Пять \u003Ccode>GET\u003C\u002Fcode>-методов: список писем, одно письмо вместе с ушедшим HTML, его события, весь поток событий домена и итоги за период. Все ограничены доменом токена. Методы событий — платная возможность тарифа.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Понятные отказы.\u003C\u002Fstrong> Превышение часового или месячного объёма — это \u003Ccode>HTTP 400\u003C\u002Fcode> с текстом \u003Ccode>Hourly limit exceeded\u003C\u002Fcode> или \u003Ccode>Monthly limit exceeded\u003C\u002Fcode>, и такой запрос имеет смысл повторить с выдержкой. Остановленная отправка с домена — \u003Ccode>HTTP 403\u003C\u002Fcode> с \u003Ccode>code: domain_banned\u003C\u002Fcode>; здесь повторы не помогут. Разница между «подожди» и «не пытайся» видна в коде, а не в логе.\u003C\u002Fp>\n\u003Ch3>Когда REST API — правильный выбор\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Новый бэкенд, где отправка пишется с нуля.\u003C\u002Fli>\n\u003Cli>Письма отправляются в ответ на события, которые могут повториться при ретрае, — оплата, регистрация, код подтверждения.\u003C\u002Fli>\n\u003Cli>Нужны рассылки с корректной отпиской в один клик.\u003C\u002Fli>\n\u003Cli>Вёрстку письма меняет маркетинг, а не разработчик.\u003C\u002Fli>\n\u003Cli>Нужна аналитика по потокам писем или отслеживание кликов.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>SDK: тот же API, но короче\u003C\u002Fh2>\n\u003Cp>Для Python есть официальный SDK — обёртка над теми же двумя методами отправки. Он опубликован в PyPI под именем \u003Ccode>postwing\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">pip install postwing\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre>\u003Ccode class=\"language-python\">from postwing import PostwingSdk\n\nsdk = PostwingSdk(\n    username=&quot;&lt;логин токена&gt;&quot;,\n    password=&quot;&lt;пароль токена&gt;&quot;,\n)\n# Для fmailer.ru базовый адрес указывается явно:\nsdk.SERVER_URL = &quot;https:\u002F\u002Fapi.fmailer.ru&quot;\n\nsdk.send_simple(\n    recipient=&quot;client@example.ru&quot;,\n    sender=&quot;Магазин &lt;noreply@mail.example.ru&gt;&quot;,\n    subject=&quot;Подтверждение заказа №4417&quot;,\n    body=&quot;&lt;p&gt;Заказ принят. Доставка — завтра до 18:00.&lt;\u002Fp&gt;&quot;,\n    text=&quot;Заказ принят. Доставка — завтра до 18:00.&quot;,\n    idempotency_key=&quot;order-4417&quot;,\n)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Отправка по шаблону — метод \u003Ccode>send\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-python\">sdk.send(\n    tpl=&quot;order-confirmed&quot;,\n    recipient=&quot;client@example.ru&quot;,\n    sender=&quot;Магазин &lt;noreply@mail.example.ru&gt;&quot;,\n    lang=&quot;ru&quot;,\n    params={&quot;order&quot;: &quot;4417&quot;, &quot;delivery&quot;: &quot;завтра до 18:00&quot;},\n    idempotency_key=&quot;order-4417&quot;,\n)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Асинхронная отправка\u003C\u002Fh3>\n\u003Cp>У обоих методов есть \u003Ccode>_async\u003C\u002Fcode>-версии, работающие через пул потоков. Они возвращают \u003Ccode>Future\u003C\u002Fcode>, поэтому отправку можно сделать неблокирующей, а результат — забрать позже или обработать колбэком:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-python\">def on_complete(success, error):\n    if error:\n        logger.error(&quot;Письмо не ушло: %s&quot;, error)\n\nsdk.send_simple_async(\n    recipient=&quot;client@example.ru&quot;,\n    sender=&quot;Магазин &lt;noreply@mail.example.ru&gt;&quot;,\n    subject=&quot;Подтверждение заказа №4417&quot;,\n    body=&quot;&lt;p&gt;Заказ принят.&lt;\u002Fp&gt;&quot;,\n    idempotency_key=&quot;order-4417&quot;,\n    callback=on_complete,\n)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Размер пула задаётся параметром \u003Ccode>max_workers\u003C\u002Fcode>, а \u003Ccode>fail_silently=True\u003C\u002Fcode> превращает исключение в \u003Ccode>False\u003C\u002Fcode> — для случаев, когда неотправленное письмо не должен уронить запрос пользователя. Логирование настраивается уровнем: на \u003Ccode>DEBUG\u003C\u002Fcode> в лог попадают URL, полезная нагрузка (с замаскированным \u003Ccode>auth\u003C\u002Fcode>) и ответ сервера — этого обычно достаточно, чтобы понять, почему письмо не ушло, не поднимая прокси.\u003C\u002Fp>\n\u003Ch3>Границы SDK\u003C\u002Fh3>\n\u003Cp>SDK намеренно небольшой, и это стоит знать заранее.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Он покрывает \u003Cstrong>два метода отправки\u003C\u002Fstrong> — простое письмо и шаблонное. Пакетной отправки, вложений, меток и \u003Ccode>GET\u003C\u002Fcode>-методов чтения в нём нет: для них нужен обычный HTTP-запрос.\u003C\u002Fli>\n\u003Cli>Методы возвращают \u003Ccode>True\u003C\u002Fcode> или бросают \u003Ccode>PostwingSdkException\u003C\u002Fcode>. \u003Cstrong>\u003Ccode>message_id\u003C\u002Fcode> они не возвращают\u003C\u002Fstrong> — если вы связываете письмо с сущностью в своей базе, обращайтесь к REST API напрямую.\u003C\u002Fli>\n\u003Cli>Таймаут запроса фиксированный, пятисекундный.\u003C\u002Fli>\n\u003Cli>Асинхронные методы — это пул потоков внутри вашего процесса, а не очередь. Перезапуск приложения теряет то, что не успело уйти.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Иначе говоря, SDK хорош там, где письмо простое и его надо отправить в две строки. Как только письму нужны метки, вложения или пачка — вы всё равно окажетесь на уровне HTTP.\u003C\u002Fp>\n\u003Ch2>Сравнение возможностей\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Возможность\u003C\u002Fth>\n\u003Cth>SMTP\u003C\u002Fth>\n\u003Cth>REST API\u003C\u002Fth>\n\u003Cth>Python SDK\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Подключение без изменений в коде\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Работает с любым стеком\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>только Python\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Требует открытого исходящего SMTP\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>idempotency_key\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Серверные шаблоны\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Явный флаг рассылки \u003Ccode>mass_mail\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>нет (эвристика)\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>message_id\u003C\u002Fcode> в ответе\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Метки (\u003Ccode>tags\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Вложения\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong> (MIME)\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong> (base64)\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Пакетная отправка до 100 писем\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Темы подписки (\u003Ccode>topic\u003C\u002Fcode>)\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Отслеживание кликов\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Пиксель открытий\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Вебхуки о событиях\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Чтение журнала тем же токеном\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Что одинаково во всех трёх колонках: ключ DKIM вашего домена, SPF и DMARC, разделение транзакционного и массового потоков, журнал с настоящим ответом принимающего сервера, репутация домена и лимиты тарифа.\u003C\u002Fp>\n\u003Ch2>Как выбрать: пять типичных ситуаций\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>У вас Django-приложение, которое уже шлёт почту через чужой SMTP.\u003C\u002Fstrong> Меняете четыре настройки, отправляете тестовое письмо, смотрите журнал. Переезд занимает час, и это правильный первый шаг даже если в итоге вы хотите API: сначала письма идут, потом улучшается интеграция.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Вы пишете новый сервис, где письмо порождает событие.\u003C\u002Fstrong> Сразу REST API с \u003Ccode>idempotency_key\u003C\u002Fcode>. Ретрай очереди, повтор webhook'а от платёжного провайдера, двойной клик пользователя — всё это в какой-то момент случится, и ключ идемпотентности превратит второе письмо в \u003Ccode>replayed: true\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Вам нужна рассылка по своей базе.\u003C\u002Fstrong> Только API: \u003Ccode>mass_mail: true\u003C\u002Fcode>, \u003Ccode>topic\u003C\u002Fcode>, пакетная отправка. Без явного флага вы полагаетесь на эвристику там, где ошибка стоит жалобы на спам, а жалоба — репутации домена.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Стек не Python — Go, PHP, C#, Node.js.\u003C\u002Fstrong> SMTP для быстрого старта, REST API для всего остального: это обычный \u003Ccode>POST\u003C\u002Fcode> с JSON, клиента для него писать не нужно ни в одном языке.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Коробочный продукт, CMS, 1С, оборудование.\u003C\u002Fstrong> SMTP, и других вариантов обычно нет. Зато он есть везде.\u003C\u002Fp>\n\u003Ch3>Смешивать — нормально\u003C\u002Fh3>\n\u003Cp>Способ отправки записывается у каждого письма, и в журнале по нему можно фильтровать. Вполне рабочая схема: легаси-часть продолжает ходить по SMTP, новый код отправляет через API, рассылки уходят пачками, а вебхуки и статистика при этом общие. Начать с SMTP и перейти на API позже — это не переделка, а добавление.\u003C\u002Fp>\n\u003Ch2>Частые ошибки\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Отправка письма прямо в HTTP-запросе пользователя.\u003C\u002Fstrong> Любой способ отправки — это сетевой вызов, и он может занять секунды. Ставьте отправку в очередь (Celery, RQ, что угодно) и отвечайте пользователю сразу. Асинхронные методы SDK — это пул потоков в вашем же процессе, а не замена очереди.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Ретраи без \u003Ccode>idempotency_key\u003C\u002Fcode>.\u003C\u002Fstrong> Очередь, которая перезапускает упавшую задачу, — это правильно. Очередь, которая перезапускает задачу «отправить код подтверждения» без ключа идемпотентности, — это два разных кода в почте у пользователя и звонок в поддержку.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Пустой \u003Ccode>text\u003C\u002Fcode>.\u003C\u002Fstrong> Письмо всегда уходит как \u003Ccode>multipart\u002Falternative\u003C\u002Fcode>. Если текстовую версию не передать, FMailer соберёт её из HTML сам, но вывод не знает, какие части вёрстки были украшением, и не увидит фразы, которую вы написали бы для читателя без стилей. Почтовые провайдеры сравнивают обе части при оценке письма.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Рассылка без \u003Ccode>mass_mail\u003C\u002Fcode>.\u003C\u002Fstrong> Эвристика может не распознать в вашем письме массовое, и тогда в нём не окажется заголовков отписки. Дальше человек, которому надоела рассылка, нажимает «Спам». Отписка стоит одного адреса, жалоба — репутации домена.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Порт 25 в продакшене.\u003C\u002Fstrong> По незашифрованному соединению пароль токена уезжает в открытом виде. Дублирующие порты 8587 и 8465 существуют ровно для того, чтобы не приходилось выбирать между шифрованием и заблокированным провайдером портом.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Токен в репозитории или в конфиге фронтенда.\u003C\u002Fstrong> Токен домена позволяет отправлять письма от вашего имени и читать журнал отправки. Его место — в переменных окружения или в хранилище секретов, а сама отправка — всегда на сервере, никогда из браузера или мобильного приложения.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Игнорирование разницы между 400 и 403.\u003C\u002Fstrong> \u003Ccode>Hourly limit exceeded\u003C\u002Fcode> — это «повтори позже», и повтор с выдержкой сработает. \u003Ccode>domain_banned\u003C\u002Fcode> — постоянный отказ, и повторы только сожгут очередь. Обрабатывайте их по-разному.\u003C\u002Fp>\n\u003Ch2>Частые вопросы\u003C\u002Fh2>\n\u003Ch3>Что быстрее — SMTP или API?\u003C\u002Fh3>\n\u003Cp>На практике разница незаметна на фоне самой доставки: и то, и другое ставит письмо в очередь за миллисекунды. Заметная разница возникает на объёме: одно письмо по SMTP — это несколько сетевых обменов и обычно новое соединение, тогда как пакетный метод API принимает до 100 писем одним запросом. Для потока в несколько писем в минуту это неважно; для рассылки — важно.\u003C\u002Fp>\n\u003Ch3>Доставляемость через API лучше, чем через SMTP?\u003C\u002Fh3>\n\u003Cp>Нет. Письмо подписывается тем же ключом DKIM, отправляется той же инфраструктурой и получает тот же ответ принимающего сервера. На доставляемость влияет аутентификация домена, качество базы, доля жалоб и содержание письма — а не транспорт, которым письмо попало к отправляющему сервису.\u003C\u002Fp>\n\u003Ch3>Можно ли пользоваться SMTP и API одновременно?\u003C\u002Fh3>\n\u003Cp>Да, и это распространённая схема. Токен один, домен один, журнал общий; у каждого письма записан способ отправки, по которому можно фильтровать.\u003C\u002Fp>\n\u003Ch3>Нужен ли SDK, если есть REST API?\u003C\u002Fh3>\n\u003Cp>Нет, это удобство, а не необходимость. SDK экономит несколько строк на Python и даёт готовую асинхронную отправку. Как только нужны вложения, метки, пакетная отправка или \u003Ccode>message_id\u003C\u002Fcode> в ответе, вы всё равно возвращаетесь к обычному HTTP-запросу.\u003C\u002Fp>\n\u003Ch3>Есть ли SDK для других языков?\u003C\u002Fh3>\n\u003Cp>Официальный SDK сейчас один — Python. Для остальных языков API остаётся обычным \u003Ccode>POST\u003C\u002Fcode> с JSON: любой HTTP-клиент справится без дополнительной библиотеки.\u003C\u002Fp>\n\u003Ch3>Как отправлять письма, если хостинг блокирует исходящий SMTP?\u003C\u002Fh3>\n\u003Cp>Двумя способами: попробовать дублирующие порты 8587 и 8465, которые для этого и заведены, либо перейти на REST API — исходящий HTTPS открыт практически везде. Проверить доступность порта можно командой \u003Ccode>openssl s_client -starttls smtp -crlf -connect smtp.fmailer.ru:587\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>Нужно ли настраивать SPF, DKIM и DMARC, если я отправляю через API?\u003C\u002Fh3>\n\u003Cp>Да, и это не зависит от способа отправки. Панель генерирует три записи, которые нужно опубликовать у регистратора; дальше FMailer сам опрашивает DNS и следит, чтобы они не пропали при переезде на другой хостинг. Проверить текущее состояние домена можно бесплатными чекерами в разделе «Инструменты», ещё до регистрации.\u003C\u002Fp>\n\u003Ch3>Как узнать, что письмо дошло, при отправке по SMTP?\u003C\u002Fh3>\n\u003Cp>Так же, как и при отправке через API: вебхуками и журналом. По каждому письму виден настоящий SMTP-ответ принимающего сервера — с кодом и текстом, а не «ошибка доставки». Разница только в том, что при отправке через API вы получаете \u003Ccode>message_id\u003C\u002Fcode> сразу в ответе и можете сохранить его рядом с заказом.\u003C\u002Fp>\n\u003Ch3>Можно ли начать с SMTP и перейти на API потом?\u003C\u002Fh3>\n\u003Cp>Да, и это самый частый путь. SMTP снимает срочность — письма идут, — а API добавляется там, где нужны шаблоны, идемпотентность или рассылки. Учётные данные при этом не меняются: токен домена один и тот же.\u003C\u002Fp>\n\u003Ch2>Итог\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>SMTP\u003C\u002Fstrong> отвечает на вопрос «как начать отправлять сегодня». \u003Cstrong>REST API\u003C\u002Fstrong> отвечает на вопрос «как сделать так, чтобы отправка была надёжной через полгода»: идемпотентность, шаблоны, метки, пачки, \u003Ccode>message_id\u003C\u002Fcode> и понятные коды отказа. \u003Cstrong>SDK\u003C\u002Fstrong> — короткий путь к API для Python-проектов, у которого есть свои границы.\u003C\u002Fp>\n\u003Cp>Правильный ответ для большинства проектов состоит из двух шагов: подключиться по SMTP за час, а затем перевести на API те письма, где повтор запроса, шаблон или рассылка действительно что-то значат. Один токен, один домен, один журнал — переход ничего не ломает.\u003C\u002Fp>\n\u003Ch2>Попробовать FMailer\u003C\u002Fh2>\n\u003Cp>Подключите домен на fmailer.ru: панель сгенерирует SPF, DKIM и DMARC и проверит их сама, а первое письмо можно отправить через SMTP, не меняя код, — или через API, если начинаете с нуля. Пока DNS расходится, интеграцию можно собрать в песочнице: настоящий DKIM, настоящая доставка, те же вебхуки.\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Ffmailer.ru\">Подключить домен на fmailer.ru →\u003C\u002Fa>\u003C\u002Fp>","c4bc8734-62c8-4a53-9bc1-009cc0d18aac","2026-09-02T20:17:03.051772+03:00","2026-09-02T20:17:43.799451+03:00","fmailer","SMTP, REST API или SDK: что выбрать для отправки писем","SMTP-релей, REST API или Python SDK — три способа отправлять письма из приложения через FMailer. Сравниваем возможности, примеры кода и сценарии выбора.","https:\u002F\u002Fapi.fmailer.ru\u002Fmedia\u002Fblog\u002Frecord_c4bc8734-62c8-4a53-9bc1-009cc0d18aac\u002FChatGPT_Image_Sep_2_2026_08_14_32_PM.png",true,"2026-09-02T20:16:20+03:00",[20,21,22,23],"отправка писем через api","email api для приложения","python sdk для отправки писем","smtp релей",{"id":25,"body":26,"uuid":27,"created_at":28,"updated_at":29,"brand":13,"header":30,"short_body":31,"image":32,"published":17,"published_at":33,"tags":34},32,"\u003Ch1>FMailer и российские сервисы рассылок: где чьё место\u003C\u002Fh1>\n\u003Cp>\u003Cstrong>FMailer\u003C\u002Fstrong> — это транспорт для почты, которую отправляет ваше приложение: SMTP-релей на \u003Ccode>smtp.fmailer.ru\u003C\u002Fcode> и REST API, свои ключи DKIM на каждый домен, автоматическая проверка SPF и DMARC, приём отчётов DMARC на наш адрес \u003Ccode>rua=\u003C\u002Fcode>, журнал с настоящим ответом принимающего сервера и вебхуки о доставке, отказах и отписках. Письмо здесь собирает код, а не человек в редакторе.\u003C\u002Fp>\n\u003Cp>Российский рынок рассылок при этом устроен так, что большинство сервисов решают другую задачу. Ниже — короткая карта рынка, чтобы стало видно, где стоит FMailer, а дальше разбор по возможностям: что FMailer делает с аутентификацией, с разделением потоков, с событиями, с отчётами DMARC, с трекингом, с отпиской и с входящей почтой. В конце — сравнительная таблица, инструкция по переезду и ответы на частые вопросы.\u003C\u002Fp>\n\u003Ch2>Российский рынок в четырёх категориях — и где в нём FMailer\u003C\u002Fh2>\n\u003Cp>Рынок делится не на «дорогие и дешёвые сервисы», а на четыре класса продуктов.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Полноценные ESP\u003C\u002Fstrong> построены вокруг визуального редактора письма, базы подписчиков, сегментации и автоматических цепочек. Сюда относятся UniSender — один из самых известных российских сервисов email- и SMS-рассылок; SendPulse с несколькими каналами сразу (email, SMS, push, чат-боты в мессенджерах); DashaMail, сфокусированный на email; Sendsay с уклоном в сложные сценарии и большие базы; Notisend, где к email добавлены SMS и push. Центр тяжести у всех — кампании и подписчики.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>CDP и enterprise-платформы\u003C\u002Fstrong> продают не отправку писем, а управление клиентскими данными: Mindbox описывает себя как омниканальную платформу автоматизации маркетинга с профилем клиента, сегментацией, персонализацией сайта и программами лояльности; enKod — как платформу клиентских данных с массовыми и триггерными рассылками, push-уведомлениями и рекомендациями. Письмо здесь — один из выходов системы, а подключение обычно является проектом внедрения.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Транспорт\u003C\u002Fstrong> — сервисы, у которых письмо приходит извне, из вашего приложения, и задача продукта в том, чтобы его аутентифицировать, отправить и рассказать, что с ним стало. Здесь Mailopost с API и SMTP; SMTP.bz, позиционируемый как SMTP-сервис с API, логами и валидатором адресов; Yandex Cloud Postbox, отправляющий по SMTP или AWS-SES-совместимому API внутри Yandex Cloud.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Свой Postfix\u003C\u002Fstrong> — четвёртый вариант: софт бесплатный, контроль полный, а дальше начинается эксплуатация. PTR-запись и согласованность зон, прогрев нового IP неделями, выход из чёрных списков перепиской с каждым списком отдельно, приём и разбор XML-отчётов DMARC, мониторинг очереди с ретраями и greylisting, ведение списка подавления по кодам ответа и дежурство — почта ломается ночью так же охотно, как днём.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>FMailer стоит в третьей категории.\u003C\u002Fstrong> Он не рисует письма — он их доставляет и отвечает на вопрос, что с каждым из них произошло. Дальше — по возможностям, по одной на раздел.\u003C\u002Fp>\n\u003Ch2>Аутентификация домена: FMailer генерирует SPF, DKIM и DMARC и проверяет их сам\u003C\u002Fh2>\n\u003Cp>Для каждого подключённого домена FMailer генерирует отдельную пару ключей RSA на 2048 бит и подписывает каждое письмо алгоритмом \u003Ccode>rsa-sha256\u003C\u002Fcode>. Ключ не общий на весь сервис и не общий на аккаунт — репутация подписи принадлежит вашему домену.\u003C\u002Fp>\n\u003Cp>Панель формирует три записи, которые нужно опубликовать у регистратора: SPF, DKIM и DMARC. Дальше проверка идёт сама: FMailer опрашивает DNS и отмечает домен подтверждённым, когда записи видны.\u003C\u002Fp>\n\u003Cp>Ключевая деталь — проверка не разовая. Если запись потом пропадёт или её перепишут при переезде на другой хостинг, домен перестанет быть подтверждённым, и вы узнаете об этом от нас, а не от клиента, который не получил чек. Домен, у которого месяц назад отвалилась DKIM-запись, а никто не заметил, — самая обычная причина «письма вдруг перестали доходить».\u003C\u002Fp>\n\u003Cp>Для контекста: настройку DKIM и SPF документируют практически все — это гигиенический минимум рынка, и у DashaMail, SendPulse, Notisend и Postbox есть свои инструкции по этим записям. Различие не в том, показывает ли сервис нужную строку для DNS, а в том, следит ли он за ней потом.\u003C\u002Fp>\n\u003Ch2>Транзакционные письма и рассылки: FMailer разводит потоки автоматически\u003C\u002Fh2>\n\u003Cp>Пароли, коды и чеки не должны ехать по тем же рельсам, что и акция на 200 000 адресов. Один всплеск жалоб на рассылку — и восстановление пароля начинает падать в спам.\u003C\u002Fp>\n\u003Cp>FMailer разделяет эти потоки сам: классификатор определяет, что за письмо пришло на отправку, а отправитель может пометить письмо массовым явно, флагом в запросе. Явная пометка приоритетнее — вы всегда знаете о своём письме больше, чем эвристика.\u003C\u002Fp>\n\u003Cp>Практический смысл в том, что кампания на большую базу не портит доставку писем со сбросом пароля. Это же объясняет, почему FMailer одинаково спокойно относится и к транзакционным письмам, и к рассылкам по вашей собственной базе: они не мешают друг другу.\u003C\u002Fp>\n\u003Cp>Отдельно стоит развести и домены — об этом ниже, в разделе про частые ошибки.\u003C\u002Fp>\n\u003Ch2>SMTP и REST API: как FMailer подключается к вашему приложению\u003C\u002Fh2>\n\u003Cp>Подключиться можно двумя способами, и оба доступны сразу.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>SMTP-релей\u003C\u002Fstrong> — способ мигрировать за час. Приложение уже умеет отправлять почту; вы меняете три настройки:\u003C\u002Fp>\n\u003Cpre>\u003Ccode>host:     smtp.fmailer.ru\nport:     587 (STARTTLS) · 465 (TLS) · 25\nlogin:    логин токена домена\npassword: токен домена\nauth:     CRAM-MD5 или PLAIN\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Токен создаётся отдельно на каждый домен, поэтому разработка, production и маркетинговый домен разводятся разными учётными данными.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>REST API\u003C\u002Fstrong> — для нового кода. Отправка письма с темой и телом:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">curl -X POST https:\u002F\u002Fapi.fmailer.ru\u002Fexternal\u002Fsend_email_simple\u002F \\\n  -H &quot;Content-Type: application\u002Fjson&quot; \\\n  -d '{\n    &quot;auth&quot;: {&quot;username&quot;: &quot;ЛОГИН_ТОКЕНА&quot;, &quot;password&quot;: &quot;ТОКЕН&quot;},\n    &quot;sender&quot;: &quot;Магазин &lt;noreply@example.ru&gt;&quot;,\n    &quot;recipient&quot;: &quot;client@example.ru&quot;,\n    &quot;subject&quot;: &quot;Код подтверждения&quot;,\n    &quot;body&quot;: &quot;&lt;p&gt;Ваш код: 481920&lt;\u002Fp&gt;&quot;,\n    &quot;text&quot;: &quot;Ваш код: 481920&quot;,\n    &quot;idempotency_key&quot;: &quot;otp-user-9182-1719158400&quot;\n  }'\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>То же самое на Python, ближе к тому, как это выглядит в реальном бэкенде:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-python\">import requests\n\nresp = requests.post(\n    &quot;https:\u002F\u002Fapi.fmailer.ru\u002Fexternal\u002Fsend_email_simple\u002F&quot;,\n    json={\n        &quot;auth&quot;: {&quot;username&quot;: LOGIN, &quot;password&quot;: TOKEN},\n        &quot;sender&quot;: &quot;Магазин &lt;noreply@example.ru&gt;&quot;,\n        &quot;recipient&quot;: &quot;client@example.ru&quot;,\n        &quot;subject&quot;: &quot;Код подтверждения&quot;,\n        &quot;body&quot;: &quot;&lt;p&gt;Ваш код: 481920&lt;\u002Fp&gt;&quot;,\n        &quot;text&quot;: &quot;Ваш код: 481920&quot;,\n        # Защита от дубля, если запрос ушёл повторно после таймаута\n        &quot;idempotency_key&quot;: &quot;otp-user-9182-1719158400&quot;,\n    },\n    timeout=10,\n)\nresp.raise_for_status()\nprint(resp.json()[&quot;ok&quot;])\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Для этого API есть официальный Python SDK, если не хочется собирать запрос руками.\u003C\u002Fp>\n\u003Cp>Два поля стоит поставить сразу, а не потом. \u003Cstrong>\u003Ccode>idempotency_key\u003C\u002Fcode>\u003C\u002Fstrong> — чтобы повтор запроса после таймаута не отправил второй код подтверждения. \u003Cstrong>\u003Ccode>text\u003C\u002Fcode>\u003C\u002Fstrong> — текстовая версия: если её не передать, FMailer выведет её из HTML, но вывод не знает, какие части вёрстки были украшением.\u003C\u002Fp>\n\u003Cp>Письмо можно и не собирать в коде. FMailer хранит шаблоны на сервере: приложение передаёт \u003Ccode>tpl\u003C\u002Fcode> — идентификатор шаблона, \u003Ccode>params\u003C\u002Fcode> с данными для подстановки и, если у шаблона несколько языковых версий, \u003Ccode>lang\u003C\u002Fcode>. У одного шаблона может быть русская и английская версия, а оформление настраивается под ваш бренд: логотип, цвет, название компании. Менять вёрстку письма можно без релиза приложения.\u003C\u002Fp>\n\u003Cp>Для контекста: SMTP и HTTP-API вместе документируют Mailopost, SMTP.bz, Notisend и Postbox (у последнего API AWS-SES-совместимый), а у ESP транзакционная отправка обычно вынесена в отдельный продукт или отдельный раздел документации.\u003C\u002Fp>\n\u003Ch2>События и вебхуки: FMailer отдаёт настоящий ответ принимающего сервера\u003C\u002Fh2>\n\u003Cp>Отправка — половина работы. Вторая половина — знать, что произошло.\u003C\u002Fp>\n\u003Cp>FMailer шлёт вебхуки по событиям: доставлено, отложено, постоянный отказ, открытие, отписка. Запросы подписываются и повторяются при временной ошибке на вашей стороне, так что упавший на минуту обработчик не теряет события.\u003C\u002Fp>\n\u003Cp>Главное здесь — журнал. По каждому письму в нём виден \u003Cstrong>настоящий SMTP-ответ принимающего сервера\u003C\u002Fstrong>: не «ошибка доставки», а строка, которую вернул сервер получателя, с кодом и текстом. Именно она отвечает на вопрос, почему письмо не дошло, и именно её не хватает, когда в интерфейсе стоит красный крестик без объяснений.\u003C\u002Fp>\n\u003Cp>Вебхуки о событиях сейчас есть у большей части рынка: их документируют UniSender, SendPulse, DashaMail, Sendsay, Mailopost и Mindbox, а Postbox отдаёт уведомления об операциях с письмами в собственные сервисы логирования и мониторинга. Разница обычно не в наличии события, а в том, что лежит внутри него.\u003C\u002Fp>\n\u003Ch2>Отчёты DMARC и репутация домена: FMailer принимает \u003Ccode>rua\u003C\u002Fcode> и превращает его в число\u003C\u002Fh2>\n\u003Cp>Опубликовать \u003Ccode>_dmarc\u003C\u002Fcode> с \u003Ccode>p=none\u003C\u002Fcode> умеет кто угодно. Гораздо реже кто-то эти отчёты действительно принимает и читает.\u003C\u002Fp>\n\u003Cp>Каждому домену в FMailer выдаётся адрес \u003Ccode>rua=\u003C\u002Fcode> \u003Cstrong>на нашей стороне\u003C\u002Fstrong>. Агрегированные отчёты, которые присылают почтовые провайдеры, разбираются, и измеренное по ним соответствие подписи и отправителя влияет на оценку репутации домена. Сама оценка пересчитывается непрерывно по доле доставленных писем, отказам, открытиям, жалобам на спам и отпискам.\u003C\u002Fp>\n\u003Cp>Практический смысл простой. Сломанный ключ DKIM или SPF-запись, которая перестала авторизовать отправителя, становится числом в панели, а не загадкой на две недели. Репутация проседает раньше, чем начинают жаловаться пользователи, — и это тот показатель, за которым имеет смысл следить до того, как что-то сломается.\u003C\u002Fp>\n\u003Cp>Это самая узкая часть рынка. Ближе всего подходит UniSender Go: если своей записи \u003Ccode>_dmarc\u003C\u002Fcode> у вас нет, он предлагает делегировать её CNAME-записью на свой домен и дальше ведёт её сам. Остальные разбираемые здесь сервисы документируют публикацию DMARC как вашу задачу и отчёты на свою сторону не принимают. Если для вас это важно, спрашивайте про \u003Ccode>rua=\u003C\u002Fcode> прямо, у кого угодно.\u003C\u002Fp>\n\u003Ch2>Трекинг на вашем домене: FMailer ставит пиксель и ссылки на \u003Ccode>stats.&lt;домен&gt;\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Пиксель открытия и ссылки в письмах FMailer живут на \u003Ccode>stats.&lt;ваш-домен&gt;\u003C\u002Fcode>, а не на нашем хосте. Получатель не видит в письме чужой бренд, а репутация трекингового хоста принадлежит вам, а не общему пулу отправителей сервиса.\u003C\u002Fp>\n\u003Cp>Это тот случай, когда рынок в целом согласен: собственный поддомен для ссылок настраивается CNAME-записью у SendPulse и DashaMail (последний прямо объясняет это тем, что так ваша репутация не зависит от других отправителей сервиса), а у UniSender Go есть раздел «Домены ссылок». У Mailopost документация описывает трекинг на служебных доменах сервиса.\u003C\u002Fp>\n\u003Ch2>Отписка в один клик: FMailer ставит заголовки RFC 8058 на массовых письмах\u003C\u002Fh2>\n\u003Cp>На массовых письмах FMailer проставляет \u003Ccode>List-Unsubscribe\u003C\u002Fcode> и \u003Ccode>List-Unsubscribe-Post\u003C\u002Fcode> — ту самую отписку в одно нажатие по \u003Cstrong>RFC 8058\u003C\u002Fstrong>, которую сейчас ожидают от массовых отправителей Gmail, Yahoo и Mail.ru. Отписавшиеся попадают в общий список подавления, и повторно им ничего не уйдёт.\u003C\u002Fp>\n\u003Cp>Важная деталь реализации: транзакционные письма в этот механизм \u003Cstrong>намеренно не включены\u003C\u002Fstrong>. Список подавления общий, и отписка, записанная против письма со сбросом пароля, тихо остановила бы следующий такой же запрос у того же человека. Отписка от рассылки не должна ломать вход в аккаунт.\u003C\u002Fp>\n\u003Cp>Без этих заголовков человек, которому надоела рассылка, нажимает «Спам». Отписка стоит вам одного адреса, жалоба — репутации домена.\u003C\u002Fp>\n\u003Ch2>Входящая почта: FMailer отдаёт письмо вебхуком \u003Ccode>inbound.received\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>FMailer умеет не только отправлять. Вы направляете MX отдельного поддомена — например, \u003Ccode>inbound.example.ru\u003C\u002Fcode> — на \u003Ccode>mx.fmailer.ru\u003C\u002Fcode> и задаёте маршруты: \u003Ccode>support\u003C\u002Fcode>, \u003Ccode>ticket-*\u003C\u002Fcode> или \u003Ccode>*\u003C\u002Fcode> для всего остального, приоритет у самого конкретного.\u003C\u002Fp>\n\u003Cp>Каждое принятое письмо приходит в ваш сервис вебхуком \u003Ccode>inbound.received\u003C\u002Fcode> уже разобранным: отправитель, тема, текст и HTML, заголовки, результат проверки DKIM. Исходный \u003Ccode>.eml\u003C\u002Fcode> и каждое вложение доступны по авторизованной ссылке, а в панели ведётся журнал принятых писем.\u003C\u002Fp>\n\u003Cp>Это не почтовый ящик для чтения человеком, а вход в ваше приложение: ответы клиентов попадают прямо в CRM или тикет-систему, без IMAP и без опроса ящика. MX основного домена при этом не трогается. Функция доступна на платных тарифах.\u003C\u002Fp>\n\u003Cp>Отдельный входящий роутер на российском рынке есть, например, у DashaMail — «Даша.Роутер», который принимает письма на адреса клиента и шлёт разобранное письмо POST-запросом на указанный URL. У большинства остальных сервисов приём почты в открытой документации не описан.\u003C\u002Fp>\n\u003Ch2>Проверить домен до подключения: бесплатные чекеры FMailer\u003C\u002Fh2>\n\u003Cp>В разделе \u003Ccode>\u002Ftools\u003C\u002Fcode> у FMailer лежат чекеры SPF, DKIM, DMARC и MX и анализатор заголовков письма, который по служебным полям полученного сообщения показывает, что произошло с аутентификацией. Аккаунт для них не нужен — ими пользуются и те, кто ничего не подключает. Если вы сейчас выбираете сервис, это самый быстрый способ узнать, в каком состоянии ваш домен вообще находится.\u003C\u002Fp>\n\u003Ch2>FMailer и другие сервисы: сравнение возможностей\u003C\u002Fh2>\n\u003Cp>Таблица сравнивает \u003Cstrong>возможности\u003C\u002Fstrong>, а не качество и не цены.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Сервис\u003C\u002Fth>\n\u003Cth>SMTP-релей\u003C\u002Fth>\n\u003Cth>REST API\u003C\u002Fth>\n\u003Cth>Вебхуки о событиях\u003C\u002Fth>\n\u003Cth>Трекинг на своём поддомене\u003C\u002Fth>\n\u003Cth>Входящая почта\u003C\u002Fth>\n\u003Cth>Приём отчётов DMARC\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>FMailer\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003Cstrong>да\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>UniSender\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>?\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>SendPulse\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>?\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>DashaMail\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>?\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Sendsay\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>?\u003C\u002Ftd>\n\u003Ctd>?\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Notisend\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>?\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Mindbox\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>?\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>enKod\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>?\u003C\u002Ftd>\n\u003Ctd>?\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Mailopost\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>SMTP.bz\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>?\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Yandex Cloud Postbox\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>да\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003Ctd>нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>\u003Ccode>да\u003C\u002Fcode> — заявлено провайдером, \u003Ccode>нет\u003C\u002Fcode> — возможности нет или она не входит в продукт, \u003Ccode>?\u003C\u002Fcode> — не удалось подтвердить по открытым источникам.\u003C\u002Fp>\n\u003Cp>Данные из открытых источников — официальных сайтов и документации провайдеров, актуальны на момент публикации.\u003C\u002Fp>\n\u003Cp>Две оговорки к строкам. У UniSender транзакционная отправка вынесена в отдельный продукт, UniSender Go, и строка отражает возможности этой связки; приём отчётов DMARC там устроен как делегирование записи \u003Ccode>_dmarc\u003C\u002Fcode>. У FMailer входящая почта доступна на платных тарифах.\u003C\u002Fp>\n\u003Ch2>Как переехать на FMailer\u003C\u002Fh2>\n\u003Ch3>Шаг 1. Подключить домен и опубликовать DNS-записи\u003C\u002Fh3>\n\u003Cp>Добавьте домен в панели — она сгенерирует SPF, DKIM и DMARC, которые нужно опубликовать у регистратора. Дальше FMailer сам опрашивает DNS и отмечает домен подтверждённым, когда записи видны; скорость зависит от регистратора и TTL.\u003C\u002Fp>\n\u003Cp>Отправляйте с поддомена (\u003Ccode>mail.example.ru\u003C\u002Fcode>) — тогда MX и корпоративная почта основного домена остаются нетронутыми. Пока записи расходятся по DNS, состояние можно проверить бесплатными чекерами в разделе \u003Ccode>\u002Ftools\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>Шаг 2. Переключить SMTP или подключить API\u003C\u002Fh3>\n\u003Cp>Параметры SMTP и примеры запросов — выше, в разделе про подключение. Если приложение уже отправляет почту, менять код не нужно: меняются хост, логин и пароль. Можно начать с SMTP и перейти на API позже, когда понадобятся серверные шаблоны и идемпотентность.\u003C\u002Fp>\n\u003Ch3>Шаг 3. Подписаться на события\u003C\u002Fh3>\n\u003Cp>Настройте вебхук и обрабатывайте события: доставка, отложенная доставка, постоянный отказ, открытие, отписка. Постоянный отказ — сигнал занести адрес в подавление; отложенная доставка — не повод паниковать, это нормальная работа очереди.\u003C\u002Fp>\n\u003Ch3>Шаг 4. Переезжать по частям\u003C\u002Fh3>\n\u003Cp>Не переключайте весь трафик разом: для принимающей стороны это выглядит как внезапный всплеск от неизвестного отправителя. Начните с наименее критичного типа писем, посмотрите на долю доставленных и отказы, и только потом переносите коды и пароли. Порядок переноса — ваш, и торопиться в нём нечего.\u003C\u002Fp>\n\u003Ch2>Частые ошибки и что FMailer с ними делает\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Транзакционные и массовые письма с одного домена.\u003C\u002Fstrong> Один всплеск жалоб на рассылку — и коды подтверждения уходят в спам. FMailer разводит потоки внутри, но домены всё равно стоит развести: отдельный токен на каждый домен для того и нужен.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Нет \u003Ccode>rua=\u003C\u002Fcode> в DMARC.\u003C\u002Fstrong> Политика опубликована, отчёты никуда не идут, и вы узнаёте о сломанной подписи от клиента. FMailer выдаёт адрес для отчётов каждому домену и превращает их в оценку репутации.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>У массовых писем нет one-click отписки.\u003C\u002Fstrong> Без \u003Ccode>List-Unsubscribe\u003C\u002Fcode> и \u003Ccode>List-Unsubscribe-Post\u003C\u002Fcode> человек нажимает «Спам». FMailer ставит эти заголовки на массовые письма автоматически.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Отправка с бесплатного адреса на mail.ru или yandex.ru.\u003C\u002Fstrong> Их DMARC-политики не позволяют другому сервису отправлять от их имени, и такое письмо получатель либо не увидит, либо увидит с предупреждением. Отправляйте только со своего домена — FMailer и не даст отправить с чужого, отправитель проверяется по подключённому домену.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Купленные и собранные базы.\u003C\u002Fstrong> Это не «плохая практика», а прямой путь в спам-ловушки и чёрные списки, откуда домен выбирается месяцами. Никакой сервис это не лечит.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Игнорирование soft bounce.\u003C\u002Fstrong> Временный отказ (\u003Ccode>4xx\u003C\u002Fcode>) — это «попробуйте позже», и очередь попробует. Систематические временные отказы от одного провайдера — сигнал, что вас придерживают. В журнале FMailer виден код и текст ответа, так что этот сигнал можно прочитать заранее.\u003C\u002Fp>\n\u003Ch2>Частые вопросы о FMailer и российских сервисах рассылок\u003C\u002Fh2>\n\u003Ch3>Чем FMailer отличается от сервиса рассылок?\u003C\u002Fh3>\n\u003Cp>Тем, кто пишет письмо. В сервисе рассылок письмо собирает человек в редакторе и отправляет по списку. В FMailer письмо порождает код по событию — регистрация, оплата, смена статуса заказа — и отправляется оно одному адресату. Отсюда всё остальное: там центр продукта — редактор и сегменты, здесь — API, журнал и события.\u003C\u002Fp>\n\u003Ch3>Можно ли отправлять через FMailer и рассылки, и транзакционные письма?\u003C\u002Fh3>\n\u003Cp>Да. Потоки разделяются автоматически, а отправитель может пометить письмо массовым явно. Домены при этом лучше развести, чтобы всплеск жалоб на рассылку не задел репутацию домена, с которого уходят пароли.\u003C\u002Fp>\n\u003Ch3>Нужно ли переносить корпоративную почту, чтобы подключить FMailer?\u003C\u002Fh3>\n\u003Cp>Нет. Отправка настраивается на отдельном поддомене, MX основного домена не трогаются, ваша переписка продолжает жить там, где жила.\u003C\u002Fp>\n\u003Ch3>Что выбрать — SMTP или API?\u003C\u002Fh3>\n\u003Cp>SMTP, если приложение уже отправляет почту и надо переехать быстро: меняются хост, логин и пароль. API, если пишете интеграцию с нуля и нужны серверные шаблоны, идемпотентность и машинный разбор ответа. Можно начать с первого и перейти ко второму.\u003C\u002Fp>\n\u003Ch3>Гарантирует ли статус «доставлено» попадание во «Входящие»?\u003C\u002Fh3>\n\u003Cp>Нет, и никакой сервис такого не гарантирует. Статус означает, что принимающий сервер принял сообщение; папку выбирают алгоритмы почтового провайдера и настройки получателя. Что FMailer даёт вместо обещаний — настоящий ответ принимающего сервера в журнале.\u003C\u002Fp>\n\u003Ch3>Зачем нужны отчёты DMARC, если письма и так доходят?\u003C\u002Fh3>\n\u003Cp>Чтобы узнать о поломке до того, как она станет заметна. Из агрегированных отчётов видно, сколько писем от вашего имени прошли проверку подписи, сколько нет и кто ещё отправляет от вашего домена. FMailer принимает эти отчёты на свой адрес \u003Ccode>rua=\u003C\u002Fcode> и превращает их в оценку репутации домена.\u003C\u002Fp>\n\u003Ch3>Можно ли через FMailer ещё и принимать письма?\u003C\u002Fh3>\n\u003Cp>Да, на платных тарифах. MX отдельного поддомена направляется на \u003Ccode>mx.fmailer.ru\u003C\u002Fcode>, задаются маршруты, и каждое входящее письмо приходит в ваш сервис вебхуком \u003Ccode>inbound.received\u003C\u002Fcode> с разобранными полями и вложениями.\u003C\u002Fp>\n\u003Ch3>Сколько стоят российские сервисы рассылок?\u003C\u002Fh3>\n\u003Cp>Модели разные — от объёма писем до подписки с внедрением, — и тарифы меняются. Сверяйтесь с актуальным прайсом на сайте каждого провайдера и уточняйте, что входит в цену: срок хранения журнала, выгрузка событий, поддержка и лимиты отправки различаются между планами сильнее, чем базовая стоимость письма.\u003C\u002Fp>\n\u003Ch2>Итог: где FMailer сильнее всего\u003C\u002Fh2>\n\u003Cp>Если письмо у вас собирает код, а вопросы звучат как «дошло или нет» и «что именно ответил сервер получателя», FMailer сделан ровно под это.\u003C\u002Fp>\n\u003Cp>Подключив домен, вы получаете свои ключи DKIM на 2048 бит и записи SPF и DMARC, которые проверяются автоматически и после подключения тоже; реально принимаемые отчёты DMARC и репутацию домена как число; разделённые транзакционный и массовый потоки; вебхуки о событиях и журнал с настоящим SMTP-ответом; трекинг на вашем собственном \u003Ccode>stats.&lt;домен&gt;\u003C\u002Fcode>; отписку в один клик по RFC 8058 на массовых письмах; входящую почту вебхуком; серверные шаблоны с русской и английской версиями.\u003C\u002Fp>\n\u003Ch2>Попробовать FMailer\u003C\u002Fh2>\n\u003Cp>Подключите домен на fmailer.ru: панель сгенерирует SPF, DKIM и DMARC, проверит их сама, и первое письмо можно отправить через SMTP, ничего не меняя в коде. А проверить текущее состояние аутентификации своего домена можно прямо сейчас и без регистрации — бесплатными чекерами в разделе «Инструменты».\u003C\u002Fp>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Ffmailer.ru\">Подключить домен на fmailer.ru →\u003C\u002Fa>\u003C\u002Fp>","c2abf9a3-b6dc-43f6-92be-3237c886a504","2026-08-27T20:02:36.484745+03:00","2026-08-27T20:03:15.462008+03:00","FMailer и российские сервисы рассылок: сравнение (2026)","FMailer — SMTP-релей и REST API для писем из вашего приложения: DKIM на домен, отчёты DMARC, вебхуки. Разбираем российский рынок рассылок и место FMailer.","https:\u002F\u002Fapi.fmailer.ru\u002Fmedia\u002Fblog\u002Frecord_c2abf9a3-b6dc-43f6-92be-3237c886a504\u002F87e106dd-3976-4857-9835-069b624725d4.png","2026-08-27T19:57:55+03:00",[35,36,37],"российские сервисы рассылок","сервис транзакционных писем","smtp релей для рассылок",{"id":39,"body":40,"uuid":41,"created_at":42,"updated_at":43,"brand":13,"header":44,"short_body":45,"image":46,"published":17,"published_at":47,"tags":48},30,"\u003Cp>Вашему приложению нужно принимать электронную почту.\u003C\u002Fp>\n\u003Cp>Возможно, вы разрабатываете службу поддержки, обрабатываете счета и документы, отслеживаете ответы клиентов или хотите создать уникальный email-адрес для каждого проекта, тикета или пользователя в своем SaaS.\u003C\u002Fp>\n\u003Cp>Традиционный подход предполагает запуск собственного почтового сервера. Необходимо открыть порт 25, настроить MX-записи, установить Postfix или Exim, обрабатывать MIME-сообщения, проверять отправителей, сохранять вложения и постоянно следить за доступностью инфраструктуры.\u003C\u002Fp>\n\u003Cp>Проблемы начинаются, когда хостинг-провайдер блокирует SMTP-трафик. Или когда команда понимает, что не хочет обслуживать публичный почтовый сервер ради одной функции продукта.\u003C\u002Fp>\n\u003Cp>Практичная альтернатива — отделить \u003Cstrong>прием почты\u003C\u002Fstrong> от \u003Cstrong>обработки данных приложением\u003C\u002Fstrong>:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Сервис входящей почты принимает SMTP-соединение.\u003C\u002Fli>\n\u003Cli>Сервис разбирает и сохраняет сообщение.\u003C\u002Fli>\n\u003Cli>Ваше приложение получает письмо через подписанный HTTPS-вебхук.\u003C\u002Fli>\n\u003Cli>Код обрабатывает письмо как обычное API-событие.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Функция входящей почты Fmailer построена именно по этой модели. Вы направляете MX-запись принимающего хоста на Fmailer, создаете маршруты для адресов и получаете разобранные письма через события \u003Ccode>inbound.received\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2>Почему заблокированные SMTP-порты создают проблему\u003C\u002Fh2>\n\u003Cp>Сначала важно разобраться, для чего используются основные SMTP-порты.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Порт\u003C\u002Fth>\n\u003Cth>Основное назначение\u003C\u002Fth>\n\u003Cth>Используется для приема почты из интернета\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>25\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Передача почты между почтовыми серверами\u003C\u002Ftd>\n\u003Ctd>Да\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>587\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Аутентифицированная отправка сообщений\u003C\u002Ftd>\n\u003Ctd>Нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>465\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Отправка сообщений через TLS\u003C\u002Ftd>\n\u003Ctd>Нет\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Порт 25 остается стандартным портом для передачи сообщений между почтовыми серверами.\u003C\u002Fp>\n\u003Cp>Порт 587 предназначен для аутентифицированной отправки писем почтовыми клиентами и приложениями. Порт 465 также используется для отправки сообщений, но через TLS-соединение.\u003C\u002Fp>\n\u003Cp>Поэтому нельзя просто заменить входящий порт 25 на 587 или 465 и ожидать, что сервер станет полноценным публичным MX-получателем.\u003C\u002Fp>\n\u003Cp>Ограничения зависят от конкретного облачного провайдера:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Amazon EC2 по умолчанию ограничивает исходящий трафик через порт 25.\u003C\u002Fli>\n\u003Cli>Google Cloud обычно блокирует внешние соединения через порт 25, но разрешает порты 465 и 587.\u003C\u002Fli>\n\u003Cli>Azure блокирует исходящий порт 25 для многих типов подписок и рекомендует использовать аутентифицированные relay-сервисы.\u003C\u002Fli>\n\u003Cli>DigitalOcean блокирует SMTP-порты 25, 465 и 587 на Droplet-серверах.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Чаще всего ограничения провайдеров относятся именно к исходящему SMTP-трафику. Однако самостоятельный прием почты все равно требует публично доступного SMTP-сервера, корректных правил firewall, постоянного IP-адреса, DNS-настроек, TLS, защиты от злоупотреблений и постоянного мониторинга.\u003C\u002Fp>\n\u003Cp>Для большинства SaaS-продуктов проще полностью убрать SMTP из инфраструктуры приложения, чем добиваться снятия ограничений и обслуживать собственный почтовый сервер.\u003C\u002Fp>\n\u003Ch2>Более практичная архитектура: MX на входе, HTTPS на выходе\u003C\u002Fh2>\n\u003Cp>Сервис входящей почты выступает мостом между почтовой сетью и вашим приложением.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Почтовый сервер отправителя\n        |\n        | SMTP, порт 25\n        v\nВходящий MX-сервер Fmailer\n        |\n        | Парсинг, проверка и сохранение\n        v\nПодписанный HTTPS-вебхук\n        |\n        v\nВаше приложение\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Вашему серверу достаточно принимать обычный HTTPS-трафик.\u003C\u002Fp>\n\u003Cp>Fmailer берет на себя SMTP-часть системы и передает вашему приложению структурированное JSON-событие.\u003C\u002Fp>\n\u003Cp>В результате вашему приложению не требуется:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>открывать порт 25;\u003C\u002Fli>\n\u003Cli>устанавливать Postfix, Exim или другой MTA;\u003C\u002Fli>\n\u003Cli>самостоятельно разбирать multipart MIME-сообщения;\u003C\u002Fli>\n\u003Cli>управлять очередями SMTP;\u003C\u002Fli>\n\u003Cli>хранить оригинальные письма и вложения;\u003C\u002Fli>\n\u003Cli>отклонять неизвестные адреса на уровне SMTP;\u003C\u002Fli>\n\u003Cli>следить за репутацией IP-адреса почтового сервера;\u003C\u002Fli>\n\u003Cli>устанавливать обновления безопасности для почтового ПО.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Вместо SMTP-сессий вы работаете с обычными HTTP-запросами.\u003C\u002Fp>\n\u003Ch2>Как работает входящая почта Fmailer\u003C\u002Fh2>\n\u003Cp>Входящая почта Fmailer предназначена для программных сценариев, а не для использования в качестве обычного почтового ящика.\u003C\u002Fp>\n\u003Cp>Сервис не предоставляет доступ через IMAP или POP3. Вместо этого каждое принятое письмо разбирается и отправляется вашему приложению через вебхук \u003Ccode>inbound.received\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Событие содержит:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>идентификатор входящего сообщения (\u003Ccode>inbound_id\u003C\u002Fcode>) и домен-получатель;\u003C\u002Fli>\n\u003Cli>сработавший маршрут и фактического получателя;\u003C\u002Fli>\n\u003Cli>SMTP-отправителя (\u003Ccode>mail_from\u003C\u002Fcode>) и разобранный заголовок \u003Ccode>From\u003C\u002Fcode>;\u003C\u002Fli>\n\u003Cli>адреса из заголовков \u003Ccode>To\u003C\u002Fcode> и \u003Ccode>Cc\u003C\u002Fcode>;\u003C\u002Fli>\n\u003Cli>тему письма;\u003C\u002Fli>\n\u003Cli>текстовую и HTML-версии сообщения;\u003C\u002Fli>\n\u003Cli>выбранные почтовые заголовки (\u003Ccode>Date\u003C\u002Fcode>, \u003Ccode>Reply-To\u003C\u002Fcode>, \u003Ccode>In-Reply-To\u003C\u002Fcode>, \u003Ccode>References\u003C\u002Fcode>, \u003Ccode>Auto-Submitted\u003C\u002Fcode>, \u003Ccode>List-Id\u003C\u002Fcode> и другие);\u003C\u002Fli>\n\u003Cli>результаты проверки DKIM;\u003C\u002Fli>\n\u003Cli>размер сообщения;\u003C\u002Fli>\n\u003Cli>список вложений с метаданными;\u003C\u002Fli>\n\u003Cli>API-ссылки для скачивания вложений и оригинального файла \u003Ccode>.eml\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Входящая почта доступна на платных тарифах: тариф домена должен включать и вебхуки, и входящую почту. На платных тарифах по умолчанию доступно до 25 маршрутов на домен.\u003C\u002Fp>\n\u003Cp>Рассмотрим процесс настройки по шагам.\u003C\u002Fp>\n\u003Ch2>Шаг 1. Выберите хост для приема почты\u003C\u002Fh2>\n\u003Cp>Начните с отдельного поддомена, например:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Для входящей почты обычно удобнее использовать поддомен, а не основной домен компании.\u003C\u002Fp>\n\u003Cp>Предположим, сотрудники уже получают почту на адреса:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">alex@example.com\nsupport@example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Изменение MX-записей для \u003Ccode>example.com\u003C\u002Fcode> может нарушить работу существующего почтового сервиса.\u003C\u002Fp>\n\u003Cp>Отдельный поддомен изолирует техническую почту приложения:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">ticket-123@inbound.example.com\nreply-456@inbound.example.com\nupload@inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Принимающим хостом может быть как поддомен подтвержденного домена, так и сам домен. Если домен уже подключен именно для приема почты (например, \u003Ccode>help.example.com\u003C\u002Fcode>), второй уровень вложенности не нужен.\u003C\u002Fp>\n\u003Cp>Есть одно ограничение: если на самом домене уже опубликована чужая MX-запись, Fmailer не даст назначить его принимающим хостом и предложит поддомен — это защита от случайного перехвата уже работающей корпоративной почты.\u003C\u002Fp>\n\u003Ch2>Шаг 2. Добавьте MX-запись\u003C\u002Fh2>\n\u003Cp>Fmailer покажет точную DNS-запись, которую необходимо добавить для принимающего хоста.\u003C\u002Fp>\n\u003Cp>Пример:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-dns\">inbound.example.com.  IN  MX  10  mx.fmailer.ru.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Эта запись сообщает другим почтовым серверам, что сообщения для адресов \u003Ccode>@inbound.example.com\u003C\u002Fcode> необходимо доставлять в Fmailer.\u003C\u002Fp>\n\u003Cp>Прием почты включается при выполнении трех условий:\u003C\u002Fp>\n\u003Col>\n\u003Cli>домен подтвержден обычной проверкой DNS-записей (в первую очередь DKIM);\u003C\u002Fli>\n\u003Cli>MX-запись принимающего хоста опубликована и подтверждена проверкой Fmailer;\u003C\u002Fli>\n\u003Cli>тариф домена включает входящую почту.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Проверка DNS выполняется автоматически; после того как запись подтверждена, прием начинается в течение нескольких минут.\u003C\u002Fp>\n\u003Cp>Для принимающего хоста рекомендуется оставить MX-запись Fmailer единственной.\u003C\u002Fp>\n\u003Cp>При этом вам не требуется направлять на Fmailer почту основного корпоративного домена.\u003C\u002Fp>\n\u003Ch2>Шаг 3. Создайте endpoint для вебхука\u003C\u002Fh2>\n\u003Cp>Создайте HTTPS-endpoint в своем приложении, например:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">POST \u002Fwebhooks\u002Ffmailer\u002Finbound\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Затем добавьте endpoint в панели Fmailer и подпишите его на событие:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">inbound.received\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>События входящей почты подключаются отдельно.\u003C\u002Fp>\n\u003Cp>Простого создания универсального webhook-endpoint недостаточно — необходимо явно выбрать событие \u003Ccode>inbound.received\u003C\u002Fcode> и указать этот endpoint в маршруте (см. следующий шаг). В отличие от событий отправки, входящее письмо не рассылается всем подписанным endpoint'ам: оно уходит ровно на тот, который назван сработавшим маршрутом.\u003C\u002Fp>\n\u003Cp>Fmailer подписывает webhook-запросы с помощью HMAC-SHA256. Перед разбором и обработкой события приложение должно проверить подпись на основе исходного тела HTTP-запроса.\u003C\u002Fp>\n\u003Cp>Каждый запрос содержит заголовки:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">X-Webhook-Event      inbound.received\nX-Webhook-Delivery   идентификатор доставки, он же event_id в теле\nX-Webhook-Timestamp  время подписи, unix-секунды\nX-Webhook-Signature  HMAC-SHA256 в hex\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Шаг 4. Настройте маршруты входящей почты\u003C\u002Fh2>\n\u003Cp>Маршруты определяют, какие email-адреса будут приниматься и на какой webhook-endpoint будут передаваться сообщения.\u003C\u002Fp>\n\u003Cp>Fmailer поддерживает три основных типа маршрутов:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Шаблон\u003C\u002Fth>\n\u003Cth>Тип\u003C\u002Fth>\n\u003Cth>Пример совпадения\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>support\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Точное совпадение\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>support@inbound.example.com\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>ticket-*\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Префикс\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>ticket-91@inbound.example.com\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>*\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>Catch-all\u003C\u002Ftd>\n\u003Ctd>Любой адрес без более точного маршрута\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Правила записи шаблона:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>указывается только локальная часть адреса, без \u003Ccode>@\u003C\u002Fcode> и без имени хоста;\u003C\u002Fli>\n\u003Cli>символ \u003Ccode>*\u003C\u002Fcode> допускается один и только в конце;\u003C\u002Fli>\n\u003Cli>префиксный маршрут требует хотя бы один символ на месте звездочки: \u003Ccode>ticket-*\u003C\u002Fcode> совпадает с \u003Ccode>ticket-91\u003C\u002Fcode>, но не с \u003Ccode>ticket-\u003C\u002Fcode>;\u003C\u002Fli>\n\u003Cli>сравнение регистронезависимое;\u003C\u002Fli>\n\u003Cli>маршрут ссылается ровно на один webhook-endpoint того же домена.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Приоритет маршрутизации:\u003C\u002Fp>\n\u003Col>\n\u003Cli>точное совпадение;\u003C\u002Fli>\n\u003Cli>самый длинный подходящий префикс;\u003C\u002Fli>\n\u003Cli>catch-all маршрут.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Если письмо отправлено на адрес, который не соответствует ни одному активному маршруту, Fmailer отклоняет его в рамках той же SMTP-сессии: почта на неизвестный хост отклоняется еще на этапе \u003Ccode>RCPT TO\u003C\u002Fcode>, а известный хост без подходящего маршрута отвечает \u003Ccode>550\u003C\u002Fcode> после передачи данных. В обоих случаях отчет о недоставке формирует сервер отправителя, а сообщение в вашу систему не попадает.\u003C\u002Fp>\n\u003Cp>Сервис не принимает бесконтрольно сообщения для неопределенных адресов.\u003C\u002Fp>\n\u003Cp>Таким способом можно создавать управляемые пространства адресов:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">support@inbound.example.com\ninvoice@inbound.example.com\nticket-&lt;ticket-id&gt;@inbound.example.com\nproject-&lt;project-id&gt;@inbound.example.com\ncustomer-&lt;customer-id&gt;@inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Шаг 5. Обработайте входящий webhook\u003C\u002Fh2>\n\u003Cp>Упрощенное событие входящей почты может выглядеть следующим образом:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  &quot;event_id&quot;: &quot;6f1d2c30-0004-4c7a-9b21-0c8e5a3d7f44&quot;,\n  &quot;event&quot;: &quot;inbound.received&quot;,\n  &quot;inbound_id&quot;: &quot;0f0b6c1a-4a1e-4a3a-9f7a-2c9d1b5e8a10&quot;,\n  &quot;domain&quot;: &quot;example.com&quot;,\n  &quot;route&quot;: &quot;support&quot;,\n  &quot;recipient&quot;: &quot;support@inbound.example.com&quot;,\n  &quot;mail_from&quot;: &quot;alex@customer.example&quot;,\n  &quot;from&quot;: {\n    &quot;email&quot;: &quot;alex@customer.example&quot;,\n    &quot;name&quot;: &quot;Alex&quot;\n  },\n  &quot;to&quot;: [&quot;support@inbound.example.com&quot;],\n  &quot;cc&quot;: [],\n  &quot;subject&quot;: &quot;Проблема с импортом данных&quot;,\n  &quot;text&quot;: &quot;Импорт останавливается на 72%.&quot;,\n  &quot;html&quot;: &quot;&lt;p&gt;Импорт останавливается на 72%.&lt;\u002Fp&gt;&quot;,\n  &quot;headers&quot;: {\n    &quot;Date&quot;: &quot;Tue, 12 Aug 2025 10:04:11 +0300&quot;,\n    &quot;Reply-To&quot;: &quot;alex@customer.example&quot;\n  },\n  &quot;message_id&quot;: &quot;&lt;a1b2c3@customer.example&gt;&quot;,\n  &quot;auth&quot;: {\n    &quot;dkim&quot;: &quot;pass&quot;,\n    &quot;dkim_aligned&quot;: true\n  },\n  &quot;size&quot;: 18422,\n  &quot;raw_url&quot;: &quot;https:\u002F\u002Fapi.fmailer.ru\u002Fapi\u002Finbound\u002Fmessages\u002F0f0b6c1a-...\u002Fraw\u002F&quot;,\n  &quot;attachments&quot;: [],\n  &quot;timestamp&quot;: &quot;2025-08-12T07:04:12.481Z&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Поля \u003Ccode>raw_url\u003C\u002Fcode> и \u003Ccode>attachments[].url\u003C\u002Fcode> — это постоянные API-адреса Fmailer, а не временные подписанные ссылки. Так сделано намеренно: тело события сохраняется и повторяется при ретраях в течение суток, а подписанная ссылка на хранилище живет минуты. Запрос к API выполняется с авторизацией вашего аккаунта и уже он возвращает редирект на короткоживущую ссылку для скачивания.\u003C\u002Fp>\n\u003Ch3>Пример webhook-endpoint на Node.js\u003C\u002Fh3>\n\u003Cp>Следующий endpoint на Express проверяет подпись Fmailer и принимает события входящей почты:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-javascript\">const crypto = require(&quot;crypto&quot;);\nconst express = require(&quot;express&quot;);\n\nconst app = express();\n\nconst webhookSecret = process.env.FMAILER_WEBHOOK_SECRET;\nconst replayToleranceSeconds = 300;\n\napp.post(\n  &quot;\u002Fwebhooks\u002Ffmailer\u002Finbound&quot;,\n  express.raw({ type: &quot;application\u002Fjson&quot; }),\n  async (req, res) =&gt; {\n    const signature = req.get(&quot;X-Webhook-Signature&quot;);\n    const timestamp = req.get(&quot;X-Webhook-Timestamp&quot;);\n\n    if (\n      !signature ||\n      !timestamp ||\n      !\u002F^[a-f0-9]{64}$\u002Fi.test(signature)\n    ) {\n      return res.sendStatus(400);\n    }\n\n    const timestampNumber = Number(timestamp);\n\n    if (\n      !Number.isFinite(timestampNumber) ||\n      Math.abs(Date.now() \u002F 1000 - timestampNumber) &gt;\n        replayToleranceSeconds\n    ) {\n      return res.sendStatus(400);\n    }\n\n    \u002F\u002F Подпись рассчитывается для строки:\n    \u002F\u002F &lt;timestamp&gt;.&lt;точное исходное тело запроса&gt;\n    const signedPayload = Buffer.concat([\n      Buffer.from(`${timestamp}.`, &quot;utf8&quot;),\n      req.body\n    ]);\n\n    const expectedSignature = crypto\n      .createHmac(&quot;sha256&quot;, webhookSecret)\n      .update(signedPayload)\n      .digest();\n\n    const providedSignature = Buffer.from(signature, &quot;hex&quot;);\n\n    if (\n      providedSignature.length !== expectedSignature.length ||\n      !crypto.timingSafeEqual(\n        providedSignature,\n        expectedSignature\n      )\n    ) {\n      return res.sendStatus(400);\n    }\n\n    let event;\n\n    try {\n      event = JSON.parse(req.body.toString(&quot;utf8&quot;));\n    } catch {\n      return res.sendStatus(400);\n    }\n\n    if (event.event !== &quot;inbound.received&quot;) {\n      return res.sendStatus(204);\n    }\n\n    \u002F\u002F Добавляем событие в очередь с защитой от дубликатов.\n    \u002F\u002F event.event_id не изменяется при повторной доставке.\n    await enqueueInboundEmail({\n      idempotencyKey: event.event_id,\n      route: event.route,\n      recipient: event.recipient,\n      sender: event.from?.email,\n      subject: event.subject,\n      text: event.text,\n      html: event.html,\n      attachments: event.attachments,\n      senderAuthenticated:\n        event.auth?.dkim === &quot;pass&quot; &amp;&amp;\n        event.auth?.dkim_aligned === true\n    });\n\n    return res.sendStatus(202);\n  }\n);\n\napp.listen(3000);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Подпись необходимо рассчитывать на основе точных исходных байтов HTTP-запроса.\u003C\u002Fp>\n\u003Cp>Если сначала преобразовать body в объект, а затем снова сериализовать его в JSON, пробелы или форматирование могут измениться. В таком случае проверка подписи завершится ошибкой.\u003C\u002Fp>\n\u003Cp>После успешного приема Fmailer ожидает HTTP-ответ со статусом \u003Ccode>2xx\u003C\u002Fcode>. На ответ отводится 10 секунд.\u003C\u002Fp>\n\u003Cp>Поэтому webhook-handler должен быстро:\u003C\u002Fp>\n\u003Col>\n\u003Cli>проверить подпись;\u003C\u002Fli>\n\u003Cli>проверить тип события;\u003C\u002Fli>\n\u003Cli>добавить задачу в очередь;\u003C\u002Fli>\n\u003Cli>вернуть успешный ответ.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Не стоит выполнять скачивание вложений, AI-анализ или длительную обработку до отправки HTTP-ответа.\u003C\u002Fp>\n\u003Cp>При неуспешной доставке Fmailer повторяет webhook-запрос по возрастающему графику: через 1 минуту, 5 минут, 30 минут, 2 часа, 6 часов и 24 часа. Если все попытки исчерпаны, доставка помечается как неуспешная, а само письмо остается доступным через API и панель.\u003C\u002Fp>\n\u003Ch2>Ограничения приема\u003C\u002Fh2>\n\u003Cp>Технические лимиты по умолчанию:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Параметр\u003C\u002Fth>\n\u003Cth>Значение\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Максимальный размер сообщения\u003C\u002Ftd>\n\u003Ctd>30 МБ\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Вложений в сообщении\u003C\u002Ftd>\n\u003Ctd>до 25\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Размер одного вложения\u003C\u002Ftd>\n\u003Ctd>до 25 МБ\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Сохраняемый объем text и html\u003C\u002Ftd>\n\u003Ctd>до 500 000 символов\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Поток на домен\u003C\u002Ftd>\n\u003Ctd>500 сообщений в час\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Сообщение сверх допустимого размера отклоняется на уровне SMTP. При превышении почасового лимита Fmailer отвечает временной ошибкой \u003Ccode>450\u003C\u002Fcode>, и отправляющий сервер повторит доставку позже.\u003C\u002Fp>\n\u003Cp>Принятые письма и вложения хранятся столько, сколько предусматривает срок хранения логов вашего тарифа, после чего удаляются вместе с файлами.\u003C\u002Fp>\n\u003Ch2>Какие продукты можно построить с помощью входящей почты\u003C\u002Fh2>\n\u003Cp>Получение писем в виде структурированных данных открывает значительно больше возможностей, чем обычная контактная форма.\u003C\u002Fp>\n\u003Ch2>1. Система поддержки email-to-ticket\u003C\u002Fh2>\n\u003Cp>Создайте точный маршрут:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">support@inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Когда клиент отправляет письмо:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Fmailer принимает и разбирает сообщение.\u003C\u002Fli>\n\u003Cli>Ваш webhook получает данные письма.\u003C\u002Fli>\n\u003Cli>Приложение находит клиента по адресу отправителя.\u003C\u002Fli>\n\u003Cli>Создается новый тикет.\u003C\u002Fli>\n\u003Cli>Вложения прикрепляются к обращению.\u003C\u002Fli>\n\u003Cli>Клиенту отправляется автоматическое подтверждение.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Пользователь получает привычный канал связи, а вся работа с обращением остается внутри вашего SaaS.\u003C\u002Fp>\n\u003Ch2>2. Уникальные адреса для ответов на тикеты\u003C\u002Fh2>\n\u003Cp>Назначьте каждому тикету собственный адрес:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">ticket-8942@inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Создайте префиксный маршрут:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">ticket-*\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Webhook может извлечь идентификатор \u003Ccode>8942\u003C\u002Fcode> из адреса получателя и добавить письмо к соответствующему тикету.\u003C\u002Fp>\n\u003Cp>Такой подход надежнее, чем связывание сообщений по теме письма.\u003C\u002Fp>\n\u003Cp>Идентификатор объекта находится непосредственно в адресе доставки.\u003C\u002Fp>\n\u003Cp>Та же схема подходит для адресов:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">thread-&lt;id&gt;@inbound.example.com\nconversation-&lt;id&gt;@inbound.example.com\ncase-&lt;id&gt;@inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>3. Ответы на уведомления по email\u003C\u002Fh2>\n\u003Cp>Предположим, ваша система управления проектами отправляет уведомление:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Мария упомянула вас в проекте Apollo.\nОтветьте на это письмо, чтобы добавить комментарий.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Укажите в качестве адреса для ответа:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">project-41-thread-987@inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Когда пользователь отвечает, webhook определяет проект и обсуждение по адресу получателя.\u003C\u002Fp>\n\u003Cp>Текст письма преобразуется в новый комментарий.\u003C\u002Fp>\n\u003Cp>Перед сохранением приложение может:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>удалить процитированную историю переписки;\u003C\u002Fli>\n\u003Cli>убрать подпись отправителя;\u003C\u002Fli>\n\u003Cli>проверить, состоит ли отправитель в проекте;\u003C\u002Fli>\n\u003Cli>определить автоматический ответ;\u003C\u002Fli>\n\u003Cli>сохранить прикрепленные файлы;\u003C\u002Fli>\n\u003Cli>сохранить оригинальный \u003Ccode>.eml\u003C\u002Fcode> для аудита.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>4. Прием счетов и документов\u003C\u002Fh2>\n\u003Cp>Создайте адрес:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">invoices@inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Клиенты или поставщики смогут отправлять счета непосредственно в вашу систему.\u003C\u002Fp>\n\u003Cp>Приложение может:\u003C\u002Fp>\n\u003Col>\n\u003Cli>проверить наличие вложения;\u003C\u002Fli>\n\u003Cli>скачать файл через API Fmailer;\u003C\u002Fli>\n\u003Cli>проверить файл на вредоносное содержимое;\u003C\u002Fli>\n\u003Cli>распознать реквизиты счета;\u003C\u002Fli>\n\u003Cli>сопоставить отправителя с поставщиком;\u003C\u002Fli>\n\u003Cli>создать процесс согласования;\u003C\u002Fli>\n\u003Cli>сохранить оригинальное письмо для аудита.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>Входящее событие Fmailer содержит информацию о каждом вложении:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>идентификатор;\u003C\u002Fli>\n\u003Cli>имя файла;\u003C\u002Fli>\n\u003Cli>MIME-тип;\u003C\u002Fli>\n\u003Cli>размер;\u003C\u002Fli>\n\u003Cli>признак inline-вложения;\u003C\u002Fli>\n\u003Cli>Content ID;\u003C\u002Fli>\n\u003Cli>API-адрес для скачивания.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>5. Уникальные адреса для каждого клиента\u003C\u002Fh2>\n\u003Cp>Создавайте персональный адрес для каждого tenant или клиента:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">customer-a83f9@inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Такой адрес может стать простым интерфейсом интеграции.\u003C\u002Fp>\n\u003Cp>Вместо полноценной API-интеграции клиент пересылает на него:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>отчеты;\u003C\u002Fli>\n\u003Cli>уведомления;\u003C\u002Fli>\n\u003Cli>чеки;\u003C\u002Fli>\n\u003Cli>документы;\u003C\u002Fli>\n\u003Cli>экспортированные данные;\u003C\u002Fli>\n\u003Cli>системные сообщения.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Ваше приложение определяет владельца сообщения по идентификатору в адресе получателя.\u003C\u002Fp>\n\u003Cp>Сценарий подходит для:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>сервисов управления расходами;\u003C\u002Fli>\n\u003Cli>бухгалтерских платформ;\u003C\u002Fli>\n\u003Cli>compliance-систем;\u003C\u002Fli>\n\u003Cli>логистических приложений;\u003C\u002Fli>\n\u003Cli>сервисов управления недвижимостью;\u003C\u002Fli>\n\u003Cli>рекрутинговых платформ;\u003C\u002Fli>\n\u003Cli>систем обработки документов.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Если идентификаторы клиентов или объектов используются в публичных адресах, лучше применять непрозрачные и непоследовательные значения.\u003C\u002Fp>\n\u003Ch2>6. Сбор лидов в CRM\u003C\u002Fh2>\n\u003Cp>Назначьте отдельный адрес каждому партнеру, кампании или менеджеру:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">partner-acme@inbound.example.com\ncampaign-berlin@inbound.example.com\nrep-42@inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Входящие письма могут автоматически создавать лиды и связывать их с нужным источником привлечения.\u003C\u002Fp>\n\u003Cp>Catch-all маршрут позволяет использовать динамические адреса, а точные маршруты — резервировать важные системные имена.\u003C\u002Fp>\n\u003Ch2>7. Обработка автоматических отчетов\u003C\u002Fh2>\n\u003Cp>Многие устаревшие системы умеют отправлять email, но не поддерживают REST API.\u003C\u002Fp>\n\u003Cp>Вместо разработки отдельной интеграции можно выдать такой системе специальный адрес:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">reports-warehouse-7@inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Legacy-система отправляет периодический отчет по почте.\u003C\u002Fp>\n\u003Cp>Ваш webhook:\u003C\u002Fp>\n\u003Col>\n\u003Cli>получает сообщение;\u003C\u002Fli>\n\u003Cli>скачивает вложение;\u003C\u002Fli>\n\u003Cli>проверяет его формат;\u003C\u002Fli>\n\u003Cli>импортирует данные;\u003C\u002Fli>\n\u003Cli>сообщает о результате обработки.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>В этом случае email становится адаптером между устаревшей системой и современным приложением.\u003C\u002Fp>\n\u003Ch2>8. AI-обработка входящей почты\u003C\u002Fh2>\n\u003Cp>Поскольку сообщения поступают в виде структурированного JSON, выбранные поля можно передавать в систему классификации, извлечения данных или генерации ответов.\u003C\u002Fp>\n\u003Cp>Примеры:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>классификация обращений в поддержку;\u003C\u002Fli>\n\u003Cli>извлечение номера заказа;\u003C\u002Fli>\n\u003Cli>определение намерения клиента;\u003C\u002Fli>\n\u003Cli>создание краткого резюме длинной переписки;\u003C\u002Fli>\n\u003Cli>маршрутизация сообщения в нужный отдел;\u003C\u002Fli>\n\u003Cli>генерация черновика ответа;\u003C\u002Fli>\n\u003Cli>поиск отсутствующих данных в счете;\u003C\u002Fli>\n\u003Cli>извлечение дат, сумм и реквизитов;\u003C\u002Fli>\n\u003Cli>определение срочности обращения.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Сначала сохраните событие или поставьте его в очередь, а ресурсоемкую обработку выполняйте отдельным worker-процессом.\u003C\u002Fp>\n\u003Cp>Содержимое email и вложений необходимо считать недоверенными данными. Они могут содержать:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>вредоносные файлы;\u003C\u002Fli>\n\u003Cli>скрытый HTML;\u003C\u002Fli>\n\u003Cli>tracking-элементы;\u003C\u002Fli>\n\u003Cli>попытки prompt injection;\u003C\u002Fli>\n\u003Cli>вводящие в заблуждение инструкции;\u003C\u002Fli>\n\u003Cli>поддельные данные отправителя.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Безопасность и надежность\u003C\u002Fh2>\n\u003Cp>Перенос SMTP-инфраструктуры во внешний сервис уменьшает операционную нагрузку, но приложение все равно должно безопасно обрабатывать вебхуки.\u003C\u002Fp>\n\u003Ch2>Проверяйте подпись каждого webhook-запроса\u003C\u002Fh2>\n\u003Cp>Не доверяйте запросу только потому, что он поступил на нестандартный URL.\u003C\u002Fp>\n\u003Cp>Проверяйте:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>X-Webhook-Signature\u003C\u002Fcode>;\u003C\u002Fli>\n\u003Cli>\u003Ccode>X-Webhook-Timestamp\u003C\u002Fcode>;\u003C\u002Fli>\n\u003Cli>точное исходное тело запроса;\u003C\u002Fli>\n\u003Cli>допустимое окно времени для защиты от повторного воспроизведения.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Для сравнения ожидаемой и полученной подписи используйте constant-time функцию.\u003C\u002Fp>\n\u003Ch2>Удаляйте дубликаты по \u003Ccode>event_id\u003C\u002Fcode>\u003C\u002Fh2>\n\u003Cp>Доставка входящих событий работает по модели at least once.\u003C\u002Fp>\n\u003Cp>Если endpoint не ответил вовремя или вернул ошибку, одно и то же событие может быть доставлено повторно.\u003C\u002Fp>\n\u003Cp>Используйте \u003Ccode>event_id\u003C\u002Fcode> в качестве ключа идемпотентности: при повторных попытках он не меняется.\u003C\u002Fp>\n\u003Cp>Так повторная доставка не создаст:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>два тикета;\u003C\u002Fli>\n\u003Cli>два комментария;\u003C\u002Fli>\n\u003Cli>два счета;\u003C\u002Fli>\n\u003Cli>два лида;\u003C\u002Fli>\n\u003Cli>две задачи обработки.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Не доверяйте полю From автоматически\u003C\u002Fh2>\n\u003Cp>Видимый заголовок \u003Ccode>From\u003C\u002Fcode> можно подделать.\u003C\u002Fp>\n\u003Cp>Fmailer сообщает:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>результат проверки DKIM;\u003C\u002Fli>\n\u003Cli>соответствует ли домен DKIM-подписи видимому домену отправителя.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Поле \u003Ccode>auth.dkim\u003C\u002Fcode> принимает пять значений:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Значение\u003C\u002Fth>\n\u003Cth>Что означает\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>\u003Ccode>pass\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>подпись проверена\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>fail\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>подпись не прошла проверку\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>none\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>подписи нет — обычное состояние для многих отправителей\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>temperror\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>DNS не ответил, проверить не удалось\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Ccode>permerror\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>подпись или ключ некорректны\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Значения \u003Ccode>temperror\u003C\u002Fcode> и \u003Ccode>permerror\u003C\u002Fcode> намеренно отделены от \u003Ccode>fail\u003C\u002Fcode>: «письмо подделано» и «мы не смогли проверить» — разные факты, и правило вида «дропаем все, кроме \u003Ccode>pass\u003C\u002Fcode>» должно это учитывать.\u003C\u002Fp>\n\u003Cp>Полей \u003Ccode>spf\u003C\u002Fcode> и \u003Ccode>dmarc\u003C\u002Fcode> в событии нет, и это осознанное решение: SPF в этом контуре не вычисляется, а DMARC-вердикт по одной только DKIM-подписи давал бы ложные отказы для писем, прошедших по SPF.\u003C\u002Fp>\n\u003Cp>Для сценариев, где требуется более высокий уровень доверия, отправителя можно считать технически аутентифицированным только при выполнении условий:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-javascript\">event.auth.dkim === &quot;pass&quot; &amp;&amp;\nevent.auth.dkim_aligned === true\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Однако аутентификация не заменяет авторизацию.\u003C\u002Fp>\n\u003Cp>Даже корректно подтвержденный отправитель не должен автоматически получать доступ ко всем проектам, тикетам или аккаунтам.\u003C\u002Fp>\n\u003Cp>Приложение должно отдельно проверить, имеет ли пользователь право выполнять конкретное действие.\u003C\u002Fp>\n\u003Ch2>Используйте фактически принятый адрес получателя\u003C\u002Fh2>\n\u003Cp>Для определения маршрута и объекта используйте поля \u003Ccode>recipient\u003C\u002Fcode> и \u003Ccode>route\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Не следует считать все адреса из видимых заголовков \u003Ccode>To\u003C\u002Fcode> и \u003Ccode>Cc\u003C\u002Fcode> фактически принятыми системой.\u003C\u002Fp>\n\u003Cp>В заголовках могут находиться:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>дополнительные получатели;\u003C\u002Fli>\n\u003Cli>адреса других систем;\u003C\u002Fli>\n\u003Cli>группы рассылки;\u003C\u002Fli>\n\u003Cli>поддельные или нерелевантные значения.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Авторизацию и маршрутизацию необходимо строить на основе адреса, который действительно принял Fmailer.\u003C\u002Fp>\n\u003Ch2>Проверяйте вложения\u003C\u002Fh2>\n\u003Cp>Перед обработкой вложения:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>установите собственное ограничение размера;\u003C\u002Fli>\n\u003Cli>разрешайте только необходимые форматы;\u003C\u002Fli>\n\u003Cli>проверяйте сигнатуру файла, а не только MIME-тип;\u003C\u002Fli>\n\u003Cli>сканируйте файлы на вредоносное содержимое;\u003C\u002Fli>\n\u003Cli>генерируйте новые имена файлов при сохранении;\u003C\u002Fli>\n\u003Cli>не храните файлы в публичной директории;\u003C\u002Fli>\n\u003Cli>не отображайте недоверенный HTML без очистки;\u003C\u002Fli>\n\u003Cli>не запускайте макросы и исполняемые файлы.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Ограничения приложения могут быть строже ограничений почтового сервиса.\u003C\u002Fp>\n\u003Ch2>Защищайтесь от email-циклов\u003C\u002Fh2>\n\u003Cp>Осторожно настраивайте автоматические ответы.\u003C\u002Fp>\n\u003Cp>Не создавайте autoresponder, который отправляет сообщения обратно на тот же входящий маршрут.\u003C\u002Fp>\n\u003Cp>Со своей стороны Fmailer ограничивает цикл по числу транзитных заголовков \u003Ccode>Received\u003C\u002Fcode> и по почасовому лимиту домена, но это защита от разрастания, а не замена корректной логики автоответов.\u003C\u002Fp>\n\u003Cp>Для обнаружения автоматических сообщений, bounce-писем и рассылок можно анализировать заголовки, которые передаются в событии:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Auto-Submitted\nIn-Reply-To\nList-Id\nPrecedence\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Автоответы и списочная почта не отбрасываются сервисом: это ваша почта, и решение принимает ваше приложение.\u003C\u002Fp>\n\u003Ch2>Входящая почта — не обычный почтовый ящик\u003C\u002Fh2>\n\u003Cp>Функция inbound email в Fmailer предназначена для передачи почты программному коду.\u003C\u002Fp>\n\u003Cp>Она не заменяет Gmail, Outlook или общий почтовый ящик отдела поддержки.\u003C\u002Fp>\n\u003Cp>Пользователи не входят в Fmailer, чтобы читать письма через IMAP или POP3.\u003C\u002Fp>\n\u003Cp>Пользовательский интерфейс создает ваше приложение.\u003C\u002Fp>\n\u003Cp>Например:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>helpdesk показывает сообщение в ленте тикета;\u003C\u002Fli>\n\u003Cli>CRM добавляет письмо в историю контакта;\u003C\u002Fli>\n\u003Cli>бухгалтерский сервис отображает письмо рядом со счетом;\u003C\u002Fli>\n\u003Cli>проектная система преобразует письмо в комментарий;\u003C\u002Fli>\n\u003Cli>платформа обработки документов показывает полученный файл в очереди импорта.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Ответные письма можно отправлять отдельно через API, SMTP relay или SDK Fmailer.\u003C\u002Fp>\n\u003Ch2>Почему сервис входящей почты удобнее собственного SMTP-сервера\u003C\u002Fh2>\n\u003Cp>Собственный SMTP-сервер дает полный контроль, но вместе с ним — полную ответственность.\u003C\u002Fp>\n\u003Cp>Необходимо самостоятельно обслуживать:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>доступность SMTP-listener;\u003C\u002Fli>\n\u003Cli>MX-записи;\u003C\u002Fli>\n\u003Cli>reverse DNS;\u003C\u002Fli>\n\u003Cli>TLS-сертификаты;\u003C\u002Fli>\n\u003Cli>настройки протоколов;\u003C\u002Fli>\n\u003Cli>MIME-парсинг;\u003C\u002Fli>\n\u003Cli>большие сообщения;\u003C\u002Fli>\n\u003Cli>проверку адресов;\u003C\u002Fli>\n\u003Cli>очереди доставки;\u003C\u002Fli>\n\u003Cli>временные ошибки;\u003C\u002Fli>\n\u003Cli>повторные попытки;\u003C\u002Fli>\n\u003Cli>защиту от спама и злоупотреблений;\u003C\u002Fli>\n\u003Cli>хранение исходных сообщений;\u003C\u002Fli>\n\u003Cli>хранение вложений;\u003C\u002Fli>\n\u003Cli>обновления безопасности;\u003C\u002Fli>\n\u003Cli>мониторинг;\u003C\u002Fli>\n\u003Cli>реагирование на инциденты.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Для компании, которая специализируется на email-инфраструктуре, такие затраты могут быть оправданы.\u003C\u002Fp>\n\u003Cp>Но если задача SaaS-команды заключается в том, чтобы превратить письмо в тикет, комментарий, счет, лид или загруженный документ, самостоятельная SMTP-инфраструктура обычно становится ненужной сложностью.\u003C\u002Fp>\n\u003Cp>Fmailer оставляет SMTP на внешнем контуре и предоставляет вашему приложению привычный интерфейс: подписанный JSON-вебхук через HTTPS.\u003C\u002Fp>\n\u003Ch2>Часто задаваемые вопросы\u003C\u002Fh2>\n\u003Ch3>Можно ли принимать email, не открывая порт 25?\u003C\u002Fh3>\n\u003Cp>Да.\u003C\u002Fp>\n\u003Cp>Если входящий сервис принимает почту от вашего имени, приложению не требуется открывать порт 25.\u003C\u002Fp>\n\u003Cp>Вы направляете MX-запись принимающего хоста на провайдера, а сообщения получаете через HTTPS-вебхуки.\u003C\u002Fp>\n\u003Cp>SMTP-соединение существует только между сервером отправителя и сервисом входящей почты. До сервера вашего приложения оно не доходит.\u003C\u002Fp>\n\u003Ch3>Можно ли использовать порт 587 вместо порта 25 для входящей почты?\u003C\u002Fh3>\n\u003Cp>Нет, не для стандартной передачи сообщений между почтовыми серверами.\u003C\u002Fp>\n\u003Cp>Порт 587 предназначен для аутентифицированной отправки сообщений клиентами и приложениями.\u003C\u002Fp>\n\u003Cp>Передача почты между MX-серверами выполняется через порт 25.\u003C\u002Fp>\n\u003Ch3>Можно ли использовать порт 465?\u003C\u002Fh3>\n\u003Cp>Порт 465 используется для отправки сообщений через TLS.\u003C\u002Fp>\n\u003Cp>Он не является универсальной заменой порта 25 для публичного MX-сервера.\u003C\u002Fp>\n\u003Ch3>Нужно ли устанавливать Postfix или Exim?\u003C\u002Fh3>\n\u003Cp>Нет.\u003C\u002Fp>\n\u003Cp>Fmailer самостоятельно принимает SMTP-сообщение и разбирает его содержимое.\u003C\u002Fp>\n\u003Cp>Ваше приложение получает HTTPS-запрос со структурированными данными письма.\u003C\u002Fp>\n\u003Ch3>Поддерживаются ли вложения?\u003C\u002Fh3>\n\u003Cp>Да.\u003C\u002Fp>\n\u003Cp>Событие входящей почты содержит метаданные вложений и API-адреса для их скачивания: имя файла, MIME-тип, размер, признак inline и Content ID.\u003C\u002Fp>\n\u003Cp>Также можно получить оригинальный файл сообщения в формате \u003Ccode>.eml\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Ограничения по умолчанию: до 25 вложений, до 25 МБ каждое, размер всего сообщения до 30 МБ.\u003C\u002Fp>\n\u003Ch3>Можно ли создавать динамические email-адреса?\u003C\u002Fh3>\n\u003Cp>Да.\u003C\u002Fp>\n\u003Cp>Например, префиксный маршрут \u003Ccode>ticket-*\u003C\u002Fcode> может принимать адреса:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">ticket-123@inbound.example.com\nticket-456@inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Catch-all маршрут \u003Ccode>*\u003C\u002Fcode> позволяет принимать любой адрес, который не совпал с более точным правилом.\u003C\u002Fp>\n\u003Ch3>Что произойдет, если webhook временно недоступен?\u003C\u002Fh3>\n\u003Cp>Fmailer повторит доставку через 1 минуту, 5 минут, 30 минут, 2 часа, 6 часов и 24 часа.\u003C\u002Fp>\n\u003Cp>Поскольку одно событие может быть доставлено несколько раз, приложение должно удалять дубликаты по \u003Ccode>event_id\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Само письмо при этом сохранено и остается доступным через API и панель.\u003C\u002Fp>\n\u003Ch3>Можно ли принимать почту на основном домене компании?\u003C\u002Fh3>\n\u003Cp>Технически да: принимающим хостом может быть и сам домен. Но если на нем уже работает корпоративная почта, менять MX-записи не нужно и не следует — Fmailer откажет в такой настройке, обнаружив чужую MX-запись на домене.\u003C\u002Fp>\n\u003Cp>Практичный вариант — отдельный поддомен:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">inbound.example.com\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Это позволяет не трогать MX-записи, которые уже обслуживают корпоративные адреса на \u003Ccode>example.com\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>На каких тарифах доступна входящая почта?\u003C\u002Fh3>\n\u003Cp>Входящая почта включена в платные тарифы: тариф должен поддерживать и вебхуки, и входящие маршруты. На бесплатном тарифе функция недоступна.\u003C\u002Fp>\n\u003Ch2>Принимайте email без собственной SMTP-инфраструктуры\u003C\u002Fh2>\n\u003Cp>Заблокированные SMTP-порты не должны останавливать разработку продукта.\u003C\u002Fp>\n\u003Cp>Вместо открытия порта 25 и обслуживания собственного почтового сервера передайте прием входящих сообщений Fmailer.\u003C\u002Fp>\n\u003Cp>Ваше приложение будет получать каждое письмо в виде разобранного и подписанного HTTPS-вебхука, который можно обрабатывать через существующую API-инфраструктуру.\u003C\u002Fp>\n\u003Cp>Архитектура остается простой:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-text\">Настроить MX\n    → создать маршрут\n    → подключить webhook\n    → обработать входящее письмо\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Используйте входящую почту, чтобы:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>создавать тикеты службы поддержки;\u003C\u002Fli>\n\u003Cli>принимать ответы на уведомления;\u003C\u002Fli>\n\u003Cli>загружать счета и документы;\u003C\u002Fli>\n\u003Cli>собирать лиды;\u003C\u002Fli>\n\u003Cli>импортировать автоматические отчеты;\u003C\u002Fli>\n\u003Cli>добавлять комментарии по email;\u003C\u002Fli>\n\u003Cli>выдавать уникальный адрес каждому клиенту;\u003C\u002Fli>\n\u003Cli>создавать адреса для отдельных проектов, тикетов и объектов.\u003C\u002Fli>\n\u003C\u002Ful>","45ca2c31-a6b3-4682-9ac6-18a3518de573","2026-08-07T11:19:55.076495+03:00","2026-08-07T11:29:40.310919+03:00","Как принимать входящие письма, если SMTP-порты заблокированы","Чтобы принимать email в приложении, необязательно открывать SMTP-порты и самостоятельно обслуживать почтовый сервер. Сервис входящей почты может принять письмо, разобрать его содержимое и передать данные вашему приложению через подписанный HTTPS-вебхук.","https:\u002F\u002Fapi.fmailer.ru\u002Fmedia\u002Fblog\u002Frecord_45ca2c31-a6b3-4682-9ac6-18a3518de573\u002FChatGPT_Image_Aug_7_2026_11_16_06_AM.png","2026-08-07T11:19:26+03:00",[49,50],"приём писем","smtp"]