Главная Интеграции

Интеграции

Сергей Шаульский
От Сергей Шаульский
2 статьи

Интеграция с Ecvi

Интеграция с системой позволяет отправлять письма из Ecvi.ru через наш сервис Haskimail, что положительно сказывается на их доставляемости в папку "Входящие". Чтобы начать отправку: - Вам потребуется зарегистрироваться на нашем сайте haskimail.ru и настроить аккаунт согласно инструкции. - В личном кабинете нашего сервиса необходимо нажать на конкретный сервер, созданный по умолчанию, далее перейти в конкретный канал и в разделе "Настройки" получить API-ключ, который будет использован в настройках подключения: - Полученный API-ключ необходимо добавить в Ecvi в разделе Администрирование - Разное - Стыковки - Email-рассылки: Создание и управление рассылками Управление почтовыми рассылками производится в подразделе Рассылки раздела Клиенты. Описанные ниже функции недоступны отелям, пользующимся системой на тарифе Light. Перейдите на тариф Optimum или выше, если вы хотите использовать Рассылки. image.png Список рассылок Управление рассылками осуществляется через таблицу. Для создания новой записи нажмите кнопку в правом верхнем углу экрана. Редактирование или удаление доступно по иконкам справа в строке нужной рассылки. В таблице отображаются два основных поля: наименование рассылки и статус «Активна». Статус определяет, будет ли рассылка использоваться для отправки (активна) или будет просто храниться в системе (неактивна). Настройка параметров При создании или редактировании открывается окно «Настройка e-mail рассылки», которое позволяет задать все необходимые параметры image.png На первой закладке Настройка рассылки находятся следующие поля: - Имя рассылки - используется только внутри системы, гости его не увидят. - Тема рассылки - это то, что будет вписано в тему письма, которое получит гость. - Активность - письма рассылаются только для активных рассылок. - Периодичность - определяет, как часто система будет запускать рассылку и отправлять письма. Возможные значения: однократно, день (т.е. каждый день), неделя (каждую неделю), месяц, год. - Дата начала рассылки - дата и время, когда система первый раз запустит рассылку. Будет ли рассылка повторятся и если да - как часто, определяется предыдущей настройкой (периодичность). image.png Вторая закладка - Правила - очень важна, именно она определяет, кому и когда будут отправляться письма. Первое, что необходимо указать - какие условия по датам мы хотим выбрать. Возможны три варианта, при выборе которых будет меняться набор последующих полей, для задания условий. - Динамическая дата. Подразумевает создание условия типа <сколько-то> дней ДО или ПОСЛЕ даты заезда или даты выезда или даты брони (даты создания бронирования в системе) или даты оплаты (даты первого платежа на счете) или дня рождения гостя. Совместно с этим типом правила лучше создавать рассылки с периодичностью «день», т.е. такие, которые запускаются в системе ежедневно. Чтобы никого из гостей не пропустить ведь условие, что до заезда осталось, к примеру, 3 дня, сработает для брони только в определенную дату. - Интервал дат. В этом случае мы сможем задать условие типа дата заезда или дата выезда или дата брони (даты создания бронирования в системе) или дата оплаты (даты первого платежа на счете) или день рождения гостя в интервале c <дата и время> по <дата и время>. Здесь можно использовать и рассылки с периодичностью однократно или год, поскольку, к примеру, поздравлять всех январских именинников мы будем только 1 раз в году (если так решили). Причем в отношении дней рождения надо учесть, что интервал дат подразумевает не дату, когда гость родился, а даты в этом году, когда гость празднует свой день рождения. Если задать периодичность «год», то в следующем году рассылка отработает точно так же. Система в этом случае не смотрит на год, а только на сами даты (дни месяцев). Конечно, помимо дней рождения мы можем использовать этот вариант правила, например, для рассылки спецпредложений всем гостям, которые заезжали к нам прошлым летом и т.п. (здесь год в дате уже будет играть роль). - Без условия по дате. Этот вариант означает, что даты рассылка вообще не должна учитывать. Скажем, мы просто хотим разослать письма всем VIP-гостям или гражданам определенной страны. - Пол. Здесь, пожалуй, всё должно быть понятно. Если требуется поздравить с 8 марта, выберем пол «женский». - Страны. Помимо Для всех стран можно выбрать Для страны или Не для страны. Т.е. можем, например, рассылать письма на русском только для гостей из страны Россия и на английском (в другой рассылке) - для всех стран, которые не Россия. - Сегмент. Если выбрать, то рассылка отработает только по гостям из бронирований, которым в карточке был установлен указанный сегмент (например, «Командировочные»). - VIP. Если установлен - рассылка только для VIP гостей. Иначе - для всех. image.png Во вкладке Шаблон создается само тело письма. Здесь, во-первых, имеется специальная панель кнопок, с помощью которых можно оформить письмо не как простой текст, а как красивую страницу (для этого, возможно, придется освоиться с некоторыми базовыми понятиями HTML, но и без них кое-что можно собрать простое письмо. Во-вторых, в текст письма можно вставлять специальные «переменные», которые в итоговом письме автоматически превратятся в ФИО гостя, его номер комнаты, даты заезда и пр. Эти переменные перечислены на закладке Переменные: image.png Помните, что в шаблон письма эти переменные надо вставлять точно в таком виде, как они приведены в списке, т.е. в двойных фигурных скобках. Проще всего их просто копировать со вкладке Переменные и вставлять в текст, не изменяя. Отписка от рассылки для гостей. Об этом важно помнить, чтобы наша рассылка не расценивалась как спам. Вам не требуется что-то специально добавлять в текст письма: в конце каждого система автоматически добавит стандартное предложение о возможности отписаться, перейдя по ссылке. Щелкнув на которой, гость увидит страницу, что его адрес удален из рассылки. При этом в карточке гостя в разделе Клиенты - Гости будет установлен флажок Без рассылок. При необходимости вы можете как выставить этот флажок вручную, так и снять его. Собственно, на этом про сами рассылки всё.

Обновлено Apr 08, 2026

Руководство по отправке писем через HaskiMail (Django и Flask)

Версия документа: 1.1 Репозиторий: haskimail_rocketmail Содержание 1. О чём это руководство 2. Что входит в репозиторий 3. Что нужно подготовить до начала работы 4. Установка Python-окружения 5. Самый быстрый способ проверить API (скрипт send_haskimail.py) 6. Интеграция с Django 7. Интеграция с Flask 8. Какой способ выбрать 9. Частые ошибки и их решение 10. Полезные ссылки 1. О чём это руководство HaskiMail — сервис отправки транзакционных и массовых писем через HTTP API или SMTP. В репозитории haskimail_rocketmail лежит готовый код для двух сценариев: - Django — кастомный почтовый backend anymail_haskimail, который подключается к стандартному механизму Django (send_mail, формы, задачи Celery и т.д.). - Flask — в репозитории нет отдельного Flask-модуля; письма отправляются прямым HTTP-запросом к API HaskiMail (так же, как в скрипте send_haskimail.py). Официальная документация API: https://haskimail.ru/developer Личный кабинет: https://lk.haskimail.ru 2. Что входит в репозиторий Ниже перечислены файлы, с которыми вы будете работать чаще всего. anymail_haskimail/backend.py Кастомный класс EmailBackend для Django. Принимает письма от django.core.mail и отправляет их в HaskiMail по HTTP. anymail_haskimail/init.py Метаданные пакета (версия). send_haskimail.py Автономный скрипт: одна отправка через официальный endpoint POST https://api.haskimail.ru/email. Не требует Django и Flask. Удобен для первой проверки ключа и адреса отправителя. send_test_email.py Тест Django-backend без полноценного проекта: скрипт сам вызывает django.setup() и отправляет тестовое письмо. requirements.txt Список зависимостей: django, requests и др. 3. Что нужно подготовить до начала работы 3.1. Серверный API-ключ (Server Token) Это не пароль от личного кабинета. Нужен именно токен сервера (Server API key), который привязан к вашему почтовому серверу/каналу в HaskiMail. Где взять: 1. Войдите в https://lk.haskimail.ru 2. Откройте настройки нужного сервера или канала. 3. Скопируйте Server Token / API-ключ сервера. 4. Сохраните его в надёжном месте (переменная окружения, менеджер секретов). Не публикуйте ключ в Git. Важно: для HTTP API используется заголовок X-Haskimail-Server-Token и значение ключа без префикса Bearer. 3.2. Подтверждённый адрес отправителя Перед отправкой писем адрес в поле From (отправитель) должен быть подтверждён в HaskiMail. Где проверить: раздел «Домены и отправители» в личном кабинете — https://lk.haskimail.ru Примеры корректного формата: - support@yourdomain.com - Магазин <support@yourdomain.com> Если домен или отправитель не подтверждён, API может принять запрос, но письмо не будет доставлено или вернётся ошибка. 3.3. Программное окружение - Python 3.10 или новее (рекомендуется 3.11+). - Установленный pip. - Доступ в интернет до api.haskimail.ru. Проверка версии Python: python --version 4. Установка Python-окружения Все команды ниже выполняются из каталога репозитория haskimail_rocketmail (там, где лежат send_haskimail.py и папка anymail_haskimail). Шаг 4.1. Клонирование (если ещё не сделано) git clone https://gitlab.com/dashamail-projects/haskimail_rocketmail.git cd haskimail_rocketmail Шаг 4.2. Виртуальное окружение python -m venv .venv Шаг 4.3. Активация окружения Windows (PowerShell): .venv\Scripts\Activate.ps1 Windows (cmd): .venv\Scripts\activate.bat Linux / macOS: source .venv/bin/activate После активации в начале строки терминала появится префикс (.venv). Шаг 4.4. Установка зависимостей pip install --upgrade pip pip install -r requirements.txt Для работы с Flask дополнительно: pip install flask 5. Самый быстрый способ проверить API (скрипт send_haskimail.py) Рекомендуется выполнить этот шаг до подключения Django или Flask. Так вы убедитесь, что токен и адрес отправителя настроены правильно. 5.1. Что делает скрипт - Отправляет один POST-запрос на https://api.haskimail.ru/email - Передаёт заголовок X-Haskimail-Server-Token - В теле JSON указывает поля From, To, Subject, TextBody и при необходимости HtmlBody 5.2. Запуск на Windows (PowerShell) cd haskimail_rocketmail .venv\Scripts\Activate.ps1 $env:HASKIMAIL_API_KEY = "вставьте_ваш_серверный_токен" python send_haskimail.py --from "Магазин <support@yourdomain.com>" --to recipient@example.com --subject "Тест HaskiMail" --text "Текст письма" С HTML-версией: python send_haskimail.py --from "Магазин <support@yourdomain.com>" --to recipient@example.com --subject "Тест" --text "Текст" --html "<p><strong>HTML</strong></p>" Токен можно передать и аргументом (без переменной окружения): python send_haskimail.py --token "вставьте_токен" --from "support@yourdomain.com" --to recipient@example.com 5.3. Запуск на Linux / macOS cd haskimail_rocketmail source .venv/bin/activate export HASKIMAIL_API_KEY="вставьте_ваш_серверный_токен" python send_haskimail.py \ --from "Магазин <support@yourdomain.com>" \ --to recipient@example.com \ --subject "Тест HaskiMail" \ --text "Текст письма" 5.4. Как понять, что всё прошло успешно В консоли должно появиться: - строка HTTP 200 (или другой код 2xx); - JSON-ответ от API (если сервер его возвращает). При ошибке авторизации часто видно HTTP 401 и сообщение о невалидном серверном ключе — см. раздел 9. 5.5. Параметры командной строки send_haskimail.py - --token — серверный токен (если не задан, берётся из HASKIMAIL_API_KEY) - --api-base — хост API, по умолчанию https://api.haskimail.ru - --from — отправитель (обязательный) - --to — получатель (обязательный) - --subject — тема письма - --text — текстовая часть - --html — HTML-часть (необязательно) 6. Интеграция с Django 6.1. Общая схема 1. Вы подключаете backend в settings.py. 2. Django при вызове send_mail() или message.send() передаёт письмо в anymail_haskimail.backend.EmailBackend. 3. Backend формирует HTTP-запрос к HaskiMail. 6.2. Подключение в существующем Django-проекте Откройте файл settings.py вашего проекта и добавьте: EMAIL_BACKEND = "anymail_haskimail.backend.EmailBackend" ANYMAIL = { "HASKIMAIL_API_KEY": "ваш-серверный-токен", "HASKIMAIL_API_URL": "https://api.haskimail.ru/v1/messages/send", } Рекомендация для продакшена — хранить ключ в переменных окружения: import os EMAIL_BACKEND = "anymail_haskimail.backend.EmailBackend" ANYMAIL = { "HASKIMAIL_API_KEY": os.environ["HASKIMAIL_API_KEY"], "HASKIMAIL_API_URL": os.getenv( "HASKIMAIL_API_URL", "https://api.haskimail.ru/v1/messages/send", ), } В файле .env на сервере (пример): HASKIMAIL_API_KEY=ваш-токен-без-пробелов-и-кавычек HASKIMAIL_API_URL=https://api.haskimail.ru/v1/messages/send 6.3. Как сделать, чтобы Python находил пакет anymail_haskimail Вариант А — скопировать папку anymail_haskimail в корень вашего Django-проекта (рядом с manage.py). Вариант Б — добавить путь к репозиторию в PYTHONPATH перед запуском: Windows: $env:PYTHONPATH = "C:\путь\к\haskimail_rocketmail" Linux / macOS: export PYTHONPATH="/путь/к/haskimail_rocketmail" Вариант В — запускать команды из каталога haskimail_rocketmail, если проект небольшой и лежит там же. 6.4. Пример отправки простого письма from django.core.mail import send_mail send_mail( subject="Тема письма", message="Текст письма", from_email="support@yourdomain.com", recipient_list=["recipient@example.com"], fail_silently=False, ) 6.5. Пример письма с HTML from django.core.mail import EmailMultiAlternatives msg = EmailMultiAlternatives( subject="Заказ оформлен", body="Краткий текст для клиентов без HTML.", from_email="Магазин <support@yourdomain.com>", to=["customer@example.com"], ) msg.attach_alternative("<h1>Спасибо за заказ</h1><p>Детали заказа...</p>", "text/html") msg.send() 6.6. Тест Django-backend без своего проекта (send_test_email.py) Если у вас ещё нет manage.py, можно проверить backend отдельным скриптом: python send_test_email.py ^ --to recipient@example.com ^ --api-key ваш-серверный-токен ^ --from-email "Магазин <support@yourdomain.com>" На Linux / macOS символ переноса ^ замените на \ в конце строки или напишите команду в одну строку. При успехе в консоли: Email request sent successfully. 6.7. Отправка из Django shell Если проект уже настроен: python manage.py shell В интерактивной консоли: from django.core.mail import send_mail send_mail("Тест", "Текст", "support@yourdomain.com", ["recipient@example.com"]) 7. Интеграция с Flask Backend anymail_haskimail не работает с Flask напрямую, потому что завязан на django.conf.settings и django.core.mail. Для Flask используйте тот же HTTP API, что и в send_haskimail.py: библиотека requests, заголовок X-Haskimail-Server-Token, endpoint /email. 7.1. Установка pip install flask requests 7.2. Пример файла app_flask.py Создайте в удобном каталоге файл app_flask.py со следующим содержимым: import os import requests from flask import Flask, jsonify, request app = Flask(__name__) HASKIMAIL_TOKEN = os.environ["HASKIMAIL_API_KEY"] HASKIMAIL_URL = "https://api.haskimail.ru/email" def send_via_haskimail(*, from_addr: str, to: str, subject: str, text: str, html: str = "") -> dict: headers = { "Accept": "application/json", "Content-Type": "application/json", "X-Haskimail-Server-Token": HASKIMAIL_TOKEN.strip(), } body = { "From": from_addr, "To": to, "Subject": subject, "TextBody": text or "(empty)", } if html: body["HtmlBody"] = html resp = requests.post(HASKIMAIL_URL, headers=headers, json=body, timeout=60) resp.raise_for_status() return resp.json() if resp.content else {"status": "ok"} @app.post("/send-test") def send_test(): data = request.get_json(force=True) result = send_via_haskimail( from_addr=data["from"], to=data["to"], subject=data.get("subject", "Test"), text=data.get("text", "Hello from Flask"), html=data.get("html", ""), ) return jsonify(result) if __name__ == "__main__": app.run(debug=True, port=5000) 7.3. Запуск сервера Flask Windows: $env:HASKIMAIL_API_KEY = "ваш-серверный-токен" python app_flask.py Linux / macOS: export HASKIMAIL_API_KEY="ваш-серверный-токен" python app_flask.py Сервер будет доступен по адресу: http://127.0.0.1:5000 7.4. Проверка отправки через curl curl -X POST http://127.0.0.1:5000/send-test ^ -H "Content-Type: application/json" ^ -d "{\"from\":\"Магазин <support@yourdomain.com>\",\"to\":\"recipient@example.com\",\"subject\":\"Тест\",\"text\":\"Привет\"}" На Linux / macOS уберите символ ^ и экранирование кавычек подставьте по правилам вашей оболочки. 7.5. Встраивание в свой код Flask (без HTTP-роута) Функцию send_via_haskimail можно вызывать из любого view или фоновой задачи: send_via_haskimail( from_addr="support@yourdomain.com", to="customer@example.com", subject="Уведомление", text="Текст уведомления", ) 8. Какой способ выбрать send_haskimail.py Используйте для первой проверки ключа, отладки, cron-задач и разовых скриптов. Не требует Django и Flask. Django + anymail_haskimail Используйте, если проект уже на Django: формы, админка, сигналы, Celery с send_mail. send_test_email.py Используйте, чтобы проверить только Django-backend, когда полного проекта ещё нет. Flask + requests Используйте для приложений на Flask; логика совпадает с send_haskimail.py, но встроена в веб-приложение. Разница endpoint’ов: скрипт send_haskimail.py ходит на /email с заголовком X-Haskimail-Server-Token (как официальный PHP-клиент). Django-backend в репозитории настроен на /v1/messages/send. Если при работе с Django получаете 401, сначала убедитесь, что send_haskimail.py с тем же токеном работает; затем сверьте настройки ANYMAIL и документацию API. 9. Частые ошибки и их решение Ошибка: HTTP 401, «Серверный API-ключ в вашем запросе невалидный» Возможные причины: - скопирован не Server Token, а другой ключ; - в .env лишние пробелы, кавычки или перенос строки; - для endpoint /email нужен заголовок X-Haskimail-Server-Token, а не Authorization: Bearer; - токен от другого сервера/канала. Что сделать: 1. Проверьте отправку через send_haskimail.py с тем же токеном. 2. Пересоздайте или скопируйте токен заново из личного кабинета. 3. Убедитесь, что в переменной окружения нет кавычек: HASKIMAIL_API_KEY=abc123, а не HASKIMAIL_API_KEY="abc123". Ошибка: ModuleNotFoundError: No module named 'anymail_haskimail' Что сделать: запускайте Python из каталога haskimail_rocketmail или добавьте этот каталог в PYTHONPATH (см. п. 6.3). Письмо «отправилось», но не пришло получателю Что проверить: - адрес в From подтверждён в HaskiMail; - письмо не попало в спам; - домен отправителя настроен (SPF/DKIM по инструкции HaskiMail). Ошибка при активации venv в Windows Если PowerShell блокирует скрипты, выполните один раз от администратора: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser Либо используйте cmd и activate.bat. Django: письмо не уходит, ошибок нет Проверьте EMAIL_BACKEND в активном settings.py (тот модуль, который реально загружает DJANGO_SETTINGS_MODULE). Включите fail_silently=False в send_mail.

Обновлено Jun 15, 2026