Интеграции для рабочих процессов электронной почты и SDK
Изучите API и интеграции SendRepute для анализа электронной почты, отдельно оплачиваемого ИИ-рерайтинга и инструментов дизайна. Центральные эндпоинты для анализа, рерайтинга и конструктора не отправляют письма; намеренно включенные доставки Campaigns и определенные адаптеры провайдеров могут выполнять отправку через вашего настроенного провайдера. Результаты не гарантируют попадание в «Входящие».
Пакет Node.js доступен в npm. Другие интеграции можно скачать здесь или установить из проверенного публичного репозитория GitHub. Выберите интеграцию, следуйте руководству и проверьте разрешения, текущие цены и настройки при сбоях (failure settings) перед включением.
Сохраняйте привычный процесс работы с почтой. Данные примеры центрального API предназначены только для анализа, переписывания или создания контента; они никогда не отправляют письма. Отдельно, намеренно активированная доставка Кампаний и определенные адаптеры провайдеров могут выполнять отправку через вашего настроенного провайдера. Выбирайте инструмент с учетом его установки, конфигурации, примеров и операционных ограничений. Примеры не запускаются на этой странице; изучайте платные операции и действия по отправке отдельно.
Плагин WordPress
0.2.0
Требуется WordPress 5.7+, PHP 7.4+ и OpenSSL. Загрузите ZIP-архив через Плагины > Добавить новый > Загрузить плагин, затем откройте Настройки > SendRepute. Настройте токен и согласие на платный анализ для каждого сайта отдельно. Подтвержденный жизненный цикл охватывает WordPress 6.8.3 с WooCommerce 10.4.3; отдельное подтверждение для SMTP-плагинов охватывает WordPress 7.1.2 с WP Mail SMTP 4.9.0 и FluentSMTP 2.4.0.
Проверяет сообщения через pre_wp_mail, не заменяя SMTP и не перезаписывая сообщения. Режим Advisory разрешает доставку; режим Blocking применяет порог вероятности. Политика API failure настраивается отдельно. Плагины, работающие в обход wp_mail, не поддерживаются; последующие изменения транспорта не анализируются. Блокировка не ставит сообщения в очередь.
Анализ отключен по умолчанию. Настройте ограниченный клиентский токен, выполните бесплатную проверку соединения, ознакомьтесь с ценами и дайте явное согласие перед включением платного анализа. Ручные действия ИИ требуют отдельного подтверждения.
Скачать ZIP для WordPress
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Запустите эти команды из директории WordPress с доступным WP-CLI или загрузите скачанный ZIP-архив через Плагины > Добавить новый > Загрузить плагин и активируйте его. Откройте Настройки > SendRepute. Настройте и активируйте каждый сайт отдельно в режиме мультисайта. Используйте поддерживаемую комбинацию WordPress/PHP; минимальная версия не является рекомендацией для запуска устаревшего ПО (end-of-life).
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Безопасная настройка
Создайте клиентский токен на стороне сервера с областями доступа (scopes) classify, account:read и catalog:read, сроком действия и лимитами расходов. Введите его в настройках или загрузите SENDREPUTE_API_TOKEN из вашего хранилища секретов сервера, как показано на примере. Хранимые токены используют аутентифицированное шифрование с солями WordPress и OpenSSL; введите их повторно после ротации солей. Выполните бесплатную проверку соединения, изучите цены на классификацию, затем явно включите автоматический анализ. Установите режим (консультативный или блокирующий), порог (threshold) и независимую политику fail-open/fail-closed.
// wp-config.php — optional server-secret alternative to settings storage.
$sendreputeToken = getenv('SENDREPUTE_API_TOKEN');
if (is_string($sendreputeToken) && $sendreputeToken !== '') {
define('SENDREPUTE_API_TOKEN', $sendreputeToken);
}
3. Осознанное использование
Функция ниже использует обычную функцию wp_mail и отправляет данные только тогда, когда ваше приложение вызывает её. При включенном платном анализе плагин выполняет проверку на этапе pre_wp_mail, а затем разрешает или блокирует существующий транспорт. Укажите собственного авторизованного получателя; сначала протестируйте на локальном почтовом стоке (sink) без ретрансляции. Ложный результат означает, что вызывающая сторона должна обработать отклоненную отправку — она не ставится в очередь.
// Call deliberately: this sends through your existing WordPress transport.
function sendrepute_reviewed_message($recipient) {
return wp_mail(
$recipient,
'Your requested account summary',
'Here is the account summary you requested.'
);
}
Что еще он умеет?
Настройки также предоставляют ручные действия по AI-переписыванию и генерации шаблонов с отдельным подтверждением оплаты. Для отображения цен требуется vip:read; для переписывания — rewrite; для генерации — ai:generate, а для VIP-генерации требуется активное членство VIP. Результаты представляют собой экранированный текст только для копирования: они никогда не применяются и не отправляются автоматически. Существующие токены не получают новые области доступа автоматически.
Результаты, отказы и лимиты
Режим advisory разрешает доставку; блокировка сравнивает конечную вероятность спама с вашим порогом. Тайм-ауты API и сбои следуют отдельной политике отказов, а не метке спама. Непрозрачные локальные блокировки подавляют повторный анализ на 24 часа; неизвестные сетевые результаты не повторяются автоматически. Сами отправки не дедуплицируются. Установленные проверки обновлений охватывали отслеживаемое обновление ZIP с 0.1.0 до 0.2.0, отклонение/сохранение административного nonce и выбранный путь WooCommerce. Отдельная матрица из 40 сценариев охватывала оба порядка загрузки плагинов с WP Mail SMTP и FluentSMTP, включая To/Cc/Bcc, Reply-To, заголовки, вложения, отказ SMTP и результаты политик. Эти точные кортежи не сертифицируют другие версии CMS, плагинов SMTP или провайдеров. Хуки, обходящие wp_mail, и последующие изменения транспорта остаются вне зоны покрытия. Деактивация сохраняет настройки; удаление стирает учетные данные, даже если сохраняются отключенные настройки. Токен wp-config удалите самостоятельно.
Адаптер электронной почты WooCommerce
0.2.0
Входит в тот же ZIP-архив SendRepute 0.2.0, что и плагин WordPress; отдельного дополнения или загрузки для WooCommerce не существует. Требуется соответствие базовым требованиям плагина: WordPress 5.7+, PHP 7.4+ и OpenSSL. Адаптер прошел проверку исходного кода на соответствие WooCommerce 10.4.3, но не сертифицирован для всех версий WooCommerce или расширений почты.
Анализ WooCommerce имеет собственный переключатель администратора и точный выбор встроенных типов писем, которые по умолчанию отключены. Глобальные элементы управления анализом и paid-consent также должны быть включены. Невыбранные типы и типы, определенные расширениями, обходят анализ. Каждый выбранный встроенный тип customer_* защищен и носит только рекомендательный характер (advisory): он может быть проанализирован, но никогда не блокируется. Выбранные многокомпонентные письма не проходят классификацию перед любым платным запросом; режимы advisory или fail-open сохраняют доставку, в то время как fail-closed блокирует только незащищенную почту.
Скачать общий ZIP-архив WordPress и WooCommerce
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Это тот же устанавливаемый ZIP-архив, который используется в руководстве по WordPress. Установите его один раз; не устанавливайте второе дополнение WooCommerce. Активируйте SendRepute, затем откройте Settings > SendRepute. Поддерживайте WordPress, WooCommerce, PHP и реальный почтовый транспорт в актуальном и рабочем состоянии.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Безопасная настройка
Используйте ограниченный токен клиента из секретов сервера или зашифрованных настроек WordPress. Сначала настройте общую бесплатную проверку соединения, просмотр текущих цен, глобальное платное согласие, режим риска, порог и политику отказов. Затем отдельно включите анализ WooCommerce и выберите только те встроенные типы писем, которые вы проверили. Типы, определенные расширениями, никогда не выбираются автоматически.
// wp-config.php — keep the shared WordPress/WooCommerce token server-side.
$sendreputeToken = getenv('SENDREPUTE_API_TOKEN');
if (is_string($sendreputeToken) && $sendreputeToken !== '') {
define('SENDREPUTE_API_TOKEN', $sendreputeToken);
}
3. Осознанное использование
Продолжайте отправку через WooCommerce в обычном режиме. Адаптер оборачивает обратный вызов, уже выбранный WooCommerce, и сохраняет его исходные аргументы и транспорт; он не предоставляет новый метод send. Если другой фильтр изменяет аргументы обратного вызова, обычная почта вложена во время этого вызова или пользовательский обратный вызов никогда не вызывает wp_mail, анализ консервативно обходится, а не попадает в общий платный путь. Протестируйте выбранные некритичные типы с почтовым приемником без ретрансляции.
Результаты, отказы и лимиты
Выбранные односоставные письма следуют общим правилам WordPress advisory, порогам и политикам отказов, за исключением того, что каждый тип customer_* защищен и работает только в режиме advisory. Защищенная почта клиентов (customer_*) всегда уходит после результата высокого риска, сбоя API или неподдерживаемого контента. WooCommerce формирует многосоставные (multipart) альтернативы после pre_wp_mail, поэтому выбранные многосоставные письма отклоняются до любого платного запроса вместо частичной классификации; только выбранная незащищенная почта может быть отклонена при fail-closed. Контекст колбэка удаляется после успеха, неудачи или вложенных отправок.
Почтовый бэкенд Drupal
0.1.0
Требуется Drupal 10.3+ или 11.x и PHP 8.1+. Установите ZIP как модуль, предоставьте право administer sendrepute только доверенным администраторам, настройте ограниченное отображаемое имя отправителя (не адрес) и выберите точные маршруты модуля/ключа почты. Версия 0.1.0 поддерживает только php_mail ядра Drupal; это почтовый бэкенд, а не провайдер или заменяющий транспорт. Подтверждение работы на сайтах охватывает точные релизы Drupal 10.6.17 и 11.4.7 с PHP 8.4.10.
Согласие на платный анализ и каждый маршрут по умолчанию отключены. Для каждого точного маршрута используется фиксированный делегат core php_mail, рекомендательный или блокирующий режим, независимая политика отказов preserve или block, threshold и осознанный выбор критической почты. Почта аккаунта и безопасности остается доставляемой, если только для этого точного маршрута явно не разрешена блокировка критических сообщений. Тот же экземпляр php_mail выполняет формат и отправляет одно скалярное итоговое тело; многокомпонентный вывод и вложения не поддерживаются.
Скачать ZIP для Drupal
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Запустите из корня проекта Drupal или загрузите ZIP через установщик модулей Drupal. Архив содержит корень модуля sendrepute, подходящий для modules/contrib. Включите его, предоставьте право administer sendrepute только доверенным администраторам и откройте Configuration > System > SendRepute.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-drupal.zip
unzip sendrepute-drupal.zip -d modules/contrib
drush en sendrepute -y
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-drupal.git
cd sendrepute-drupal
2. Безопасная настройка
Храните SENDREPUTE_API_TOKEN с областью действия classify только в среде процесса web/PHP. Он никогда не принимается формой и не экспортируется в конфигурацию Drupal. В форме введите обязательное отображаемое имя отправителя длиной не более 320 байт без адреса, угловых скобок или управляющих символов. Добавьте по одной строке из семи полей на каждый точный маршрут, как показано; делегатом должен быть php_mail. Выберите режим advisory/block, политику отказов preserve/block, threshold и критический статус yes/no. Начните с параметров advisory, preserve и no.
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
# Enter a non-address sender display name in Configuration > System > SendRepute.
# One exact route in Configuration > System > SendRepute:
# contact|page_mail|php_mail|advisory|preserve|0.90|no
3. Осознанное использование
Продолжайте вызывать обычный менеджер почты Drupal. Для выбранного маршрута sendrepute_mail вызывает format() базового php_mail, анализирует это итоговое скалярное тело, применяет политику, а затем вызывает mail() того же кэшированного экземпляра php_mail. Другие ID делегатов отклоняются. Он не использует hook_mail_alter и не перезаписывает сообщение.
Результаты, отказы и лимиты
Подтвержденный успех блокирует отправку только при достижении или превышении настроенного порога в режиме блокировки. Полный вложенный результат классификации и биллинговый ответ проверяются до того, как spamProbability сможет повлиять на доставку. Сбои API, аутентификации, баланса, лимитов, а также ошибки формата, multipart, индикатора вложений и размера следуют независимой политике отказов маршрута, за исключением защищенной критической почты, которая продолжает отправляться. Установленная матрица 10.6.17/11.4.7 охватывала установку и замену ZIP «на лету» во включенном состоянии, реальный вход администратора, отклонение/сохранение Form API CSRF, обнаружение плагинов, выбор маршрута, синтетическую классификацию, сохранение критической почты и ядро php_mail через локальный сток. Базовые проверки исходного кода также охватывают неизменяемые архивы 10.3.0 и 11.0.0; ни один результат не сертифицирует каждый последующий патч или сторонний почтовый модуль. Отправляются настроенное отображаемое имя, непустая тема и ограниченное по длине тело; адреса, получатели, заголовки, параметры и вложения исключены. Тема ограничена 998 байтами, а тело — 256 KiB. Выполняется одна попытка через проверенный HTTPS, без редиректов, повторов или очереди.
Почтовый модуль PrestaShop
0.1.1
Версия 0.1.1 поддерживает только PrestaShop 9.0.0, 9.0.1, 9.0.2 и 9.0.3 с PHP 8.1–8.4. Загрузите ZIP в Модули > Module Manager, затем настройте классификацию почты SendRepute. Все четыре официальные сборки classic прошли изолированную установку, настройку аутентифицированным администратором и проверки обновления из ZIP; их неизмененные реализации Mail::send() также прошли офлайн-матрицу реальной почты. PrestaShop 8, 9.1+ и более поздние неуказанные патчи 9.0 не поддерживаются.
Модуль, paid/content consent и точный выбор шаблона по умолчанию отключены. Анализируется окончательно отрисованная тема письма и каждое поддерживаемое отображаемое тело сообщения без пересборки сообщения Symfony. Сообщение, содержащее одновременно text/plain и text/html, отправляется в одном ограниченном запросе на классификацию: текстовая альтернатива делается инертной, исходный HTML сохраняется, а сервис анализирует каждую типизированную альтернативу независимо без объединения. Результат использует наивысший риск с полным content audits, генерирует одну платную классификацию и никогда не возвращает частичную оценку безопасности. Advisory никогда не прерывает отправку. Пороговая блокировка и fail-closed вызывают одно исключение, реализующее как ExceptionInterface от Symfony Mailer, так и ModuleErrorInterface от PrestaShop; на каждом поддерживаемом релизе установленный тест подтвердил, что Mail::send() возвращает false без доставки по SMTP. Политика отказов не зависит от порога риска.
Скачать ZIP для PrestaShop
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Загрузите ZIP-архив 0.1.1, затем перейдите в Modules > Module Manager > Upload a module и выберите его. Откройте Configure для классификации почты SendRepute. Не форсируйте установку вне рамок точных версий PrestaShop 9.0.0–9.0.3: поведение отмены и подписи зависит от проверенных путей Mail::send().
curl -fLO https://www.sendrepute.com/downloads/sendrepute-prestashop.zip
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-prestashop.git
cd sendrepute-prestashop
2. Безопасная настройка
Установите SENDREPUTE_API_BASE в канонический HTTPS-ориджин SendRepute, предоставленный для этого модуля, а SENDREPUTE_API_TOKEN — в ограниченный токен сервера в окружении PHP-FPM/сервера. База должна быть публичным DNS HTTPS-ориджином без путей; литералы, учетные данные, редиректы и частные ответы DNS отклоняются. Выполните бесплатную проверку аккаунта/цен, затем явно включите модуль, платное согласие и точные названия шаблонов. Выберите режим advisory/block, порог и политику отказов open/closed независимо.
export SENDREPUTE_API_BASE="replace-with-the-canonical-sendrepute-https-origin"
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
3. Осознанное использование
Продолжайте использовать обычный поток Mail::send в PrestaShop. Ранний хук запоминает только выбранный точный шаблон. Финальный хук считывает уже отрисованную тему Symfony Email, текстовое тело и HTML-тело без изменения получателей, заголовков, вложений или транспорта. Для двойных тел он отправляет инертный обычный текст и исходный HTML как типизированные альтернативы в одном запросе; независимая нормализация сервиса предотвращает поглощение одного фрагмента другим, сохраняя видимые цели ссылок и изображений HTML для аудита. Одиночное текстовое тело остается на узком пути инертного текста, а одиночное HTML-тело — на узком пути извлечения DOM. Классификация завершается до того, как PrestaShop создаст отдельное сообщение с подписью DKIM. Матрица поддерживаемых релизов подтвердила структуру multipart, а также хэш тела DKIM и подпись RSA после классификации. Закрепленный путь подписи PrestaShop исключает Bcc из подготовленных подписанных заголовков и теряет этого скрытого SMTP-получателя; наличие валидной подписи не гарантирует совместимость с доставкой Bcc. Не комбинируйте DKIM и Bcc на этом поддерживаемом пути. Неподдерживаемые источники отображения, активная семантика, двусмысленный HTML в кодировках quoted-printable или base64, а также превышающий лимит совокупный контент обрабатываются согласно настроенной политике сбоев до оплаты. Оставляйте критические шаблоны невыбранными, если они не одобрены намеренно.
Результаты, отказы и лимиты
Классификатор принимает одно тело text/plain, одно тело text/html или оба как независимо анализируемые отображаемые альтернативы. Литеральный текст, сущности, скрытый контент и стили в принятой альтернативе не могут поглотить или скрыть последующую альтернативу; двусмысленный HTML в кодировках quoted-printable или base64 отклоняется до оплаты. Любая принятая альтернатива может определить результат с наивысшим риском, в то время как аудиты контента охватывают каждую альтернативу; плата за классификацию взимается один раз только после принятия полного ограниченного ввода. Обязательное унаследованное тело точно дублирует инертную текстовую альтернативу для двойного сообщения, и этот дубликат вместе с обеими типизированными альтернативами разделяют общий бюджет запроса в 524288 байт. Получатели, вложения и встроенные ресурсы исключаются, а исходное сообщение транспорта до подписания сохраняется. Тестовое окружение real-mail отдельно проверяет целостность MIME/подписи и фактических получателей SMTP: подписи DKIM остаются валидными после классификации, но проверенный вышестоящий путь подписи не сохраняет получателей Bcc. Валидированная классификация сохраняет ограниченную последнюю консультативную сводку. Режим блокировки вызывает исключение только на уровне или выше порога; исключение двойного интерфейса выживает после диспетчеризации хука и возвращает false перед транспортом во всех четырех установленных релизах. Неподдерживаемый контент, ошибки API и валидации обрабатываются открыто/закрыто независимо. Одна попытка HTTPS использует закрепленный публичный DNS, проверенный TLS, конечные тайм-ауты, ограничение ответа в 256 KiB, отсутствие перенаправлений и повторов. Блокировка опирается на проверенный перехват исключений PrestaShop Mail::send(), а не на возвращаемое значение финального хука.
Адаптер для Symfony Mailer
0.1.1
Требует PHP 8.1+ и предназначен только для Symfony Mailer 6.4 или 7.4; проверенные версии — 6.4.46 и 7.4.19. Совместимость с Symfony 8.1 или нетестируемыми ветками не заявлена. Установите ZIP-архив с исходным кодом через репозиторий Composer path; этот пакет не опубликован в Packagist.
Пакет и согласие на платный анализ отключены по умолчанию, и только сообщение с точно настроенным заголовком согласия допускается к обработке. Политика рекомендательного или блокирующего скоринга не зависит от политики обработки ошибок allow или block. Классификация выполняется на официальном событии MessageEvent перед отправкой; для отклонения используется MessageEvent::reject(). События клонирования в очереди пропускаются, поэтому событие транспорта воркера является единственной точкой платной классификации.
Скачать ZIP-архив с исходным кодом Symfony
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Распакуйте загруженный ZIP-архив в постоянную директорию packages, зарегистрируйте эту директорию как репозиторий путей Composer, подключите пакет версии 0.1.1 и зарегистрируйте SendRepute\Symfony\SendReputeBundle, если Flex не сделал этого автоматически. Исходный архив является локальным и неопубликованным.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-symfony.zip -o packages/sendrepute-symfony.zip
unzip packages/sendrepute-symfony.zip -d packages
composer config repositories.sendrepute path ./packages/sendrepute-symfony
composer require sendrepute/symfony:0.1.1
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-symfony.git
cd sendrepute-symfony
2. Безопасная настройка
Получите значение SENDREPUTE_API_TOKEN из секретов сервера. Оставьте параметры enabled и paid_analysis_consent в состоянии false на время ознакомления с текущими ценами. Режим, порог и политика сбоев независимы. Конечная точка зафиксирована на верифицированном HTTPS с ограниченным временем ожидания, без перенаправлений или повторных попыток, а также с лимитом ответа в 1 MiB.
send_repute:
enabled: false
paid_analysis_consent: false
api_token: '%env(SENDREPUTE_API_TOKEN)%'
mode: advisory
failure_policy: allow
spam_probability_threshold: 0.8
3. Осознанное использование
Добавляйте точный заголовок согласия только к проверенным некритичным объектам Email, затем продолжайте работу через обычный Mailer. Сообщение, конверт, транспорт и заголовок не перезаписываются. Для доставки через Messenger настройте SendReputeBundle в воркерах: события клонирования продюсера намеренно не классифицируются.
$email->getHeaders()->addTextHeader('X-SendRepute-Classify', 'yes');
$mailer->send($email);
Результаты, отказы и лимиты
Поддерживается ровно одно текстовое или HTML-тело в памяти. Смешанные альтернативы, текстовые DataParts, потоки или пути, фигурные скобки CSS, разметка, синтаксис quoted-printable, заголовки base64 или тело целиком в Content-Transfer-Encoding: base64 вызывают ошибку до оплаты и следуют failure_policy; обычный контент без фигурных скобок не изменяется. Каждое обязательное вложенное поле ответа и необязательная ветка contentAudit проверяются, а неизвестные свойства отклоняются. Advisory никогда не блокирует по оценке; блокировка отклоняет сообщение на уровне spam_probability_threshold через реальное событие транспорта.
Адаптер Rails Action Mailer
0.1.0
Требуется Ruby 3.2+; функциональность точечно проверена на реальных Action Mailer 7.1.6 и Mail 2.9.1; работа пути обратного вызова также наблюдалась на Action Mailer 7.2.3.2. Данное утверждение не является сертификацией каждого допустимого релиза Rails 7.x. Установите локальный ZIP с исходным кодом через Bundler; публикация в RubyGems не заявлена.
Оба глобальных платных шлюза по умолчанию отключены, и каждое действие mailer должно явно вызывать sendrepute_paid_preflight!. Поведение при рекомендательной/блокирующей оценке и поведение при сохранении/блокировке в случае ошибки независимы. Маршруты для сброса пароля, MFA, входа, верификации, биллинга и безопасности должны оставаться невыбранными. Любое сообщение из нескольких частей (multipart) и неоднозначный CSS, содержимое, похожее на quoted-printable или base64, отклоняются до оплаты; одно принятое декодированное текстовое или HTML-тело анализируется без изменения исходного сообщения или транспорта.
Скачать ZIP-архив с исходным кодом Rails
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Распакуйте ZIP точно в папку vendor/sendrepute-rails, добавьте запись с локальным путем в Gemfile, запустите Bundler в вашей контролируемой среде и включите SendRepute::Rails::Mailer в ApplicationMailer. Это не установка через RubyGems.
# Download sendrepute-rails.zip, then extract it into vendor/sendrepute-rails.
gem "sendrepute-rails", path: "vendor/sendrepute-rails"
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-rails.git
cd sendrepute-rails
2. Безопасная настройка
Оставьте значения enabled и paid_consent как false до завершения проверки текущих цен и маршрутов. Читайте токен из Rails credentials или другого серверного секрета. Настройте advisory/block, preserve/block и threshold независимо; обратные вызовы on_result и on_error не должны логировать содержимое сообщений, данные авторизации или полные ответы.
SendRepute::Rails.configure do |config|
config.enabled = false
config.paid_consent = false
config.token = Rails.application.credentials.dig(:sendrepute, :api_token)
config.mode = :advisory
config.failure_policy = :preserve
config.score_threshold = 0.8
end
3. Осознанное использование
Вызывайте sendrepute_paid_preflight! только внутри каждой намеренно выбранной некритичной функции mailer. Обычные действия обходят классификацию. Платный хук использует маршрут before_deliver в Action Mailer 7.1.6; глобальное автоматическое включение (auto-opt-in) не предусмотрено, и адаптер не перезаписывает Mail::Message.
class ApplicationMailer < ActionMailer::Base
include SendRepute::Rails::Mailer
end
def newsletter
sendrepute_paid_preflight!
mail(to: params[:to], subject: "News")
end
Результаты, отказы и лимиты
Поддерживается одно декодированное тело сообщения text/plain или text/html для отображения. Любые входные данные multipart или неоднозначные данные нормализатора отклоняются до оплаты и обрабатываются согласно политике сбоев. Полный типизированный вложенный ответ может блокировать доставку только в режиме block при достижении или превышении threshold; режим advisory сохраняет каждую оценку. Колбэки результата и ошибок получают неизменяемые безопасные данные; исключения в колбэках или throw(:abort) перехватываются локально, чтобы они не могли прервать режим advisory или гарантировать доставку. Фиксированная конечная точка отклоняет перенаправления и повторные попытки, используя ограниченный общий дедлайн. Тесты на реальном Action Mailer 7.1.6 пройдены: 19 прогонов и 59 утверждений; платные запросы или реальная доставка не выполнялись.
Адаптер Spring JavaMailSender
0.1.1
Требуется Java 17+; ориентировано на Spring Framework 6.2.x JavaMailSender. Точная проверка зависимостей проводилась с использованием Spring Framework 6.2.19. Утверждения о поддержке Spring Boot 4 или расширенной совместимости с версиями фреймворка отсутствуют. Соберите локальный исходный код из ZIP-архива с помощью Maven; он не опубликован в Maven Central или других реестрах.
Декоратор, согласие на платный анализ, консультативный режим и настройки allow-on-failure задаются явно. Только sendWithSendRepute(...) выполняет платный анализ перед отправкой; любая стандартная перегрузка send(...) обходит классификацию и передает данные без изменений. Используйте обычный send для критически важных писем, если конкретная отправка не выбрана намеренно. Поддерживаемые отображаемые альтернативы MIME объединяются в инертные структуры; неподдерживаемый, вложенный, подписанный, зашифрованный или двусмысленный контент вызывает ошибку до этапа оплаты.
Скачать исходный код Spring Java в ZIP
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Распакуйте ZIP-архив с исходным кодом 0.1.1, выполните mvn verify и установите его только в свой контролируемый локальный репозиторий Maven. Потребляющее приложение предоставляет существующий JavaMailSender и реализацию почты во время выполнения. Для точной проверки зависимостей использовались байт-код Java 17+, Spring Framework 6.2.19 и версии, указанные в прилагаемом файле README.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-spring-mail.zip
unzip sendrepute-spring-mail.zip
cd sendrepute-spring-mail-0.1.1
mvn verify
mvn install
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-java.git
cd sendrepute-java
2. Безопасная настройка
Сконструируйте SendReputeConfiguration на основе серверного токена и явных переключателей. Оставляйте параметры enabled и paidAnalysisConsent в значении false до тех пор, пока не будут изучены цены и выбранные вызовы. Режимы advisory/blocking, порог и политика сбоев allow/block являются независимыми. Конечная точка привязана к проверенному HTTPS без перенаправлений и повторных попыток.
var settings = new SendReputeConfiguration(
token, false, false,
SendReputeConfiguration.Mode.ADVISORY,
SendReputeConfiguration.FailurePolicy.ALLOW,
0.80, Duration.ofSeconds(3), Duration.ofSeconds(10));
var reviewedSender = new SendReputeJavaMailSender(existingSender, settings);
3. Осознанное использование
Вызывайте sendWithSendRepute(...) только для отдельного SimpleMailMessage, MimeMessage или MimeMessagePreparator, который должен пройти анализ. Поддерживаются перегрузки для одиночных аргументов и varargs. Каждая обычная перегрузка send(...) обходит классификацию. Preparators выполняют отрисовку один раз, и исходный подготовленный MIME делегируется после того, как политика разрешит выполнение.
// Paid classification is possible only on this explicit method.
reviewedSender.sendWithSendRepute(reviewedMessage);
// Every ordinary JavaMailSender send overload bypasses classification.
reviewedSender.send(criticalMessage);
Результаты, отказы и лимиты
Анализируются все поддерживаемые отображаемые части plain и HTML; получатели и вложения исключены. Обход ограничен 16 уровнями, 256 частями и 524,288 отображаемыми байтами UTF-8. Игнорируемые встроенные бинарные данные никогда не материализуются; неизвестные или неограниченные ленивые отображаемые источники отклоняются до открытия потока или выполнения платного запроса, а чтение поддерживаемых источников ограничено. Обрамление числовыми сущностями сохраняет фрагменты инертными через проверенный порядок нормализатора сервера. Все пакеты varargs подготавливаются и нормализуются до первого платного запроса; инспекция не генерирует заголовки Jakarta Mail. Требуется рекурсивно точный вложенный ответ.
Адаптер почты для Magento Open Source
0.1.1
Поддерживает только Magento Open Source 2.4.7-p5 и 2.4.7-p6 с точно проверенными неизменяемыми исходниками интерфейса почты. Офлайн-тестирование типизированных фикстур пройдено, однако полная установка Magento не выполнялась; другие релизы Magento или Adobe Commerce не сертифицированы. Установите локальный ZIP через репозиторий путей Composer; это не пакет Adobe Marketplace.
Модуль, согласие на платный анализ и списки маршрутов по умолчанию выключены. Каждый идентификатор шаблона требует двух независимых точных подтверждений; критичность никогда не определяется по его имени. Плагин aroundSendMessage выполняет анализ на конечной границе транспорта без пересборки сообщения. Политика порогов рекомендаций/блокировки и политика поведения при сбоях (preserve/block) независимы; блокировка вызывает видимое Magento MailException. Наличие нескольких отображаемых MIME-частей или неоднозначный контент приводят к ошибке до момента оплаты.
Скачать исходный ZIP-архив для Magento
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Распакуйте ZIP в постоянный каталог пакетов, зарегистрируйте корень SendRepute_MailAdapter как репозиторий путей Composer, запросите версию 0.1.1, затем используйте стандартный процесс включения модулей и обновления базы данных Magento. Не представляйте этот локальный архив как пакет Adobe Marketplace.
mkdir -p packages/sendrepute-magento
curl -fLO https://www.sendrepute.com/downloads/sendrepute-magento.zip
unzip sendrepute-magento.zip -d packages/sendrepute-magento
composer config repositories.sendrepute path ./packages/sendrepute-magento/SendRepute_MailAdapter
composer require sendrepute/magento-mail-adapter:0.1.1
bin/magento module:enable SendRepute_MailAdapter
bin/magento setup:upgrade
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-magento.git
cd sendrepute-magento
2. Безопасная настройка
Установите SENDREPUTE_API_TOKEN только в серверном окружении PHP-FPM и CLI. В меню Stores > Configuration > Services > SendRepute изначально оставьте модуль и согласие на платный анализ выключенными. Добавьте каждый точный идентификатор шаблона в оба независимых списка разрешенных маршрутов; имена, включая числовые, никогда не определяют критичность. Настройте поведение рекомендации/блокировки, порог и поведение сохранения/блокировки при сбоях отдельно.
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
# Then configure Stores > Configuration > Services > SendRepute.
3. Осознанное использование
Продолжайте использовать стандартный поток шаблонов и транспорта Magento. Корреляция маршрутов записывает точный идентификатор и магазин, выбранный через TransportBuilder, в то время как финальный плагин aroundSendMessage считывает официальные типизированные интерфейсы email и MIME перед вызовом того же транспорта. Состояние билдера очищается в блоке finally, а корреляции билдера и сообщения используют записи WeakMap с ключами-объектами, чтобы брошенный построенный транспорт не мог оставить пригодную для повторного использования авторизацию по числовому ID объекта. Адаптер не предоставляет новый метод send и не мутирует сообщение.
Результаты, отказы и лимиты
Принимается только одна поддерживаемая отображаемая часть MIME; вложения сохраняются, но исключаются из анализа. Несколько отображаемых частей, неподдерживаемые кодировки передачи или наборы символов, потоки, вложенные MIME и неоднозначный текст нормализатора приводят к ошибке до оплаты. Один проверенный запрос HTTPS имеет ограниченные сроки выполнения и размер ответа без повторов или перенаправлений. Допустимый вложенный результат может блокироваться при достижении порога; настроенное поведение fail-block вызывает Magento MailException.
Адаптер .NET MailKit
0.1.0
Требуется .NET 8 и точное подтверждение зависимостей для MailKit/MimeKit 4.18.0. Является явной оболочкой для IMailTransport, принадлежащего приложению, а не глобальным перехватчиком, SMTP-клиентом или заменой транспорта. Соберите или сошлитесь на локальный исходный ZIP-архив; публикация в NuGet не заявляется.
Адаптер и согласие на платный анализ по умолчанию выключены; консультативный режим и сохранение отправки являются независимыми параметрами по умолчанию. Вызовы AnalyzeAsync, AnalyzeThenSend или AnalyzeThenSendAsync выполняются явно. Для критически важных сообщений безопасности или учетных записей требуется отдельная категория и согласие для каждого вызова. Каждая поддерживаемая отображаемая текстовая или HTML-альтернатива инертно объединяется в один ограниченный запрос; неподдерживаемый, вложенный, подписанный или зашифрованный контент вызывает ошибку до этапа оплаты. Оригинальный MimeMessage и токен отмены передаются в существующий транспорт только после разрешения политики.
Скачать исходный код .NET MailKit в ZIP-архиве
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Распакуйте исходный ZIP-архив и сошлитесь на src/SendRepute.MailKit/SendRepute.MailKit.csproj из использующего его проекта .NET 8. Restore получает MailKit/MimeKit 4.18.0. Этот пакет исходного кода является локальным и неопубликованным; это не установка через NuGet.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-mailkit.zip
unzip sendrepute-mailkit.zip
dotnet add reference ./sendrepute-mailkit-0.1.0/src/SendRepute.MailKit/SendRepute.MailKit.csproj
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-dotnet.git
cd sendrepute-dotnet
2. Безопасная настройка
Оберните существующий IMailTransport приложения в SendReputeMailAdapter. Считайте API токен из конфигурации сервера и оставьте параметры Enabled и PaidAnalysisConsent в значении false до завершения проверки. Порог рекомендации/блокировки и настройки сохранения/блокировки при сбоях независимы. Конечная точка, минимальная версия TLS, поведение при одной попытке, дедлайны и лимиты в 1 MiB фиксированы.
var options = new SendReputeOptions {
Enabled = false,
PaidAnalysisConsent = false,
ApiToken = configuration["SENDREPUTE_API_KEY"]!,
Enforcement = EnforcementPolicy.Advisory,
OnFailure = FailurePolicy.PreserveSend,
SpamProbabilityThreshold = 0.80
};
var adapter = new SendReputeMailAdapter(existingTransport, new SendReputeClient(options), options);
3. Осознанное использование
Используйте AnalyzeAsync только для анализа или AnalyzeThenSend и AnalyzeThenSendAsync для явного управления поведением перед отправкой. Обычные или глобальные пути почты не перехватываются. Передавайте paidConsent и категорию сообщения в каждой выбранной операции; для критически важной почты безопасности/аккаунта требуется отдельная настройка критического согласия.
await adapter.AnalyzeThenSendAsync(message, new AnalysisConsent {
PaidAnalysisConsent = true,
Category = MessageCategory.Ordinary
}, cancellationToken);
Результаты, отказы и лимиты
Фактическое декодирование MimeKit собирает все поддерживаемые отображаемые текстовые (plain) и HTML-альтернативы в инертное обрамление, исключая получателей и вложения. Внешнее обрамление без base64 и сущности с поздним декодированием нейтрализуют фигурные скобки CSS, quoted-printable текст, заголовки base64, base64 всего тела и разметку перед нормализацией сервисом. Неподдерживаемый, вложенный, подписанный или зашифрованный отображаемый контент отклоняется до оплаты. Каждое обязательное поле ответа типизировано; необязательный flaggedTermCount должен быть неотрицательным целым числом, а необязательный contentAudit полностью и рекурсивно проверяется на соответствие публичному контракту. Точный оригинальный MimeMessage и токен отмены достигают предоставленного транспорта только тогда, когда независимые политики оценки и сбоев это разрешают.
Ручной анализ черновика в Zapier
0.2.0
Ручной рецепт Zapier для отображения платного анализа ровно трех строк черновика, выбранных владельцем. Это не приложение SendRepute для Zapier, не листинг в маркетплейсе, не артефакт импорта, не пре-сенд адаптер, не отправитель, не маршрут разрешения/блокировки и не классификатор сообщений целиком. Zapier Webhooks использует управляемый владельцем ограниченный HTTPS-прокси, так как токен SENDREPUTE_API_TOKEN не должен попадать в Zap.
Две константы времени компиляции имеют значение по умолчанию false до HTTP. Zap сопоставляет только отображаемое имя отправителя, тему и тело сообщения, отправляет JSON в приложенный дизайн прокси владельца, полностью валидирует вложенный ответ, а затем отображает консультативные и биллинговые поля на этапе частного просмотра. Он не должен добавлять отправителя, принудительное выполнение Paths, Autoreplay или маршрут сохранения при сбое; неудачные шаги Code или Webhook приводят к остановке.
Скачать ZIP-архив с рецептами для Zapier и Make
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Загрузите и извлеките общий исходный код рецепта 0.2.0. Прочтите прилагаемое руководство Zapier и разверните включенный локальный прокси-сервер Node loopback только за обратным прокси-сервером HTTPS, управляемым владельцем. Данный пакет не выполняет его развертывание. Приложения SendRepute для Zapier или импортируемого артефакта Zap не существует.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cd sendrepute-automation-recipes
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Безопасная настройка
Держите Zap выключенным. В исходном коде preflight ENABLED и PAID_CONSENT остаются false до тех пор, пока использование в платном режиме не будет проверено. Прокси владельца хранит SENDREPUTE_API_TOKEN; Zap получает только один отдельно отзываемый ключ из SENDREPUTE_PROXY_CREDENTIALS. Редакторы и история задач могут раскрыть его, поэтому ограничивайте, ротируйте и отзывайте его. Настройте лимиты корзины токенов и параллелизма для каждого ключа, глобальные ограничения соединений/параллелизма, постоянный установленный владельцем ежедневный бюджет платных вызовов, ограничительные лимиты расходов на стороне апстрима и соответствующие средства контроля размера/скорости/дедлайна на TLS-терминаторе. Не включайте Autoreplay.
// In zapier/preflight.js; review charges before changing either literal.
const ENABLED = false;
const PAID_CONSENT = false;
3. Осознанное использование
Создавайте шаги вручную: черновик триггера; Code для preflight с сопоставлением только sender, subject и body; Webhooks POST с JSON-строками к прокси владельца; Code для валидации ответа; отображение для приватной проверки. Никогда не интерполируйте необработанный JSON вручную. Выводите только requestId, model, label, spamProbability и биллинг; не добавляйте почтовое действие или ветвление Paths.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Результаты, отказы и лимиты
Рецепт анализирует только три сопоставленные строки; несопоставленные MIME, HTML-альтернативы, вложения и конечный исходящий контент остаются неанализированными. Консервативный preflight отклоняет известные триггеры нормализатора, но не гарантирует покрытие всего сообщения. Лимиты скорости, параллелизма и ежедневного бюджета прокси отклоняют запрос перед отправкой апстриму, а резервирование бюджета сохраняется перед платной попыткой; запускайте один процесс прокси на один файл бюджета. Прокси выполняет одну ограниченную попытку по фиксированному протоколу HTTPS. Любой ответ, отличный от 200 или неполный точный ответ, вызывает исключение и остановку; функции сохранения, Resume или замены результата отсутствуют.
Создать ручной анализ черновиков в Make
0.2.0
Инструкции для сценария Make по ручному отображению платного анализа ровно трех выбранных строк черновика. Это не является шаблоном (blueprint), одобренным приложением SendRepute, отправителем почты, маршрутом принудительного исполнения или утверждением в отношении несопоставленных MIME, HTML, вложений или конечного исходящего контента. Токен доступа (bearer token) должен находиться только в безопасном хранилище ключей Make HTTP.
Сохраненные логические значения enabled и paidConsent по умолчанию имеют значение false, а фильтр AND останавливает выполнение до вызова HTTP. JSON создается модулем JSON в Make и отправляется один раз модулем HTTP с отключенными перенаправлениями и повторными попытками. Фильтр ответа является лишь защитой отображения, а не полной валидацией или разрешением на отправку. При сбоях HTTP используется Break, никогда не используются Resume или подстановка выходных данных.
Скачать ZIP-архив с рецептами Zapier и Make
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Загрузите и распакуйте общий исходный код рецепта 0.2.0, затем следуйте прилагаемому руководству Make для ручной сборки текущих нативных модулей. Наличие blueprint, приложений в маркетплейсе или форматов импорта не гарантируется. Оставьте планирование сценариев выключенным при тестировании на mock-эндпоинте.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cat sendrepute-automation-recipes/make/README.md
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Безопасная настройка
Создайте постоянные логические переменные Tools: enabled=false и paidConsent=false, а затем фильтр AND, требующий, чтобы обе имели значение true. Используйте JSON > Create JSON строго для полей sender, subject и body. Храните токен SendRepute только в защищенном хранилище ключей приложения HTTP; экспортируемые сценарии не должны содержать учетных данных.
Tools variables: enabled = false; paidConsent = false
Filter: enabled = true AND paidConsent = true
HTTP credential: secure keychain; Authorization header
Body type: Raw; Content type: application/json; map serialized JSON
Follow redirect: No; Timeout: 10 seconds; no retry
Response filter: Minimal display guard
3. Осознанное использование
Настройте один запрос HTTP POST на фиксированный URL-адрес classify. Выберите тип Body Raw и управление content-type application/json, не добавляя конфликтующий текстовый заголовок, затем сопоставьте сериализованный вывод через JSON > Create JSON. Включите обработку ответа (parsed response), отключите перенаправления, установите 10-секундный таймаут и не добавляйте повторитель или автоматический повтор. Требуется лимит ответа модуля в 1 MiB; если он недоступен, используйте вместо него ограниченный прокси-сервер, контролируемый владельцем. Добавьте только приватное отображение проверки после Minimal display guard — никогда не добавляйте отправителя или роутер разрешения/блокировки.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Результаты, отказы и лимиты
Анализируются только сопоставленные строки; нормализация не означает идентичность с оригиналом или исходящим письмом. Фильтр ответа проверяет только статус и наличие основного результата/биллинга и специально не является полной проверкой схемы или принудительным исполнением. Ошибки HTTP используют Break, чтобы последующие действия не выполнялись; никогда не используйте Resume, сфабрикованные выходные данные или маршрут с сохранением при сбоях.
Node.js SDK
0.1.1
SDK только для серверной части на Node.js 18.17+. Установите @sendrepute/node из npm или используйте загружаемый tarball. Дополнительный адаптер Nodemailer сохраняет ваш существующий транспорт. Установите ограниченный ключ API и явный базовый URL-адрес API в серверной среде, никогда не используйте его в коде браузера.
Зарегистрируйте createSendReputePlugin на этапе stream только после ознакомления с ценами и намеренного включения согласия на платный анализ. Консультативный режим сообщает о результатах без блокировки доставки. Блокирующий режим применяет spamProbabilityThreshold; параметр onApiFailure определяет выбор между allow или block, в то время как отказ из-за изменения цены всегда блокирует доставку. Классификация является платной операцией API.
Скачать tarball для Node.js
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
Просмотреть проверенный npm-пакет
1. Установка
Верифицированным пакетом npm является @sendrepute/node версии 0.1.1; закрепите установку из реестра на @sendrepute/node@0.1.1. Архив с сайта и закрепленный публичный репозиторий предоставляют исходный код и сборку версии 0.1.1. Nodemailer является необязательным и требуется только для адаптера транспорта. SDK поддерживает типизированные запросы клиентского API для аккаунта, каталога, классификации, AI и билдеров. Используйте его на сервере Node.js, никогда — в браузерном бандле.
npm install @sendrepute/node nodemailer
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
npm install @sendrepute/node@0.1.1
npm install nodemailer
2. Безопасная настройка
Внедрите SENDREPUTE_API_KEY из вашего хранилища секретов сервера и установите явный базовый URL ниже для размещенного клиентского API. Не вставляйте секреты в команды, исходные файлы или логи. Предоставляйте только те области доступа, которые требуются для ваших операций. В данной конфигурации используется локальный транспорт рендеринга, а не SMTP; параметр maxRetries здесь установлен в ноль, чтобы платные попытки были осознанными.
export SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
Настройка Nodemailer
Этот пример настраивает локальный транспорт рендеринга и не вызывает sendMail. Отправка через настроенный плагин выполняет платный анализ. Замените локальный транспорт на ваш существующий SMTP-транспорт только тогда, когда будете готовы.
import nodemailer from "nodemailer";
import { SendReputeClient } from "@sendrepute/node";
import { createSendReputePlugin } from "@sendrepute/node/nodemailer";
const apiKey = process.env.SENDREPUTE_API_KEY;
const baseUrl = process.env.SENDREPUTE_API_BASE_URL;
if (!apiKey || !baseUrl) {
throw new Error("SENDREPUTE_API_KEY and SENDREPUTE_API_BASE_URL are required");
}
const client = new SendReputeClient({ apiKey, baseUrl, maxRetries: 0 });
const transporter = nodemailer.createTransport({
streamTransport: true,
buffer: true,
newline: "unix",
});
transporter.use("stream", createSendReputePlugin({
client,
policy: {
paidAnalysisConsent: true,
mode: "blocking",
spamProbabilityThreshold: 0.85,
onApiFailure: "block",
},
}));
3. Осознанное использование
Используйте клиент из приведенной выше настройки. Ознакомьтесь с данными аккаунта и текущими ценами перед отображением действия согласия. Вызывайте classifyAfterConsent только из аутентифицированного серверного действия после подтверждения; метод возвращает типизированный ответ о классификации и биллинге. Отправка через настроенный плагин Nodemailer также является платным действием классификации. Адаптер требует paidAnalysisConsent: true и отклоняет любое другое значение до регистрации; задавайте его только после авторизации.
// Uses client from the setup above; nothing calls this function automatically.
async function classifyAfterConsent({ sender, subject, body, confirmed }) {
if (confirmed !== true) throw new Error("Paid consent required");
return client.request("classifyCustomerEmail", { body: { sender, subject, body } });
}
async function readAccountAndPricing() {
return Promise.all([
client.request("customerGetAccount", {}),
client.request("customerGetPricingSettings", {}),
]);
}
Стандартные и нативные VIP-конструкторы
Бесплатный стандартный конструктор импортирует, проверяет, компилирует и экспортирует MJML в форматах HTML, MJML или ZIP-архива с обоими форматами. Отдельный нативный VIP-конструктор использует собственный формат документов, а не MJML: операции импорта, проверки, компиляции и экспорта требуют активного членства и подтвержденного права доступа, а его ZIP-архив содержит три варианта HTML CSS. Опциональная генерация с помощью ИИ оплачивается отдельно и создает редактируемый стандартный MJML или нативный VIP-дизайн; отображайте актуальную действующую цену и передавайте подтвержденный параметр expectedPriceMillicents, никогда не используйте жестко закодированную цену. Ответы ZIP содержат archiveBase64, а не поле html: decodeExportBytes возвращает байты для сохранения вашим приложением. Эти конечные точки обработки не загружают ресурсы, не сохраняют дизайны и не отправляют почту.
import { decodeExportBytes } from "@sendrepute/node";
async function exportStandardZip(mjml) {
const exported = await client.request("customerStandardBuilderExport", {
body: { mjml, format: "zip", filename: "newsletter.zip" },
});
return decodeExportBytes(exported);
}
async function generateNativeAfterConsent(prompt, expectedPriceMillicents, confirmed) {
if (confirmed !== true) throw new Error("Paid consent required");
return client.request("customerCreateVipEmailTemplate", {
body: { prompt, expectedPriceMillicents },
});
}
Что еще он умеет?
Сгенерированные идентификаторы операций охватывают чтение аккаунта и цен, классификацию и ручное редактирование, AI-переписывание/генерацию шаблонов, VIP-планы/статус/покупки, нативные шаблоны/права доступа, а также стандартный/нативный импорт/экспорт без сохранения состояния. Обратитесь к примерам исходного кода и справочнику клиентского API для каждого типа запроса, требуемой области доступа и текущей цены. Чтение каталога не означает покупку доступа. Новые платные возможности требуют токенов с явно заданными областями доступа и явного подтверждения в интерфейсе.
Результаты, отказы и лимиты
SendReputeError предоставляет status, code и requestId; сохраняйте только эти безопасные операционные метаданные. Никогда не логгируйте тела запросов, промпты, заголовки или полные ответы. AbortSignal отменяет работу; timeoutMs применяется к каждой попытке. Ограниченные повторные попытки учитывают специфику операции, а защита квитанций ограничена по времени, что не является гарантией «точно один раз» для биллинга. Режим Advisory Nodemailer формирует отчеты без блокировки; блокировка использует spamProbabilityThreshold и onApiFailure независимо. Сохраняйте и тестируйте ваш реальный транспорт отдельно.
import { SendReputeError } from "@sendrepute/node";
async function readAccountSafely() {
try {
return await client.request("customerGetAccount", {});
} catch (error) {
if (error instanceof SendReputeError) {
console.error({
status: error.status, code: error.code, requestId: error.requestId,
});
}
throw error;
}
}
Справочник API и методов
SendReputeClient требует apiKey и baseUrl; необязательный параметр timeoutMs по умолчанию равен 30000 (максимум 300000), maxRetries по умолчанию 2 (диапазон 0–10), а fetch принимает совместимую серверную реализацию. request(operationId, input, { signal }) возвращает типизированный ответ операции; input содержит тело, путь и/или поля запроса. Неверная конфигурация вызывает TypeError; ошибки API используют SendReputeError с полями status, code, requestId и retryAfterMs. decodeExportBytes преобразует ZIP-экспорт в Uint8Array и отклоняет входные данные, не являющиеся ZIP или валидным base64. Типы OperationInput, OperationResponse и сгенерированные типы схем экспортируются для вызывающих сторон на TypeScript.
Альтернатива: обертка низкоуровневого транспорта Nodemailer
createSendReputeTransport(existingTransport, options) оборачивает существующий объект транспорта методами send, а также необязательными close и verify; это не является транспортером sendMail. Выберите либо этот вариант, либо createSendReputePlugin, но не оба сразу, чтобы избежать двойного анализа. Оба принимают client и policy, а также необязательные model, строку/резолвер sender, signal и onDiagnostic. Колбэки Diagnostic не могут изменить доставку. Коды SendReputeNodemailerError позволяют различать недопустимую политику/сообщение, неподдерживаемый контент, блокировки по спаму и блокировки из-за сбоев API. Опубликованный пакет npm 0.1.1 и загрузка с сайта 0.1.1 объединяют все отображаемые в памяти альтернативы text/plain и text/html в один ограниченный запрос на классификацию; в блокирующем режиме они отклоняют неподдерживаемые отображаемые альтернативы. Необработанные сообщения, потоки, пути и URL по-прежнему не поддерживаются.
import { createSendReputeTransport } from "@sendrepute/node/nodemailer";
function wrapExistingTransport(existingTransport) {
return createSendReputeTransport(existingTransport, {
client,
policy: {
paidAnalysisConsent: true,
mode: "advisory",
spamProbabilityThreshold: 0.85,
onApiFailure: "block",
},
onDiagnostic(diagnostic) {
console.info(diagnostic.kind, diagnostic.action);
},
});
}
Все 49 операции API клиента
Разверните операцию, чтобы увидеть точный тип входных данных SDK, тип возвращаемого значения, область действия (scope) и документированные статусы HTTP. Ссылка на схему открывает полные параметры, поля ответов и примеры в справочнике API клиента. Эти оболочки используют настроенный выше клиент; требуется подтверждение, ничего не выполняется автоматически. Операции чтения не санкционируют покупки. Мутации, платежи, закрытие доступа и платный ИИ требуют соответствующего преднамеренного действия в аккаунте.
Получить котировку на один анализ агрегированной аналитики кампании
POST /v1/campaign-insights/quote
Необходимая область действия (scope): ai:generate
Входные данные: { body: CustomerCampaignInsightsQuoteInput; }
Возвращает: CustomerCampaignInsightsQuote
Документированные статусы HTTP: 200, 400, 401, 403, 429, 503
Параметры, схемы и примеры HTTP
// The configured server-side client needs ai:generate scope.
// A quote is free; it does not authorize or start paid analysis.
const quote = await client.request("customerQuoteCampaignInsights", { body: {} });
// quote.priceMillicents: 10000 (USD 0.10) regular, 5000 (USD 0.05) active VIP.
// The quoted rate can change; obtain fresh consent before analysis.
Анализировать агрегированные метрики доставки кампании с помощью AI
POST /v1/campaign-insights/analyze
Необходимая область действия (scope): ai:generate
Входные данные: { body: CustomerCampaignInsightsAnalyzeInput; }
Возвращает: CustomerCampaignInsightsAnalysis
Документированные статусы HTTP: 200, 400, 401, 402, 403, 409, 413, 429, 502, 503
Параметры, схемы и примеры HTTP
import { randomUUID } from "node:crypto";
import type { CustomerCampaignInsightsMetrics } from "@sendrepute/node";
async function analyzeReviewedAggregate(
metrics: CustomerCampaignInsightsMetrics,
paidConsent: boolean,
) {
if (paidConsent !== true) throw new Error("Explicit price consent required");
// Aggregate counts/rates only: never include campaign IDs, contacts,
// message bodies or individual events. Requires ai:generate scope.
const quote = await client.request("customerQuoteCampaignInsights", { body: {} });
const body = {
analysisId: randomUUID(), // Persist this opaque ID and exact body for safe replay.
expectedPriceMillicents: quote.priceMillicents,
consent: true as const,
metrics,
};
// USD 0.10 regular or USD 0.05 active VIP; no automatic retry on a paid request.
// 409 PRICE_CHANGED requires a new quote and fresh consent, not blind retry.
// Aggregate input and result expire after 30 days.
return client.request("customerAnalyzeCampaignInsights", { body });
}
Список моделей классификатора API клиента
GET /v1/models
Необходимая область действия (scope): models:read
Входные данные: Record<string, never>
Возвращает: CustomerApiModelsResponse
Документированные статусы HTTP: 200, 401, 403, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function getCustomerApiModels(
input: OperationInput<"getCustomerApiModels">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"getCustomerApiModels">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("getCustomerApiModels", input, { signal });
}
Получить использование API и лимиты клиента
GET /v1/usage
Необходимая область действия (scope): usage:read
Входные данные: Record<string, never>
Возвращает: CustomerApiUsageResponse
Документированные статусы HTTP: 200, 401, 403, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function getCustomerApiUsage(
input: OperationInput<"getCustomerApiUsage">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"getCustomerApiUsage">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("getCustomerApiUsage", input, { signal });
}
Классифицировать одно письмо клиента
POST /v1/classify
Необходимая область действия (scope): classify
Входные данные: { body: CustomerClassificationInput; }
Возвращает: CustomerClassificationResponse
Документированные статусы HTTP: 200, 400, 401, 402, 403, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function classifyCustomerEmail(
input: OperationInput<"classifyCustomerEmail">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"classifyCustomerEmail">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("classifyCustomerEmail", input, { signal });
}
Получить информацию о текущем аккаунте и балансе
GET /v1/account
Необходимая область действия (scope): account:read
Входные данные: Record<string, never>
Возвращает: Account
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAccount(
input: OperationInput<"customerGetAccount">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAccount">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAccount", input, { signal });
}
Получить реферальную ссылку текущего аккаунта и активность по вознаграждениям
GET /v1/account/referrals
Необходимая область действия (scope): account:read
Входные данные: { query?: { page?: number; pageSize?: number; }; }
Возвращает: ReferralDashboard
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAccountReferrals(
input: OperationInput<"customerGetAccountReferrals">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAccountReferrals">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAccountReferrals", input, { signal });
}
Список кредитной книги текущего аккаунта
GET /v1/account/ledger
Необходимая область действия (scope): billing:read
Входные данные: { query?: { kind?: "usage" | "payments"; limit?: number; offset?: number; }; }
Возвращает: Array<CreditLedgerEntry>
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetCreditLedger(
input: OperationInput<"customerGetCreditLedger">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetCreditLedger">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetCreditLedger", input, { signal });
}
Список Bitcoin-инвойсов текущего аккаунта
GET /v1/payments/invoices
Необходимая область действия (scope): billing:read
Входные данные: { query?: { limit?: number; offset?: number; }; }
Возвращает: Array<BitcoinInvoice>
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListPaymentInvoices(
input: OperationInput<"customerListPaymentInvoices">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListPaymentInvoices">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListPaymentInvoices", input, { signal });
}
Создать инвойс на пополнение в Bitcoin, номинированный в USD
POST /v1/payments/invoices
Необходимая область действия (scope): billing:write
Входные данные: { body: InvoiceInput; }
Возвращает: BitcoinInvoice
Документированные статусы HTTP: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreatePaymentInvoice(
input: OperationInput<"customerCreatePaymentInvoice">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreatePaymentInvoice">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreatePaymentInvoice", input, { signal });
}
Скрыть неоплаченный Bitcoin-инвойс
DELETE /v1/payments/invoices/{invoiceId}
Необходимая область действия (scope): billing:write
Входные данные: { path: { invoiceId: string; }; }
Возвращает: undefined
Документированные статусы HTTP: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerDeletePaymentInvoice(
input: OperationInput<"customerDeletePaymentInvoice">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerDeletePaymentInvoice">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerDeletePaymentInvoice", input, { signal });
}
GET /payments/methods
GET /v1/payments/methods
Необходимая область действия (scope): billing:read
Входные данные: Record<string, never>
Возвращает: Array<PaymentMethod>
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListPaymentMethods(
input: OperationInput<"customerListPaymentMethods">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListPaymentMethods">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListPaymentMethods", input, { signal });
}
Получить текущее активное предложение по бонусу на депозит Bitcoin
GET /v1/payments/deposit-offer
Необходимая область действия (scope): billing:read
Входные данные: Record<string, never>
Возвращает: DepositBonusOffer | null
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetActiveDepositOffer(
input: OperationInput<"customerGetActiveDepositOffer">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetActiveDepositOffer">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetActiveDepositOffer", input, { signal });
}
Обновить подтверждения для инвойсов текущего аккаунта
POST /v1/payments/refresh
Необходимая область действия (scope): billing:write
Входные данные: Record<string, never>
Возвращает: Array<BitcoinInvoice>
Документированные статусы HTTP: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerRefreshMyPayments(
input: OperationInput<"customerRefreshMyPayments">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerRefreshMyPayments">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerRefreshMyPayments", input, { signal });
}
Получить текущие публичные цены на анализ и редактирование
GET /v1/pricing
Необходимая область действия (scope): catalog:read
Входные данные: Record<string, never>
Возвращает: PricingSettings
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetPricingSettings(
input: OperationInput<"customerGetPricingSettings">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetPricingSettings">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetPricingSettings", input, { signal });
}
Получить текущее публичное предложение по VIP-планам и сравнение цен
GET /v1/vip/plans
Необходимая область действия (scope): catalog:read
Входные данные: Record<string, never>
Возвращает: VipPlanQuote
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipPlans(
input: OperationInput<"customerGetVipPlans">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipPlans">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipPlans", input, { signal });
}
GET /vip
GET /v1/vip
Необходимая область действия (scope): vip:read
Входные данные: Record<string, never>
Возвращает: VipState
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVip(
input: OperationInput<"customerGetVip">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVip">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVip", input, { signal });
}
POST /vip/purchase
POST /v1/vip/purchase
Необходимая область действия (scope): vip:purchase
Входные данные: { body: CustomerVipPurchaseInput; }
Возвращает: VipPurchaseResult
Документированные статусы HTTP: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerPurchaseVip(
input: OperationInput<"customerPurchaseVip">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerPurchaseVip">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerPurchaseVip", input, { signal });
}
Оценить стоимость редактирования и повторной проверки относительно сохраненной классификации
POST /v1/rewrite/quote
Необходимая область действия (scope): rewrite
Входные данные: { body: EditQuoteInput; }
Возвращает: EditQuote
Документированные статусы HTTP: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteClassificationEdit(
input: OperationInput<"customerQuoteClassificationEdit">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteClassificationEdit">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteClassificationEdit", input, { signal });
}
Оценить стоимость редактирования и повторной проверки относительно сохраненной классификации
POST /v1/classify/edit/quote
Необходимая область действия (scope): classify
Входные данные: { body: EditQuoteInput; }
Возвращает: EditQuote
Документированные статусы HTTP: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteManualClassificationEdit(
input: OperationInput<"customerQuoteManualClassificationEdit">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteManualClassificationEdit">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteManualClassificationEdit", input, { signal });
}
Классифицировать электронное письмо, используя имя отправителя, тему и текст
POST /v1/classify/edit
Необходимая область действия (scope): classify
Входные данные: { body: CustomerManualEditInput; }
Возвращает: CustomerManualEditResult
Документированные статусы HTTP: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerClassifyEmail(
input: OperationInput<"customerClassifyEmail">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerClassifyEmail">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerClassifyEmail", input, { signal });
}
Запросить платную услугу ИИ-переписывания выбранных помеченных терминов и изменить классификацию результата
POST /v1/rewrite
Необходимая область действия (scope): rewrite
Входные данные: { body: CustomerAiRewriteInput; }
Возвращает: AiRewriteResult
Документированные статусы HTTP: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerRewriteFlaggedTermsWithAi(
input: OperationInput<"customerRewriteFlaggedTermsWithAi">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerRewriteFlaggedTermsWithAi">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerRewriteFlaggedTermsWithAi", input, { signal });
}
Проверить один точный готовый черновик по имеющемуся оплаченному чеку Rewrite All без повторного списания средств
POST /v1/rewrite/finalize
Необходимая область действия (scope): rewrite
Входные данные: { body: { requestId: string; sender: string; subject: string; body: string; }; }
Возвращает: { requestId: string; input: RewrittenClassificationInput; classification: ClassificationResult; }
Документированные статусы HTTP: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerFinalizeAiRewrite(
input: OperationInput<"customerFinalizeAiRewrite">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerFinalizeAiRewrite">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerFinalizeAiRewrite", input, { signal });
}
Восстановить имеющийся чек о завершенном платном ИИ-перефразировании
GET /v1/rewrite/result/{requestId}
Необходимая область действия (scope): rewrite
Входные данные: { path: { requestId: string; }; }
Возвращает: AiRewriteResult
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetAiRewriteResult(
input: OperationInput<"customerGetAiRewriteResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetAiRewriteResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetAiRewriteResult", input, { signal });
}
Запросить стоимость максимально разрешенной цены для отдельно оплачиваемой услуги AI-переписывания
POST /v1/rewrite/ai-quote
Необходимая область действия (scope): rewrite
Входные данные: { body: AiRewriteQuoteInput; }
Возвращает: AiRewriteQuote
Документированные статусы HTTP: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerQuoteAiRewrite(
input: OperationInput<"customerQuoteAiRewrite">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerQuoteAiRewrite">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerQuoteAiRewrite", input, { signal });
}
Создать редактируемый стандартный MJML-дизайн письма с помощью ИИ по подтвержденной цене для аккаунта
POST /v1/email-builder/ai-template
Необходимая область действия (scope): ai:generate
Входные данные: { body: CustomerAiEmailTemplateInput; }
Возвращает: AiEmailTemplateResult
Документированные статусы HTTP: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateAiEmailTemplate(
input: OperationInput<"customerCreateAiEmailTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateAiEmailTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateAiEmailTemplate", input, { signal });
}
Создать редактируемый нативный VIP-дизайн письма с помощью ИИ по подтвержденной цене для участников
POST /v1/vip/email-template
Необходимая область действия (scope): ai:generate
Входные данные: { body: CustomerVipEmailTemplateInput; }
Возвращает: CustomerVipEmailTemplateResult
Документированные статусы HTTP: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateVipEmailTemplate(
input: OperationInput<"customerCreateVipEmailTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateVipEmailTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateVipEmailTemplate", input, { signal });
}
Открыть сессию стандартного редактора дизайна писем бесплатно
POST /v1/email-builder/access
Необходимая область действия (scope): builder:write
Входные данные: { body: CustomerEmailBuilderAccessInput; }
Возвращает: EmailBuilderAccess
Документированные статусы HTTP: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerAccessEmailBuilder(
input: OperationInput<"customerAccessEmailBuilder">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerAccessEmailBuilder">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerAccessEmailBuilder", input, { signal });
}
GET /email-builder/access/{accessId}
GET /v1/email-builder/access/{accessId}
Необходимая область действия (scope): builder:read
Входные данные: { query?: { designId?: string; }; path: { accessId: string; }; }
Возвращает: EmailBuilderActiveAccess
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetEmailBuilderAccess(
input: OperationInput<"customerGetEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetEmailBuilderAccess", input, { signal });
}
DELETE /email-builder/access/{accessId}
DELETE /v1/email-builder/access/{accessId}
Необходимая область действия (scope): builder:write
Входные данные: { path: { accessId: string; }; }
Возвращает: undefined
Документированные статусы HTTP: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCloseEmailBuilderAccess(
input: OperationInput<"customerCloseEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCloseEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCloseEmailBuilderAccess", input, { signal });
}
POST /vip/email-builder/access
POST /v1/vip/email-builder/access
Необходимая область действия (scope): vip:builder
Входные данные: { body: CustomerVipBuilderAccessInput; }
Возвращает: VipBuilderAccess
Документированные статусы HTTP: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateVipEmailBuilderAccess(
input: OperationInput<"customerCreateVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateVipEmailBuilderAccess", input, { signal });
}
GET /vip/email-builder/access/{accessId}
GET /v1/vip/email-builder/access/{accessId}
Необходимая область действия (scope): builder:read
Входные данные: { path: { accessId: string; }; }
Возвращает: VipBuilderAccess
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipEmailBuilderAccess(
input: OperationInput<"customerGetVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipEmailBuilderAccess", input, { signal });
}
DELETE /vip/email-builder/access/{accessId}
DELETE /v1/vip/email-builder/access/{accessId}
Необходимая область действия (scope): vip:builder
Входные данные: { path: { accessId: string; }; }
Возвращает: undefined
Документированные статусы HTTP: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerDeleteVipEmailBuilderAccess(
input: OperationInput<"customerDeleteVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerDeleteVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerDeleteVipEmailBuilderAccess", input, { signal });
}
Read permanent paid-result evidence with the original account and credential
GET /customer/paid-results/{recoveryId}
Необходимая область действия (scope): authenticated original credential
Входные данные: { path: { recoveryId: string; }; }
Возвращает: { status: "pending" | "succeeded" | "failed"; operation: "customerStandardAiGenerate" | "customerVipAiGenerate" | "customerVipBuilderAccess"; settlement: { kind: "paid_result" | "no_charge" | "confirmed_refund" | "unresolved"; accountId: string; credentialId: string | null; recoveryId: string; receiptId: string; chargeMillicents?: number; refundMillicents?: number; deletedAt?: string; }; result?: { [key: string]: unknown; }; error?: { [key: string]: unknown; }; }
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetPaidResult(
input: OperationInput<"customerGetPaidResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetPaidResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetPaidResult", input, { signal });
}
Read the authenticated account and credential identity before paid dispatch
GET /customer/paid-results/identity
Необходимая область действия (scope): authenticated credential
Входные данные: Record<string, never>
Возвращает: { accountId: string; credentialId: string; }
Документированные статусы HTTP: 200, 401, 403, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerPaidResultIdentity(
input: OperationInput<"customerPaidResultIdentity">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerPaidResultIdentity">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerPaidResultIdentity", input, { signal });
}
Explicitly resolve an owned paid result with the original credential and service scope
POST /customer/paid-results/{recoveryId}/resolve
Необходимая область действия (scope): original ai:generate or vip:builder service scope
Входные данные: { body: { action: "resolve"; reason: string; }; path: { recoveryId: string; }; }
Возвращает: { status: "pending" | "succeeded" | "failed"; operation: "customerStandardAiGenerate" | "customerVipAiGenerate" | "customerVipBuilderAccess"; settlement: { kind: "paid_result" | "no_charge" | "confirmed_refund" | "unresolved"; accountId: string; credentialId: string | null; recoveryId: string; receiptId: string; chargeMillicents?: number; refundMillicents?: number; deletedAt?: string; }; result?: { [key: string]: unknown; }; error?: { [key: string]: unknown; }; }
Документированные статусы HTTP: 200, 400, 401, 403, 404, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerResolvePaidResult(
input: OperationInput<"customerResolvePaidResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerResolvePaidResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerResolvePaidResult", input, { signal });
}
Импортировать и скомпилировать стандартный дизайн MJML без сохранения или отправки
POST /v1/email-builder/import
Необходимая область действия (scope): builder:write
Входные данные: { body: CustomerStandardBuilderInput; }
Возвращает: CustomerStandardBuilderImportResult
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderImport(
input: OperationInput<"customerStandardBuilderImport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderImport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderImport", input, { signal });
}
Проверить и скомпилировать стандартный дизайн MJML без сохранения или отправки
POST /v1/email-builder/validate
Необходимая область действия (scope): builder:write
Входные данные: { body: CustomerStandardBuilderInput; }
Возвращает: CustomerStandardBuilderValidateResult
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderValidate(
input: OperationInput<"customerStandardBuilderValidate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderValidate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderValidate", input, { signal });
}
Скомпилировать стандартный дизайн MJML в HTML без сохранения или отправки
POST /v1/email-builder/compile
Необходимая область действия (scope): builder:write
Входные данные: { body: CustomerStandardBuilderInput; }
Возвращает: CustomerStandardBuilderCompileResult
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderCompile(
input: OperationInput<"customerStandardBuilderCompile">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderCompile">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderCompile", input, { signal });
}
Экспортировать стандартный дизайн MJML как HTML, MJML или ZIP без отправки
POST /v1/email-builder/export
Необходимая область действия (scope): builder:write
Входные данные: { body: CustomerStandardBuilderInput; }
Возвращает: CustomerStandardBuilderExportResult
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerStandardBuilderExport(
input: OperationInput<"customerStandardBuilderExport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerStandardBuilderExport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerStandardBuilderExport", input, { signal });
}
Импортировать и скомпилировать нативный VIP-дизайн при наличии активного членства и открытого доступа владельца
POST /v1/vip/email-builder/import
Необходимая область действия (scope): vip:builder
Входные данные: { body: CustomerNativeBuilderInput; }
Возвращает: CustomerNativeBuilderImportResult
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderImport(
input: OperationInput<"customerNativeBuilderImport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderImport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderImport", input, { signal });
}
Проверить и скомпилировать нативный VIP-дизайн при наличии активного членства и открытого доступа владельца
POST /v1/vip/email-builder/validate
Необходимая область действия (scope): vip:builder
Входные данные: { body: CustomerNativeBuilderInput; }
Возвращает: CustomerNativeBuilderValidateResult
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderValidate(
input: OperationInput<"customerNativeBuilderValidate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderValidate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderValidate", input, { signal });
}
Скомпилировать нативный VIP-дизайн в HTML при наличии активной подписки и открытого доступа
POST /v1/vip/email-builder/compile
Необходимая область действия (scope): vip:builder
Входные данные: { body: CustomerNativeBuilderInput; }
Возвращает: CustomerNativeBuilderCompileResult
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderCompile(
input: OperationInput<"customerNativeBuilderCompile">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderCompile">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderCompile", input, { signal });
}
Экспортировать нативный VIP-дизайн как HTML или ZIP-архив с тремя вариантами без отправки
POST /v1/vip/email-builder/export
Необходимая область действия (scope): vip:builder
Входные данные: { body: CustomerNativeBuilderInput; }
Возвращает: CustomerNativeBuilderExportResult
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerNativeBuilderExport(
input: OperationInput<"customerNativeBuilderExport">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerNativeBuilderExport">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerNativeBuilderExport", input, { signal });
}
Запустить разовую передачу управления стандартному или привилегированному нативному VIP-хостинг-редактору
POST /v1/email-builder/hosted-handoffs
Необходимая область действия (scope): builder:write
Входные данные: { body: CustomerHostedBuilderHandoffInput; }
Возвращает: CustomerHostedBuilderHandoff
Документированные статусы HTTP: 201, 400, 401, 403, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateHostedBuilderHandoff(
input: OperationInput<"customerCreateHostedBuilderHandoff">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateHostedBuilderHandoff">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateHostedBuilderHandoff", input, { signal });
}
Список VIP-шаблонов конструктора
GET /v1/vip/email-builder/templates
Необходимая область действия (scope): vip:read
Входные данные: Record<string, never>
Возвращает: CustomerVipTemplateCatalog
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListVipBuilderTemplates(
input: OperationInput<"customerListVipBuilderTemplates">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListVipBuilderTemplates">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListVipBuilderTemplates", input, { signal });
}
Получить VIP-шаблон конструктора
GET /v1/vip/email-builder/templates/{templateId}
Необходимая область действия (scope): vip:read
Входные данные: { path: { templateId: string; }; }
Возвращает: CustomerVipTemplateDocument
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipBuilderTemplate(
input: OperationInput<"customerGetVipBuilderTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipBuilderTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipBuilderTemplate", input, { signal });
}
Список стандартных шаблонов конструктора
GET /v1/email-builder/templates
Необходимая область действия (scope): catalog:read
Входные данные: Record<string, never>
Возвращает: CustomerStandardTemplateCatalog
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerListStandardBuilderTemplates(
input: OperationInput<"customerListStandardBuilderTemplates">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerListStandardBuilderTemplates">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerListStandardBuilderTemplates", input, { signal });
}
Получить стандартный шаблон конструктора
GET /v1/email-builder/templates/{templateId}
Необходимая область действия (scope): catalog:read
Входные данные: { path: { templateId: string; }; }
Возвращает: CustomerStandardTemplateDetail
Документированные статусы HTTP: 200, 400, 401, 403, 404, 413, 429, 503
Параметры, схемы и примеры HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetStandardBuilderTemplate(
input: OperationInput<"customerGetStandardBuilderTemplate">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetStandardBuilderTemplate">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetStandardBuilderTemplate", input, { signal });
}
Self-hosted узел n8n
0.1.0
Требуется Node.js 20.19+ и пропатченная self-hosted установка n8n с n8n-workflow >=2.39.3 <3. Не устанавливайте принудительно в старые несовместимые хосты. Установите загруженный tarball в директорию custom-node и перезапустите n8n. Этот неопубликованный узел недоступен через n8n Cloud или установку через сообщество по npm-name.
Платное согласие отключено по умолчанию. Каждое подтвержденное действие выполняет один запрос классификации без автоматических повторов. Результаты помещаются в пространство имен sendrepute. Используйте логический элемент IF для проверки sendrepute.allowed перед отправкой и проверяйте статус ошибки отдельно. Консультативный и блокирующий режимы возвращают явные решения. Сам узел не отправляет почту.
Скачать n8n tarball
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Запустите на хосте с self-hosted n8n, затем перезапустите сервис n8n, используя ваш обычный менеджер процессов. Убедитесь, что SendRepute появился в списке узлов. Импортируйте извлеченный package/examples/classify-email.workflow.json через редактор n8n. Установка через npm-name Community nodes и n8n Cloud не поддерживаются этим неопубликованным пакетом.
mkdir -p ~/.n8n/nodes
cd ~/.n8n/nodes
curl -fLO https://www.sendrepute.com/downloads/sendrepute-n8n.tgz
npm install ./sendrepute-n8n.tgz
tar -xzf sendrepute-n8n.tgz package/examples/classify-email.workflow.json
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/n8n-nodes-sendrepute.git
cd n8n-nodes-sendrepute
npm ci
npm run pack:check
npm pack --ignore-scripts
archive="$PWD/n8n-nodes-sendrepute-0.1.0.tgz"
mkdir -p ~/.n8n/nodes
cd ~/.n8n/nodes
npm install "$archive"
2. Безопасная настройка
Создайте учетные данные SendRepute API с клиентским ключом (classify-scoped) в хранилище учетных данных n8n. Никогда не помещайте его в JSON воркфлоу или выражения. Приведенный ниже JSON показывает параметры узла, а не полный импортируемый воркфлоу. Сопоставьте отображаемое имя отправителя, тему и тело; выберите advisory/blocking, threshold и политику отказов open/closed. Ознакомьтесь с ценами перед переключением paidConsent в значение true. Каждый элемент с согласием выполняет не более одного запроса.
{
"operation": "classify",
"paidConsent": false,
"sender": "={{ $json.sender }}",
"subject": "={{ $json.subject }}",
"body": "={{ $json.body }}",
"decisionMode": "blocking",
"threshold": 0.8,
"failurePolicy": "closed"
}
3. Осознанное использование
Поместите узел IF сразу после SendRepute и используйте это логическое условие. Подключите только выход true к вашему существующему узлу электронной почты; направьте false на проверку или остановку. Проверяйте analysisStatus отдельно, даже когда allowed имеет значение true. Включенный воркфлоу начинается с отключенным платным согласием и не содержит учетных данных. SendRepute сам по себе никогда не отправляет почту.
{{ $json.sendrepute.allowed === true }}
Результаты, отказы и лимиты
Успешные результаты заменяют пространство имен sendrepute полями analysisStatus, decision, allowed, recommendation, проверенным баллом и полями биллинга. Ошибки опускают спам-баллы и возвращают очищенные failureCategory/errorCode. Закрытые сбои (Closed failures) блокируют; открытые сбои (open failures) разрешают, но помечают analysisStatus как failed. Консультативные успехи (Advisory successes) всегда разрешают выполнение независимо от recommendation. При consent-off возвращается статус not_run. Повторные попытки (retries), recipients, attachments, rewrites, селектор моделей или кастомные эндпоинты отсутствуют. Обновленный аудит исходных зависимостей не выявил проблем; это результат на конкретный момент времени, а не сертификация безопасности. Поддерживайте патчи в self-hosted рантайме и изучите SECURITY.md перед установкой.
Интеграция Laravel
0.1.0
Предназначено для PHP 8.2+ и Laravel 12–13. Установите ZIP-архив с помощью локального репозитория артефактов Composer или извлеките его и настройте репозиторий путей Composer, как описано в прилагаемом файле README. Публикация в Packagist не заявлена.
Платное согласие и почтовый хук отключены по умолчанию. Даже если они включены, каждое сообщение должно явно давать согласие с помощью заголовка X-SendRepute-Classify: yes. Заголовок удаляется перед доставкой. Консультативный и блокирующий режимы имеют независимые политики отказов; сброс паролей и транзакционная почта остаются нетронутыми, если только на них не было дано явное согласие.
Скачать Laravel ZIP
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Запустите внутри вашего приложения Laravel. Эти команды извлекают дистрибутив и регистрируют репозиторий Composer по пути; это не установка через Packagist. Package discovery регистрирует провайдера, а vendor:publish создает config/sendrepute.php. Держите директорию извлеченного пакета доступной для Composer. Использование artifact repository — еще один вариант, описанный в README.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-laravel.zip -o packages/sendrepute-laravel.zip
unzip packages/sendrepute-laravel.zip -d packages
composer config repositories.sendrepute path ./packages/sendrepute-laravel
composer require sendrepute/laravel:@dev
php artisan vendor:publish --tag=sendrepute-config
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
composer config repositories.sendrepute vcs https://github.com/sendrepute/sendrepute-laravel
composer require sendrepute/laravel:dev-main
php artisan vendor:publish --tag=sendrepute-config
2. Безопасная настройка
Храните SENDREPUTE_API_KEY в серверных секретах. Базовый URL заканчивается на /api; клиент добавляет /v1/classify. Требуется точное соответствие доверенному хосту и проверенный HTTPS. Оба показанных переключателя остаются выключенными, пока вы не ознакомитесь с ценами и явно не установите их в true. В config/sendrepute.php выберите mail.mode, mail.spam_probability_threshold и mail.failure_policy независимо. По умолчанию используется advisory с разрешением при сбое.
SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
SENDREPUTE_TRUSTED_HOSTS=www.sendrepute.com
SENDREPUTE_PAID_ANALYSIS_CONSENT=false
SENDREPUTE_MAIL_ENABLED=false
3. Осознанное использование
Добавляйте точный заголовок согласия (opt-in header) только в специально выбранные классы Mailable, никогда в глобальный обратный вызов почты. Для автоматического хука необходимы как глобальные переключатели, так и заголовок для конкретного сообщения. Заголовок удаляется перед доставкой. Исключите сброс паролей и критические уведомления из автоматической блокировки, если они не протестированы явно. Вместо этого ручная классификация может разрешить контракт Classifier и предоставить согласие на каждый вызов, как показано.
// Inside your deliberately opted-in Mailable:
public function headers(): \Illuminate\Mail\Mailables\Headers
{
return new \Illuminate\Mail\Mailables\Headers(text: [
'X-SendRepute-Classify' => 'yes',
]);
}
// Or classify manually inside an authenticated, explicitly confirmed action:
function classifyAfterConsent(bool $confirmed, string $subject, string $body): \SendRepute\Laravel\ClassificationResult
{
if (!$confirmed) {
throw new \RuntimeException('Paid consent required');
}
return app(\SendRepute\Laravel\Contracts\Classifier::class)->classify(
sender: 'Example Company',
subject: $subject,
body: $body,
paidAnalysisConsent: true,
);
}
Справочник API и методов
Извлеките интерфейс Classifier из контейнера Laravel. classify(string sender, string subject, string body, ?string model = null, bool paidAnalysisConsent = false) возвращает ClassificationResult. Его публичные поля: requestId, model, label, spamProbability, confidence, replayed и chargedMillicents. SendReputeException предоставляет очищенную категорию, статус HTTP, код API и ID запроса. Автоматический хук — AnalyzeOutgoingMessage на событии MessageSending, а его безопасная диагностика — ClassificationOutcome. Данная интеграция поддерживает только классификацию, но не администрирование аккаунта, платежи, конструкторы или ИИ-перезапись.
Результаты, отказы и лимиты
ClassificationResult содержит валидированный результат и данные биллинга. Хук MessageSending возвращает false для отмены заблокированного сообщения; отмена не является ошибкой SMTP или событием MessageSent. ClassificationOutcome сообщает только действие, оценку и очищенные метаданные сбоя, но никогда не контент сообщения. Политика сбоев охватывает некорректный ввод/ответ, аутентификацию, баланс, лимиты запросов и проблемы транспорта. Очередь или повторные попытки не добавляются. Требуются имя отправителя и текстовое или HTML тело в памяти.
Предполетная проверка черновика Mautic
0.1.0
Предназначено для одноузловых установок Mautic 5.x с PHP 8.1+ и ext-curl. Mautic 4, Mautic 6 и многоузловые кластеры не поддерживаются. Извлеките SendReputeBundle в каталог plugins, перезагрузите плагины и очистите кэш согласно прилагаемому README. Настройте учетные данные и явно подтвердите режим блокировки local-flock в серверном окружении.
Инициируемый администратором платный консультативный анализ только сохраненного черновика. Глобальное согласие, проверка доступа к сущностям, валидация CSRF и одноразовое подтверждение защищают каждый запрос. Он не отправляет, не перезаписывает и не блокирует электронные письма и не имеет принудительного исполнения во время отправки. Подстановки получателей остаются неразвернутыми; сначала сохраните изменения в редакторе.
Скачать Mautic ZIP
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Запустите из корня Mautic от того же пользователя PHP и в том же окружении, что и веб-приложение, или извлеките ZIP в процессе развертывания перед перезагрузкой плагинов. Требуется Mautic 5.x, PHP 8.1+, ext-curl и один веб-узел Linux/POSIX. Mautic 4/6 и многоузловые кластеры не поддерживаются; сертификация установки «патч за патчем» в реальном времени не заявлена.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-mautic.zip
unzip sendrepute-mautic.zip -d plugins
php bin/console mautic:plugins:reload
php bin/console cache:clear
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
git clone https://github.com/sendrepute/sendrepute-mautic.git
cd sendrepute-mautic
python3 package.py
2. Безопасная настройка
Создайте указанную директорию постоянного реестра вне корня веб-сервера, принадлежащую пользователю PHP с правами 0700. Не используйте /tmp, эфемерные контейнеры, симлинки или неопределенные сетевые хранилища. Храните SENDREPUTE_API_KEY на стороне сервера. Подтверждайте local-flock только в том случае, если один веб-узел обеспечивает общую блокировку процессов. Глобальный платный анализ остается отключенным (0); установите значение 1 только после ознакомления с ценами и лимитами. Ни одно поле в браузере не должно содержать учетные данные или эндпоинт.
SENDREPUTE_MAUTIC_PAID_ANALYSIS_ENABLED=0
SENDREPUTE_MAUTIC_ATOMIC_LOCK_MODE=local-flock
SENDREPUTE_MAUTIC_LEDGER_DIR=/var/lib/mautic/sendrepute-ledger
3. Осознанное использование
Сначала сохраните изменения в редакторе. Как администратор Mautic с доступом к этой почте, откройте сохраненный черновик и выберите SendRepute preflight. Просмотрите подтверждение и явно примите платную операцию. Запрос требует валидации CSRF и десятиминутного одноразового интента, привязанного к сохраненному контенту. Постоянная блокировка и реестр без контента предотвращают дублирование платных расходов на поддерживаемом одиночном узле.
Результаты, отказы и лимиты
Отображает валидированную вероятность, метку, достоверность, а также фактическую оплаченную сумму или повтор чека. При сбоях решение о спаме не выводится, и автоматические повторные попытки не выполняются. Анализируются только сохраненное имя отправителя, тема и тело письма; подстановки контактов остаются неразвернутыми. Плагин не переписывает черновики, не отправляет электронную почту, не блокирует кампании и не обеспечивает политику времени отправки. Проверка сохраненного черновика не может гарантировать итоговое сообщение, полученное получателем.
Клиент Python и бэкенд Django
0.1.0
Требуется Python 3.9+. Извлеките исходный ZIP и установите его директорию с помощью pip. Универсальный серверный клиент использует стандартную библиотеку; Django является необязательной зависимостью для явного почтового бэкенда. Данный пакет не опубликован в PyPI.
Платное согласие по умолчанию отключено. Оболочка Django сохраняет исходные объекты транспорта и сообщений. Она анализирует одну ограниченную строку, объединяющую основное тело письма с альтернативными вариантами text/plain и text/html, исключая вложения. Блокирующий режим отклоняет неподдерживаемый или слишком большой отображаемый контент. Ошибки аутентификации приводят к блокировке по умолчанию даже при разрешающей политике; выбирайте поведение critical-mail осознанно.
Скачать ZIP с исходным кодом Python
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Используйте виртуальное окружение. Универсальный клиент использует только стандартную библиотеку; последняя команда добавляет необязательную зависимость Django и не требуется для использования с Flask, FastAPI или другими универсальными серверами. Пакет устанавливается из каталога загруженного исходного кода, а не из PyPI. Минимум для пакета — Python 3.9+; выбирайте версии Python/Django, поддерживаемые совместно.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-python.zip
unzip sendrepute-python.zip
python -m venv .venv
. .venv/bin/activate
python -m pip install ./sendrepute-python
python -m pip install './sendrepute-python[django]'
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
python -m pip install "sendrepute @ git+https://github.com/sendrepute/sendrepute-python.git@7d54935c4ae2db136800231136e4ea28d63118db"
python -m pip install "sendrepute[django] @ git+https://github.com/sendrepute/sendrepute-python.git@7d54935c4ae2db136800231136e4ea28d63118db"
2. Безопасная настройка
Передайте SENDREPUTE_API_KEY через секреты сервера. Универсальный клиент по умолчанию использует каноническую размещенную конечную точку, проверенный HTTPS, без перенаправлений и повторных попыток. Согласие клиента по умолчанию отключено; пример предоставляет согласие на каждый вызов только после проверки confirmed. Переопределение эндпоинта требует явного списка разрешенных источников HTTPS. Возвращаемый словарь содержит проверенный результат и данные о выставлении счетов, а не решение об отправке.
import os
from sendrepute import SendReputeClient, SendReputeError
client = SendReputeClient(api_key=os.environ["SENDREPUTE_API_KEY"])
def classify_after_consent(sender, subject, body, confirmed=False):
if confirmed is not True:
raise ValueError("Paid consent required")
try:
return client.classify(
sender=sender, subject=subject, body=body,
paid_analysis_consent=True,
)
except SendReputeError as error:
# Safe metadata only; do not log message content or response bodies.
print(error.code, error.status, error.request_id)
raise
Бэкенд электронной почты Django
Сохраните существующий бэкенд в SENDREPUTE_ORIGINAL_EMAIL_BACKEND и оставьте его обычные настройки SMTP. В примере платное согласие остается отключенным; установите значение True только после ознакомления с ценами. Режим advisory разрешает успешный анализ; блокировка сравнивается с SENDREPUTE_SPAM_THRESHOLD. Выбирайте политику независимого отказа обдуманно. Ошибки аутентификации блокируют по умолчанию даже при условии allow. Пример следует значениям по умолчанию из README и не является рекомендацией по пропуску ошибок для критически важной почты.
# Django settings.py
import os
EMAIL_BACKEND = "sendrepute.django.SendReputeEmailBackend"
SENDREPUTE_ORIGINAL_EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend"
SENDREPUTE_API_KEY = os.environ["SENDREPUTE_API_KEY"]
SENDREPUTE_PAID_ANALYSIS_CONSENT = False
SENDREPUTE_POLICY_MODE = "advisory"
SENDREPUTE_SPAM_THRESHOLD = 0.90
SENDREPUTE_FAILURE_POLICY = "allow"
SENDREPUTE_ALLOW_AUTH_FAILURE = False
SENDREPUTE_TIMEOUT = 10
3. Осознанное использование
Эта функция отправляет данные только при вызове. При настроенной обертке Django и включенном платном согласии исходный бэкенд получает исходные объекты сообщений без изменений. Классификатор получает одну ограниченную строку, объединяющую основное тело с альтернативными вариантами text/plain и text/html; вложения и получатели не являются отдельными входными данными. Выполните рендеринг шаблонов перед вызовом. Сначала используйте локальный тестовый бэкенд, затем ваш специально настроенный реальный транспорт.
from django.core.mail import EmailMultiAlternatives
def send_reviewed_message(recipient):
message = EmailMultiAlternatives(
subject="Your requested summary",
body="Here is the summary you requested.",
from_email="Example Team <team@example.com>",
to=[recipient],
)
message.attach_alternative(
"<p>Here is the summary you requested.</p>", "text/html"
)
return message.send()
Справочник API и методов
Публичный конструктор — SendReputeClient(api_key, endpoint, allowed_origins, timeout, paid_analysis_consent), где все аргументы, кроме api_key, передаются как именованные. timeout должен быть больше нуля и не более 30 секунд. classify требует именованные аргументы sender, subject и body; model и per-call paid_analysis_consent необязательны. Sender — от 1 до 320 символов, subject — от 1 до 998, body — от 1 до 524,288, с отдельным ограничением на закодированный запрос. Возвращаемый dict содержит requestId, model, result и billing; result включает label, spamProbability, confidence, reasons и необязательный contentAudit. billing содержит chargedMillicents и replayed. Ошибки включают ConsentRequiredError, AuthenticationError, BalanceError, RateLimitError, TransportError и InvalidResponseError, все в рамках SendReputeError. Некорректная конфигурация может вызвать ValueError. Бэкенд Django предоставляет open(), close() и send_messages(email_messages), возвращая количество отправленных сообщений исходного бэкенда; он не добавляет общих методов API, конструктора, перезаписи или оплаты.
Результаты, отказы и лимиты
Блокировка отклоняет неподдерживаемый или слишком большой отображаемый контент вместо анализа только более безопасного подмножества. Ошибки аутентификации требуют отдельного явного переопределения для разрешения. Другие ошибки следуют выбранной политике allow/block; fail_silently определяет, будут ли возникать исключения при заблокированных сбоях или они будут пропущены. Обертка не ставит в очередь, не повторяет попытки, не меняет транспорт, не проверяет вложения и не выполняет рендеринг шаблонов. Универсальный клиент выдает очищенные подклассы SendReputeError с кодом/статусом/request_id; не логируйте тела сообщений.
Клиент классификации Go
0.1.0
Требуется Go 1.22+. Клиент, использующий только стандартную библиотеку, поддерживает классификацию, но не транспорт электронной почты. Выберите загружаемый ZIP-архив с исходным кодом с заменой локального модуля или установку проверенного публичного модуля, показанную в альтернативном варианте источника.
Серверная классификация с использованием только стандартной библиотеки с явным платным согласием, ограниченными запросами, верифицированным HTTPS, отказом от перенаправлений и отсутствием повторов. Она не отправляет почту и не принимает решения об отправке/блокировке. Ваше приложение должно намеренно выбирать пороги и поведение при сбое, особенно для критически важной транзакционной почты.
Скачать ZIP с исходным кодом Go
Публичный репозиторий исходного кода
Полный README и примеры
Заметки по безопасности и известные ограничения
1. Установка
Извлеките исходный код в каталог вашего существующего приложения на Go и выполните там команды модуля. Локальная замена указывает на загруженный модуль; переместите или скорректируйте этот путь, если структура вашего проекта отличается. Запускайте go mod init с вашим собственном именем модуля только при создании нового приложения. Этому клиенту не требуются внешние модули времени выполнения.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-go.zip
unzip sendrepute-go.zip
# Run inside your existing application's module:
go mod edit -require=github.com/sendrepute/sendrepute-go@v0.0.0
go mod edit -replace=github.com/sendrepute/sendrepute-go=./sendrepute-go-v0.1.0
go mod tidy
Альтернатива: установка из публичного исходного кода
Используйте этот путь вместо приведенных выше инструкций по загрузке с веб-сайта. В файле README репозитория описаны остальные этапы активации и настройки; создание одного только ZIP-архива не означает установку плагина. Для Python вторая команда добавляет опциональную поддержку Django. Храните учетные данные в секретах сервера и ознакомьтесь с заметками по безопасности перед включением платных функций. Только Node доступен в npm; наличие публичного репозитория GitHub не подразумевает публикацию в WordPress.org, n8n Cloud, Packagist или PyPI.
go get github.com/sendrepute/sendrepute-go@bfd656f829618348232da506225a5d92587d48e2
2. Безопасная настройка
Передайте SENDREPUTE_API_KEY из секретов сервера. Показанная функция не выполняет никакой работы до вызова с confirmed=true; этот вызов может привести к платной классификации. Она устанавливает десятисекундный контекст и использует каноническую конечную точку HTTPS. Согласие клиента по умолчанию отключено; последний аргумент true дает согласие на этот конкретный запрос. Переопределение эндпоинта требует явной записи AllowedOrigins; перенаправления отклоняются.
package integration
import (
"context"
"errors"
"os"
"time"
sendrepute "github.com/sendrepute/sendrepute-go"
)
func Analyze(subject, body string, confirmed bool) error {
if !confirmed {
return errors.New("paid consent required")
}
client, err := sendrepute.NewClient(sendrepute.Config{
APIKey: os.Getenv("SENDREPUTE_API_KEY"),
})
if err != nil {
return err
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
result, err := client.Classify(ctx, sendrepute.ClassificationInput{
Sender: "Example Team", Subject: subject, Body: body,
}, true)
if err != nil {
return err
}
if result.Result.SpamProbability >= 0.90 {
return errors.New("review required")
}
return nil
}
3. Осознанное использование
Вызывайте Analyze из вашего аутентифицированного приложения только после ознакомления с ценами и явного согласия. Порог 0.90 и ошибка проверки являются примером политики приложения, а не настройками SDK по умолчанию. Решите, означают ли ошибки отсрочку, разрешение или отказ, прежде чем подключать какой-либо код отправки. Клиент возвращает типизированный результат с полями Result.SpamProbability и биллингом; он никогда не отправляет электронную почту и не принимает решений о доставке самостоятельно.
Справочник API и методов
NewClient(Config) возвращает (*Client, error). Config принимает APIKey, Endpoint, AllowedOrigins, Timeout и PaidAnalysisConsent. Classify(ctx, ClassificationInput, consent) возвращает (*ClassificationResponse, error). Поля Input: Sender, Subject, Body и необязательный Model. Sender — от 1 до 320 рун, subject — от 1 до 998 рун, body — не более 524,288 байт UTF-8. Типизированный ответ содержит RequestID, Model, Result и Billing; Billing предоставляет ChargedMillicents и Replayed. Result включает Label, SpamProbability, Confidence, Reasons, FlaggedTerms и необязательный ContentAudit. Используйте errors.As для безопасной проверки *Error; ошибки конфигурации и API остаются ошибками, а не спам-очками. Методы для аккаунта, оплаты, конструктора или перезаписи отсутствуют.
Результаты, отказы и лимиты
Один вызов выполняет максимум одну платную попытку HTTP без повторов. Ошибки раскрывают безопасную категорию, ограниченный код/request ID и статус, но никогда — учетные данные, тела писем или детали сети. Длительность контекста, размеры запроса и ответа ограничены; некорректные ответы отклоняются, а не преобразуются в баллы. Клиент не имеет возможностей парсинга MIME, рендеринга, работы с получателями, вложениями, очередями, построителями, перезаписью или SMTP. Выбирайте модель явно только при необходимости; в противном случае применяется значение по умолчанию для аккаунта.
listmonk HTTP Messenger
0.1.0
Неопубликованный пакет из локального источника для Node.js 20+, предназначенный для интерфейса Custom HTTP Messenger в listmonk 6.2.0. Этот внешний сервис берет на себя последующую SMTP-доставку после классификации; он не является внутрипроцессным плагином или SMTP-прокси для предварительной проверки. Верификация изолирована и проводится в офлайн-режиме, а не в установленном развертывании listmonk или реальном тесте SMTP-провайдера.
Оба переключателя платных функций по умолчанию выключены. Мессенджер принимает одно полностью скомпонованное тело сообщения, отклоняет вложения, проверяет актуальную цену и требует строгого результата Inbox: метка inbox, spam probability не более 0.12 и отсутствие flagged terms. Затем он создает и отправляет то же самое проверенное тело через настроенное SMTP-соединение. Надежная система квитанций предотвращает автоматические повторы после заблокированных, неудачных, находящихся в процессе или неопределенных исходов.
Скачать неопубликованный ZIP-архив с исходным кодом listmonk
1. Установка
Распакуйте этот неопубликованный ZIP-архив с исходным кодом веб-сайта на выделенном хосте мессенджера. Изучите README.md и SECURITY.md, скопируйте пример окружения и выполните синтаксическую проверку точки входа сервера перед настройкой. Загружаемый разрешенный артефакт намеренно исключает тестовый набор репозитория. Сторонние пакеты времени выполнения отсутствуют. Это не установка через маркетплейс listmonk или внутрипроцессная установка.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-listmonk.zip
unzip sendrepute-listmonk.zip
cd sendrepute-listmonk
cp config.example.env .env
node --check src/server.mjs
2. Безопасная настройка
Используйте выделенную непривилегированную учетную запись и постоянный локальный каталог состояния с правами доступа 0700. Оставьте все три показанных переключателя безопасности в положении false до тех пор, пока не будут приняты условия ценообразования и ограничение неатомарной цены. Храните учетные данные SendRepute, Basic Auth мессенджера и нижестоящего SMTP только в серверных секретах (secrets). Завершайте HTTPS-соединение на доверенном обратном прокси-сервере.
SENDREPUTE_ENABLED=false
SENDREPUTE_PAID_CONSENT=false
SENDREPUTE_ALLOW_NONATOMIC_PRICE_CONFIRMATION=false
SENDREPUTE_CONFIRMED_MAX_PRICE_MILLICENTS=
STATE_DIRECTORY=/var/lib/sendrepute-listmonk
SMTP_HOST=smtp.example.com
SMTP_PORT=465
SMTP_SECURE=true
3. Осознанное использование
Предоставляйте доступ только к POST /v1/listmonk через HTTPS и выделенную Basic Auth. В разделе listmonk Settings > Messengers добавьте этот URL как Custom HTTP Messenger, выберите zero retries и укажите его только для кампаний, которые должны проверяться и доставляться. Не выбирайте одновременно listmonk SMTP: этот сервис сам выполняет последующую SMTP-отправку.
Custom HTTP Messenger URL: https://messenger.example.com/v1/listmonk
Authentication: dedicated Basic Auth username and password
Retries: 0
Select this messenger only. Do not also select SMTP for the campaign.
Результаты, отказы и лимиты
Доставленный дубликат возвращает success без повторной классификации или отправки. Любая квитанция со статусом blocked, failed, inspecting, sending или uncertain отклоняет повторную отправку. После неопределенного результата SMTP (uncertain outcome) сверьте логи провайдера и контекст listmonk вручную; никогда не удаляйте квитанцию только для того, чтобы принудительно повторить попытку. Текущая проверка цены актуальна, но не атомарна, так как классификация не принимает поле expectedPriceMillicents.
Адаптер Mailcoach Self-Hosted
0.1.0
Неопубликованный локальный пакет Composer, предназначенный для Mailcoach Self-Hosted v10 на Laravel 12. Лицензионное ядро spatie/laravel-mailcoach v10 недоступно в этом рабочем пространстве, поэтому данный пакет не претендует на прохождение сквозного теста с установленным Mailcoach v10. Реальные тесты Laravel 12 Mailer охватывают документированное отменяемое событие MessageSending; владелец лицензии должен проверить каждый конкретный путь отправки Mailcoach перед использованием в рабочей среде.
Переключатели enabled, paid-consent и подтверждение current-pricing по умолчанию выключены. После включения hook применяется к каждому сообщению через этот почтовый драйвер Laravel, а не только к маршрутам с именем Mailcoach. Он анализирует уже отрендеренные альтернативы Symfony Email и может отменить транспорт. По умолчанию используется Fail-closed; разрешение сбоев анализа — это отдельная осознанная политика.
Скачать экспериментальный исходный код Mailcoach в формате ZIP
1. Установка
Поместите загруженный неопубликованный ZIP-архив в приватную директорию артефактов Composer, доступную лицензированному приложению Mailcoach. Зарегистрируйте этот локальный репозиторий артефактов, добавьте зависимость require для ветки 0.1, зафиксируйте используемый lockfile и, при необходимости, опубликуйте конфигурацию. Это не установка через Packagist. Владелец лицензии должен выполнить проверку на соответствие конкретному релизу Mailcoach Self-Hosted v10.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-mailcoach.zip -o packages/sendrepute-mailcoach.zip
composer config repositories.sendrepute artifact packages
composer require sendrepute/mailcoach:^0.1
php artisan vendor:publish --tag=sendrepute-mailcoach-config
2. Безопасная настройка
Изначально оставьте все три переключателя в выключенном состоянии (false). Сохраните API key в секретах сервера и настройте лимит расходов на стороне аккаунта. Текущая операция classify не имеет атомарной защиты через expectedPriceMillicents, поэтому третий переключатель явно подтверждает согласие с текущими тарифами API, а не гарантирует фиксированную стоимость. Настройте порог threshold и политику allow/block для ошибок независимо друг от друга.
SENDREPUTE_MAILCOACH_ENABLED=false
SENDREPUTE_MAILCOACH_PAID_CONSENT=false
SENDREPUTE_MAILCOACH_ACCEPT_CURRENT_API_PRICING=false
SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
3. Осознанное использование
Обнаружение пакета регистрирует слушатель Laravel MessageSending. В коде приложения не требуется отдельный вызов для каждой кампании: при намеренном включении в выделенной инсталляции Mailcoach он проверяет каждое сообщение Symfony Email, отправляемое через этот Laravel mailer, непосредственно перед транспортировкой. В смешанном приложении Laravel почта хост-приложения также подлежит проверке.
Результаты, отказы и лимиты
Адаптер передает отображаемое имя отправителя, тему и каждый непустой текстовый вариант в памяти (text/plain или text/html), исключая при этом получателей, адреса, вложения, данные конверта и raw MIME. Отсутствующий или неподдерживаемый контент, некорректные ответы и ошибки API по умолчанию приводят к блокировке. Автономные тесты ядра проверяют реальную отмену в Laravel Mailer, однако маршруты кампаний, автоматизаций, транзакционных и тестовых сообщений в лицензионном Mailcoach остаются не проверенными.
Управляемый поток отправки Brevo
0.1.0
Неопубликованный локальный исходный пакет Node.js 20+, реализующий явный серверный API для отправки поверх операции Brevo transactional POST /v3/smtp/email. Он не перехватывает отправки из панели управления Brevo, кампании, автоматизации, SMTP-реле или вызовы через другие SDK. Тесты являются контролируемыми и автономными; они не сертифицируют живой аккаунт Brevo.
Согласие на платный анализ по умолчанию выключено. Принимаются только фиксированные встроенные текстовые и HTML-сообщения; удаленные шаблоны, параметры, запланированные отправки, версии сообщений и контент по ссылкам отклоняются. Точный неизменяемый проверенный snapshot отправляется в Brevo. Постоянный реестр sendKey блокирует дублирующиеся и двусмысленные повторы, а неопределенные результаты провайдера требуют сверки оператором.
Скачать неопубликованный исходный код Brevo в ZIP
1. Установка
Распакуйте неопубликованный ZIP-архив с исходным кодом в серверное приложение, изучите его README и заметки о безопасности, а также выполните синтаксическую проверку src/index.mjs. Загружаемый разрешенный артефакт намеренно исключает тестовый набор репозитория. Импортируйте SendReputeBrevo из src/index.mjs; это не установка через npm или маркетплейс Brevo. Требуется Node.js 20+, зависимости времени выполнения отсутствуют.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-brevo.zip
unzip sendrepute-brevo.zip
cd sendrepute-brevo
node --check src/index.mjs
2. Безопасная настройка
Оставляйте paidConsent в значении false до тех пор, пока не будут приняты текущие цены и ограничение неатомарной цены. Храните оба API-ключа в серверных секретах и используйте приватную директорию постоянного реестра на надежном однохостовом хранилище. expectedPriceMillicents должно быть равно только что полученному максимуму, однако дебет classify пока не может атомарно обеспечить соблюдение этого значения.
const integration = new SendReputeBrevo({
sendreputeApiKey: process.env.SENDREPUTE_API_KEY,
brevoApiKey: process.env.BREVO_API_KEY,
paidConsent: false,
expectedPriceMillicents: approvedMaximum,
ledgerDirectory: "/var/lib/my-app/sendrepute-brevo",
});
3. Осознанное использование
Вызывайте send только из контролируемого серверного пути, который должен как классифицировать, так и доставлять сообщения. Повторно используйте один стабильный sendKey для каждой попытки отправки одного и того же письма. Предоставляйте фиксированный встроенный контент; не используйте Brevo template IDs, изменяемые параметры, планирование или версии сообщений. Отправки, выполненные в других местах, полностью обходят эту оболочку.
await integration.send({
sendKey: durableBusinessEventId,
message: {
sender: { name: "Example Shop", email: "orders@example.com" },
to: [{ email: recipient }],
subject,
textContent,
htmlContent,
},
});
Результаты, отказы и лимиты
Результат Inbox в рамках порогового значения разрешает один запрос Brevo transactional API для того же неизменяемого снимка. Состояние реестра меняется на delivery-unknown перед отправкой провайдеру. Timeouts, разъединения, некорректные ответы об успехе, сбои и отказы провайдера никогда не повторяются автоматически; сверяйте их с записями Brevo перед принятием ручного решения.
Контролируемый цикл отправки BigMailer
0.1.0
Неопубликованная локальная обертка Node.js 24+ для явных вызовов BigMailer transactional API. Она не устанавливается в BigMailer и не перехватывает отправки из панели управления или несвязанные вызовы API. Поскольку BigMailer владеет удаленно редактируемым контентом кампаний, обертка не может подтвердить, что кампания осталась идентичной предоставленному вызывающей стороной снимку рендеринга (render snapshot) в промежутке между проверкой и доставкой.
Параметры enabled, согласие на платный анализ и подтверждение ограничения удаленного шаблона по умолчанию отключены. Вызывающая сторона должна предоставить и хешировать полный снимок рендеринга (render snapshot), операционно заморозить соответствующую удаленную кампанию и предоставить постоянный deliveryKey. Стоимость перепроверяется перед классификацией, однако текущий API классификации не имеет атомарного поля expected-price. Дублирующиеся, заблокированные, отклоненные и неоднозначные статусы доставки никогда не отправляются повторно автоматически.
Скачать экспериментальный ZIP-архив с исходным кодом BigMailer
1. Установка
Распакуйте этот неопубликованный исходный ZIP-архив в контролируемое серверное приложение Node.js 24+ и изучите README.md и SECURITY.md. Импортируйте обертку и хранилище доставки файлов напрямую из src. Это не установка из npm или маркетплейса BigMailer, данное решение не имеет сторонних зависимостей времени выполнения.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-bigmailer.zip
unzip sendrepute-bigmailer.zip
cd sendrepute-bigmailer
node --check src/index.mjs
node --check src/file-delivery-store.mjs
2. Безопасная настройка
Оставляйте значения enabled, paidConsent и remoteTemplateSnapshotLimitationAcknowledged в состоянии false до завершения проверки. Храните API ключи, UUID бренда и кампании только на стороне сервера. Разместите FileDeliveryStore в частном отказоустойчивом хранилище. Скопируйте проверенные цены в expectedPricing, учитывая, что текущий classify API не может атомарно заблокировать их.
const integration = createBigMailerIntegration({
enabled: false,
paidConsent: false,
remoteTemplateSnapshotLimitationAcknowledged: false,
sendReputeApiKey: process.env.SENDREPUTE_API_KEY,
bigMailerApiKey: process.env.BIGMAILER_API_KEY,
brandId,
campaignId,
expectedPricing,
deliveryStore: new FileDeliveryStore("/var/lib/my-app/bigmailer-deliveries.json"),
});
3. Осознанное использование
Для каждой контролируемой отправки через API предоставьте один стабильный deliveryKey, все отображаемые текстовые альтернативы text/plain и text/html, точный снимок рендеринга и snapshotDigest(snapshot). Подтвердите ограничение удаленного шаблона только в том случае, если операционный контроль замораживает версию кампании BigMailer, соответствующую этому снимку. Отправки через Dashboard и несвязанные API-вызовы обходят этот оберточный компонент.
await integration.send({
deliveryKey: durableBusinessEventId,
snapshot,
snapshotSha256: snapshotDigest(snapshot),
email: recipient,
variables,
});
Результаты, отказы и лимиты
FileDeliveryStore резервирует ключ доставки перед классификацией. Результаты с дублированием, конфликтом, блокировкой, отклонением и неоднозначным исходом доставки не могут быть отправлены повторно автоматически. Конечная точка отправки BigMailer принимает данные слияния, а не проверенное тело письма, поэтому успешная классификация не является доказательством того, что изменяемый контент удаленной кампании все еще совпадает; используйте другого провайдера, если требуется точное соответствие.
Конфиденциальность и платные операции
При анализе в SendRepute передаются отображаемое имя отправителя, тема и текст сообщения. Получатели и вложения не передаются отдельно, однако содержимое, включенное в текст сообщения, передается. Храните учетные данные в секрете и отключите логирование запросов/тела сообщений. Гарантии доставки или попадания во «Входящие» отсутствуют.
Классификация является платной. Ознакомьтесь с текущими ценами и лимитами расходов вашего аккаунта перед предоставлением согласия. Идентичный запрос (аккаунт/контент/модель) может повторно выдать квитанцию в течение 24 часов; изменение контента или модели может привести к новым расходам. Не считайте, что повторная попытка бесплатна. Переписывание с помощью ИИ требует квоты с максимальной стоимостью для выбранной родительской квитанции, режима и условий перед платной отправкой; опрашивайте статус квитанции в процессе и восстанавливайте завершенные результаты по исходному ID запроса вместо создания нового. Функция «Переписать все» позволяет проверить один точный финальный вариант черновика без списания средств. Генерация шаблонов ИИ и нативный VIP-доступ оплачиваются отдельно; стандартная обработка конструктором бесплатна. Результаты анализа, переписывания или конструктора не гарантируют доставку, попадание во входящие или соответствие правилам.
Автономная проверка не является сертификацией каждой версии фреймворка, плагина или транспорта. Прочтите прилагаемые инструкции по установке и безопасности, держите платный анализ отключенным до намеренной настройки и протестируйте выбранную политику отказов перед ее включением для критически важной почты.
Ознакомиться с ценами
Справочник API для клиентов
Обратиться в службу поддержки интеграции