Настройки 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.
Откройте Plugins → Add plugins, найдите API Connector от Bubble и установите его. В настройках плагина добавьте API — например, Mail — и выберите Authentication: None or self-handled. Учётные данные передаются в теле запроса, Bubble с ними ничего делать не нужно.
Добавьте в этот API вызов и заполните его:
| Поле | Значение |
|---|---|
| Name | Send email |
| Use as | Action — чтобы вызывать из workflow |
| Data type | JSON |
| Метод и адрес | POST https://api.fmailer.ru/external/send_email_simple/ |
| Заголовок | Content-Type: application/json |
| Body type | JSON |
Вставьте тело запроса. Каждое имя в угловых скобках Bubble превратит в параметр и покажет под телом:
{
"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:
{
"ok": true,
"emails": [
{
"ok": true,
"message_id": "<uuid@mail.example.ru>",
"uuid": "uuid",
"recipient": "client@example.ru",
"kind": "to",
"replayed": false
}
]
}Если вместо этого пришла ошибка, Bubble покажет её текст — что он означает, смотрите в таблице ниже.
В любом 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.ru | sender не на домене токена. |
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 | Исчерпан лимит тарифа. Снимается сам — повторите позже. |
Нет. В Settings → Domain / email можно указать только ключ SendGrid, а без него Bubble отправляет письма с адреса no-reply на bubbleapps.io. Чтобы писать со своего домена через другого провайдера, нужно вызывать его HTTP API из API Connector — этому и посвящена инструкция.
Нет: это действие всегда отправляет через Bubble или через SendGrid, если указан ключ. Замените его в workflow на действие API Connector из этой инструкции — входные данные те же: получатель, тема и текст письма.
Да, если параметр отмечен как Private. Такие значения остаются на сервере Bubble и не попадают в браузер посетителя. Параметр без этой отметки можно задать из workflow — поэтому токен никогда не должен быть среди них.
Значение подставилось в JSON как есть. Заканчивайте каждое динамическое выражение оператором :formatted as JSON-safe и не ставьте кавычки вокруг <параметра> в теле — оператор добавит их сам, а двойные кавычки тоже ломают JSON.
Замените в теле [<to>] на <to> без скобок и передайте список текстов с :formatted as JSON-safe — Bubble запишет его как JSON-массив. Каждый адрес станет отдельным письмом со своим статусом доставки.
Да. Создайте второй вызов на /external/send_email_tpl/ с полями recipient, tpl (slug шаблона), lang и объектом params. HTML тогда хранится в панели, а не в редакторе Bubble.
При инициализации Bubble отправляет настоящий запрос, чтобы прочитать ответ. Указывайте в тестовом значении получателя свой адрес.