Документация / Bubble

Отправка почты из Bubble через API Connector

Настройки SMTP в Bubble нет. Единственное, что можно поменять в Settings → Domain / email, — ключ SendGrid; без него письма уходят с адреса no-reply на bubbleapps.io. Чтобы отправлять со своего домена через fmailer, вызывайте REST API из плагина API Connector: один POST-запрос, который настраивается один раз и используется как действие в любом workflow.

ℹ
Логин и пароль можно получить на странице токенов домена.

Запрос

Bubble не работает с SMTP, поэтому привычные параметры подключения здесь не понадобятся. API принимает тот же токен домена — его логин и пароль передаются в объекте auth в теле запроса:

POST https://api.fmailer.ru/external/send_email_simple/

Поле sender должно быть на подтверждённом домене и с именем отправителя: Магазин <noreply@mail.example.ru>. Адрес на другом домене сервер отклонит — ваши DKIM и SPF за него не отвечают, и у получателя такое письмо всё равно не прошло бы DMARC. Полный список полей — в описании API.

Установка API Connector

Откройте Plugins → Add plugins, найдите API Connector от Bubble и установите его. В настройках плагина добавьте API — например, Mail — и выберите Authentication: None or self-handled. Учётные данные передаются в теле запроса, Bubble с ними ничего делать не нужно.

Создание вызова

Добавьте в этот API вызов и заполните его:

ПолеЗначение
NameSend email
Use asAction — чтобы вызывать из workflow
Data typeJSON
Метод и адресPOST https://api.fmailer.ru/external/send_email_simple/
ЗаголовокContent-Type: application/json
Body typeJSON

Вставьте тело запроса. Каждое имя в угловых скобках Bubble превратит в параметр и покажет под телом:

Bodyjson
{
  "to": [<to>],
  "subject": <subject>,
  "body": <html>,
  "sender": "Магазин <noreply@mail.example.ru>",
  "auth": {
    "username": "<token_login>",
    "password": "<token_password>"
  }
}
ПараметрPrivateЗначение
token_loginОтмеченЛогин токена вашего домена
token_passwordОтмеченПароль этого токена
toНе отмеченТестовое значение "you@example.ru" — вместе с кавычками
subjectНе отмечен"Проверка из Bubble"
htmlНе отмечен"<p>Работает.</p>"
⚠
to, subject и html заполняются из workflow с оператором :formatted as JSON-safe: он экранирует кавычки и переносы строк и сам заключает значение в кавычки. Поэтому в теле они стоят без кавычек, а тестовые значения пишутся с кавычками. Параметры токена — обычные строки, в теле они в кавычках.

Отметьте Include errors in response and allow workflow actions to continue, если хотите обработать отказ в самом workflow, а не останавливать его.

Инициализация

Нажмите Initialize call. Bubble отправит настоящий запрос — тестовое письмо придёт на указанный адрес — и покажет ответ, поля которого станут доступны в workflow:

json
{
  "ok": true,
  "emails": [
    {
      "ok": true,
      "message_id": "<uuid@mail.example.ru>",
      "uuid": "uuid",
      "recipient": "client@example.ru",
      "kind": "to",
      "replayed": false
    }
  ]
}

Если вместо этого пришла ошибка, Bubble покажет её текст — что он означает, смотрите в таблице ниже.

Отправка из workflow

В любом workflow добавьте действие с именем API и вызова — Mail - Send email — и заполните три поля динамическими выражениями, каждое с :formatted as JSON-safe на конце: например, Current User's email, тема с номером заказа и HTML письма.

Действия API Connector выполняются на сервере Bubble, и приватные параметры его не покидают. Но получателя workflow страницы задать может — поэтому не привязывайте действие к форме, где посетитель вводит любой адрес: так ваш домен станет инструментом для писем незнакомым людям, а жалобы ударят по вашей репутации. Отправляйте текущему пользователю, своей команде или из backend workflow.

Разбор ошибок

ОшибкаПричина и решение
Invalid username or password Неверный логин или пароль токена в приватных параметрах либо токен удалён.
Invalid sender, must end with @mail.example.rusender не на домене токена.
Required format: full name <username@domain.ltd>Добавьте в sender имя перед адресом.
400 с ошибкой разбора JSON Динамическое значение без JSON-safe или лишние кавычки вокруг параметра, который JSON-safe уже заключает в кавычки.
Either `recipient` or `to` is requiredВыражение для получателя вернуло пустое значение.
Параметр не задаётся в workflowОн отмечен как Private. Так должны быть отмечены только параметры токена.
Hourly limit exceededИсчерпан лимит тарифа. Снимается сам — повторите позже.

Частые вопросы

Можно ли в Bubble подключить свой SMTP-сервер?

Нет. В Settings → Domain / email можно указать только ключ SendGrid, а без него Bubble отправляет письма с адреса no-reply на bubbleapps.io. Чтобы писать со своего домена через другого провайдера, нужно вызывать его HTTP API из API Connector — этому и посвящена инструкция.

Можно ли пустить через API встроенное действие Send email?

Нет: это действие всегда отправляет через Bubble или через SendGrid, если указан ключ. Замените его в workflow на действие API Connector из этой инструкции — входные данные те же: получатель, тема и текст письма.

Безопасно ли хранить пароль токена в API Connector?

Да, если параметр отмечен как Private. Такие значения остаются на сервере Bubble и не попадают в браузер посетителя. Параметр без этой отметки можно задать из workflow — поэтому токен никогда не должен быть среди них.

Почему запрос падает, если в письме есть кавычки или переносы строк?

Значение подставилось в JSON как есть. Заканчивайте каждое динамическое выражение оператором :formatted as JSON-safe и не ставьте кавычки вокруг <параметра> в теле — оператор добавит их сам, а двойные кавычки тоже ломают JSON.

Как отправить письмо нескольким получателям?

Замените в теле [<to>] на <to> без скобок и передайте список текстов с :formatted as JSON-safe — Bubble запишет его как JSON-массив. Каждый адрес станет отдельным письмом со своим статусом доставки.

Можно ли отправлять по шаблону, а не собирать HTML в Bubble?

Да. Создайте второй вызов на /external/send_email_tpl/ с полями recipient, tpl (slug шаблона), lang и объектом params. HTML тогда хранится в панели, а не в редакторе Bubble.

Почему пришло письмо, когда я нажал Initialize call?

При инициализации Bubble отправляет настоящий запрос, чтобы прочитать ответ. Указывайте в тестовом значении получателя свой адрес.

Что дальше