Інтеграції робочих процесів електронної пошти та SDK
Досліджуйте API та інтеграції SendRepute для аналізу електронної пошти, окремо оплачуваних інструментів перефразування за допомогою ШІ та засобів дизайну. Центральні кінцеві точки аналізу, перефразування та конструктора не надсилають електронні листи; навмисно активовані доставки Campaigns та певні адаптери провайдерів можуть здійснювати надсилання за допомогою вашого налаштованого провайдера. Жоден результат не гарантує потрапляння у «Вхідні».
Пакет Node.js доступний на npm. Інші інтеграції можна завантажити тут або встановити з перевіреного публічного репозиторію GitHub. Виберіть інтеграцію, дотримуйтесь відповідної інструкції та перегляньте дозволи, поточні ціни та параметри обробки помилок перед її ввімкненням.
Зберігайте свій поточний робочий процес електронної пошти. Ці приклади центрального 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 або переписування повідомлень. Консультативний режим дозволяє доставку; режим блокування застосовує поріг ймовірності. Політика відмови API налаштовується окремо. Плагіни, що обходять wp_mail, не охоплюються; подальші зміни транспорту не аналізуються. Блокування не ставить повідомлення в чергу.
Аналіз вимкнено за замовчуванням. Налаштуйте обмежений токен клієнта, запустіть безкоштовну перевірку з'єднання, ознайомтеся з цінами та надайте чітку згоду перед увімкненням платного аналізу. Ручні дії ШІ потребують окремого підтвердження.
Завантажити WordPress ZIP
Публічний репозиторій вихідного коду
Повний README та приклади
Нотатки про безпеку та відомі обмеження
1. Встановлення
Виконайте ці команди з каталогу WordPress за допомогою доступного WP-CLI або завантажте завантажений ZIP-архів через Плагіни > Додати новий > Завантажити плагін і активуйте його. Відкрийте Параметри > SendRepute. Налаштуйте та активуйте кожен сайт окремо в мережі multisite. Використовуйте підтримувану комбінацію WordPress/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. Безпечне налаштування
Створіть клієнтський токен на стороні сервера з дозволами classify, account:read та catalog:read, терміном дії та лімітами витрат. Введіть його в налаштуваннях або завантажте SENDREPUTE_API_TOKEN з вашого сховища секретів сервера, як показано. Збережені токени використовують автентифіковане шифрування з солями WordPress та OpenSSL; введіть їх повторно після ротації солей. Запустіть безкоштовну перевірку з'єднання, перегляньте ціни на класифікацію, а потім явно увімкніть автоматичний аналіз. Встановіть консультативний/блокуючий режим, поріг та незалежну політику 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, а потім дозволяє або блокує існуючий транспорт. Вкажіть власного авторизованого одержувача; спочатку протестуйте на локальному поштовому приймачі без ретрансляції. Негативний результат означає, що сторона, яка викликає, повинна обробити відхилене надсилання — воно не ставиться в чергу.
// 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. Результати є екранованим текстом тільки для копіювання: вони ніколи не застосовуються і не надсилаються автоматично. Існуючі токени не отримують дозволи автоматично.
Результати, помилки та ліміти
Рекомендаційний режим дозволяє доставку; режим блокування порівнює кінцеву ймовірність спаму з вашим порогом. Тайм-аути API та збої слідують окремій політиці відмов, а не мітці спаму. Непрозорі локальні блокування пригнічують повторний аналіз на 24 години; невідомі мережеві результати не повторюються автоматично. Самі відправлення не дедуплікуються. Перевірки встановлених оновлень охоплювали відстежуваний 0.1.0 ZIP, оновлений до 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 має власний перемикач адміністратора та точний вибір вбудованих типів електронної пошти, які за замовчуванням вимкнені. Глобальні елементи керування аналізом та згодою на оплату також мають бути увімкнені. Невибрані типи та типи, визначені розширеннями, обходять аналіз. Кожен вибраний вбудований тип customer_* захищений і має лише рекомендаційний характер: він може бути проаналізований, але ніколи не блокується. Вибрана пошта multipart не проходить класифікацію перед будь-яким платним запитом; консультативний режим або 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. Безпечне налаштування
Використовуйте токен customer з обмеженою областю дії із секретів сервера або зашифрованих налаштувань 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 політиці рекомендаційного режиму, порогу та політиці відмов, за винятком того, що кожен тип customer_* є захищеним і працює лише в рекомендаційному режимі. Захищена пошта клієнтів завжди продовжує надсилання після результату з високим ризиком, збою API або виявлення непідтримуваного вмісту. WooCommerce створює багатокомпонентні альтернативи після pre_wp_mail, тому вибрана багатокомпонентна пошта видає помилку перед будь-яким платним запитом замість того, щоб бути частково класифікованою; тільки вибрана незахищена пошта може бути відхилена політикою fail-closed. Контекст зворотного виклику видаляється після успіху, відмови та вкладених відправлень.
Поштовий бекенд Drupal
0.1.0
Потрібна версія Drupal 10.3+ або 11.x та PHP 8.1+. Встановіть ZIP-архів як модуль, надайте дозвіл administer sendrepute лише довіреним адміністраторам, налаштуйте обмежене неадресне відображуване ім'я відправника та виберіть точні маршрути пошти для модуля/ключа. Версія 0.1.0 підтримує лише Drupal core php_mail; це Mail бекенд, а не провайдер чи транспорт на заміну. Підтверджена працездатність охоплює точні релізи Drupal 10.6.17 та 11.4.7 з PHP 8.4.10.
Згода на оплату та кожен маршрут вимкнені за замовчуванням. Кожен точний маршрут використовує фіксований делегат php_mail ядра, консультативний режим або режим блокування, незалежну політику відмови збереження (preserve) або блокування (block), поріг та усвідомлений вибір критичної пошти. Пошта облікових записів та безпеки залишається доставленою, якщо цей точний маршрут явно не дозволяє критичне блокування. Той самий екземпляр php_mail форматує та надсилає одне скалярне фінальне тіло; multipart та вивід з вкладеннями не підтримуються.
Завантажити 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, поріг та критичність 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. Інші ідентифікатори делегатів відхиляються. Він не використовує hook_mail_alter і не переписує повідомлення.
Результати, помилки та ліміти
Підтверджений успіх блокує лише на рівні або вище налаштованого порогу в режимі блокування. Повний вкладений результат класифікації та відповідь білінгу перевіряються до того, як spamProbability зможе вплинути на доставку. Помилки API, автентифікації, балансу, обмеження швидкості, некоректні формати, багатокомпонентні дані, індикатори вкладень та розміру слідують незалежній політиці відмов маршруту, за винятком захищеної критичної пошти, яка продовжує відправку. Матриця встановлених 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-архів у Модулі > Менеджер модулів, після чого налаштуйте класифікацію пошти SendRepute. Усі чотири офіційні попередньо зібрані classic релізи пройшли перевірку ізольованого встановлення, автентифікованого налаштування адміністратором та оновлення через ZIP; їх незмінені реалізації Mail::send() також пройшли офлайн-матрицю реальної пошти. PrestaShop 8, 9.1+ та пізніші неперелічені патчі 9.0 не підтримуються.
Модуль, згода на оплату/вміст та точний вибір шаблону вимкнені за замовчуванням. Він аналізує остаточно згенеровану тему та кожен підтримуваний відображуваний текст без повторного збирання повідомлення Symfony. Повідомлення, що містить як text/plain, так і text/html, надсилається в одному обмеженому запиті на класифікацію: текстова альтернатива стає інертною, оригінальний HTML зберігається, а сервіс аналізує кожну типізовану альтернативу незалежно без об'єднання. Результат використовує найвищий ризик із повними аудитами вмісту, створює одну платну класифікацію та ніколи не повертає частковий бал безпеки. Консультативний режим ніколи не перериває відправлення. Блокування за порогом та 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 на канонічний продакшн-хост SendRepute HTTPS, наданий для цього модуля, а 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. Матриця підтримуваних релізів перевірила випромінювану багатокомпонентну структуру, а також хеш тіла DKIM і підпис RSA після класифікації. Закріплений шлях підпису PrestaShop пропускає Bcc з підготовлених підписаних заголовків і втрачає цього прихованого одержувача SMTP; тому докази валідності підпису не підтверджують сумісність доставки Bcc. Не поєднуйте DKIM та Bcc на цьому підтримуваному шляху. Непідтримувані джерела відображення, активна семантика, неоднозначний quoted-printable або base64 HTML, а також надмірний сукупний вміст підпорядковуються налаштованій політиці відмов перед оплатою. Залишайте критичні шаблони невибраними, якщо вони не схвалені навмисно.
Результати, помилки та ліміти
Класифікатор приймає одне тіло text/plain, одне тіло text/html або обидва як незалежно проаналізовані альтернативи відображення. Буквальний текст, сутності, прихований контент та стилі в прийнятій альтернативі не можуть поглинути або приховати наступну альтернативу; неоднозначний quoted-printable або base64 HTML відхиляється перед оплатою. Будь-яка прийнята альтернатива може визначити результат з найвищим ризиком, тоді як аудит вмісту охоплює кожну альтернативу; класифікація оплачується лише один раз після прийняття повного обмеженого вводу. Необхідне застаріле тіло точно дублює інертну текстову альтернативу для подвійного повідомлення, і цей дублікат разом з обома типізованими альтернативами поділяють точний бюджет запиту у 524288 байт. Отримувачі, вкладення та вбудовані ресурси виключаються, а оригінальне транспортне повідомлення перед підписом зберігається. Фікстура реальної пошти окремо перевіряє цілісність 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 у папку для збережених пакетів, зареєструйте цю директорію як репозиторій Composer path, здійсніть require версії 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. Свідоме використання
Додайте точний заголовок opt-in лише до перевірених некритичних об'єктів Email, а потім продовжуйте через звичайний Mailer. Повідомлення, конверт, транспорт та заголовок не перезаписуються. Для доставки через Messenger налаштуйте бандл у workers: події клонування producer навмисно не класифікуються.
$email->getHeaders()->addTextHeader('X-SendRepute-Classify', 'yes');
$mailer->send($email);
Результати, помилки та ліміти
Підтримується рівно одне тіло text/plain або text/html у пам'яті. Змішані альтернативи, текстові DataParts, потоки або шляхи, фігурні дужки CSS, розмітка, синтаксис quoted-printable, заголовки base64 або Content-Transfer-Encoding: base64 для всього тіла завершуються помилкою до оплати та слідують політиці відмов; звичайний контент без фігурних дужок не змінюється. Кожне обов'язкове вкладене поле відповіді та необов'язкова гілка contentAudit перевіряються, а невідомі властивості відхиляються. Дорадчий режим ніколи не блокує за оцінкою; блокування відхиляє на рівні порогу через реальну подію транспорту.
Адаптер Rails Action Mailer
0.1.0
Потрібна версія Ruby 3.2+; адаптер пройшов вузьку перевірку з реальною Action Mailer 7.1.6 та Mail 2.9.1; шлях зворотного виклику (callback) також спостерігався в Action Mailer 7.2.3.2. Це не є сертифікацією кожного дозволеного релізу Rails 7.x. Встановіть локальний ZIP з кодом через Bundler; публікація в RubyGems не заявляється.
Обидва глобальні платні шлюзи вимкнені за замовчуванням, і кожна дія контролера mailer повинна явно викликати sendrepute_paid_preflight!. Поведінка рекомендаційного/блокуючого бала та поведінка при збої (збереження або блокування) є незалежними. Маршрути для скидання пароля, MFA, входу, верифікації, виставлення рахунків та безпеки повинні залишатися невибраними. Кожне повідомлення з частин (multipart) та неоднозначний вміст CSS, quoted-printable або такий, що схожий на base64, відхиляються до оплати; один прийнятий декодований текстовий або HTML-текст аналізується без зміни вихідного повідомлення чи транспорту.
Завантажити вихідний код Rails у ZIP
Публічний репозиторій вихідного коду
Повний 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 або іншого секрету сервера. Налаштовуйте консультативний/блокуючий режими, збереження/блокування та поріг незалежно; зворотні виклики 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! лише всередині кожної свідомо обраної некритичної дії мейлера. Звичайні дії оминають класифікацію. Платний хук використовує маршрут Action Mailer before_deliver; автоматичне глобальне підключення не надається, і адаптер не переписує 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 або неоднозначні вхідні дані нормалізатора зазнають невдачі перед оплатою та дотримуються політики відмов. Повна типізована вкладена відповідь може блокувати лише в режимі блокування при досягненні або перевищенні порогового значення; консультативний режим зберігає кожен показник. Зворотні виклики результату та помилки отримують незмінні безпечні дані, а винятки зворотних викликів або throw(:abort) перехоплюються локально, тому вони не можуть перервати консультативний режим або зберегти доставку. Фіксована кінцева точка відмовляє в перенаправленнях і повторних спробах та використовує обмежений загальний дедлайн. Тести на реальному 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-альтернативи інертно скомпоновані разом; непідтримуваний, вкладений, підписаний, зашифрований або неоднозначний контент викличе помилку до здійснення оплати.
Завантажити ZIP з вихідним кодом Spring Java
Публічний репозиторій вихідного коду
Повний 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, доки не будуть переглянуті ціни та обрані виклики. Дорадчий/блокуючий режими, поріг та політика відмов дозволити/блокувати є незалежними. Кінцева точка зафіксована на перевіреному 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 аналізує на межі кінцевого транспорту без перебудови повідомлення. Політики порогових значень advisory/block та політики дій у разі помилки 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 перед викликом того самого транспорту. Стан Builder очищується у блоці finally, а кореляції builder/message використовують записи 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 не заявляється.
Адаптер та платна згода вимкнені за замовчуванням; advisory та preserve-send є незалежними параметрами за замовчуванням. Виклики AnalyzeAsync, AnalyzeThenSend або AnalyzeThenSendAsync є явними. Критично важливі листи безпеки/акаунта потребують окремої категорії та згоди для кожного виклику. Кожна підтримувана відображувана plain/HTML альтернатива інертно компонується в один обмежений запит; непідтримуваний, вкладений, підписаний або зашифрований вміст викликає помилку до моменту оплати. Оригінальний MimeMessage та токен скасування надходять до існуючого транспорту лише після дозволу політики.
Завантажити вихідний ZIP для .NET MailKit
Публічний репозиторій вихідного коду
Повний 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 та категорію повідомлення для кожної обраної операції; критично важлива пошта безпеки/акаунтів вимагає окремого налаштування critical-consent.
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 для відображення paid analysis рівно трьох вибраних власником рядків чернетки. Це не застосунок SendRepute для Zapier, позиція в маркетплейсі, артефакт імпорту, pre-send adapter, відправник, allow/block route або whole-message classifier. Zapier Webhooks використовує обмежений HTTPS проксі, керований власником, оскільки токен SENDREPUTE_API_TOKEN не повинен потрапляти в Zap.
Дві константи часу компіляції за замовчуванням false перед HTTP. Zap відображає лише ім'я відправника, тему та тіло листа, надсилає JSON до включеного дизайну owner-proxy, повністю валідує вкладену відповідь, а потім відображає консультативні та білінгові поля на етапі приватного перегляду. Він не повинен додавати відправника, Paths enforcement, Autoreplay або failure-preserve route; невдалі кроки Code або Webhook зупиняються.
Завантажити Zapier та Make recipe ZIP
Публічний репозиторій вихідного коду
Повний README та приклади
Нотатки про безпеку та відомі обмеження
1. Встановлення
Завантажте та розпакуйте спільний вихідний код рецепта 0.2.0. Прочитайте доданий посібник Zapier та розгорніть доданий проксі-сервер loopback Node лише за керованим власником HTTPS reverse proxy. Цей пакет не розгортає його. Не існує застосунку 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. Редактори та історія завдань можуть розкрити його, тому обмежуйте, змінюйте та відкликайте його. Налаштуйте ліміти токенів (token-bucket) та паралелізму для кожного облікового запису, глобальні обмеження з'єднань/паралелізму, встановлений власником постійний денний бюджет платних викликів, обмежувальні ліміти витрат на рівні upstream, а також відповідні елементи керування розміром/швидкістю/термінами на термінаторі TLS. Не вмикайте Autoreplay.
// In zapier/preflight.js; review charges before changing either literal.
const ENABLED = false;
const PAID_CONSENT = false;
3. Свідоме використання
Створіть кроки вручну: чернетка тригера; зіставлення у Code для preflight лише відправника, теми та тіла; Webhooks POST із JSON-рядками до проксі власника; Code для валідації відповіді; приватне відображення для перегляду. Ніколи не вставляйте сирий JSON вручну. Відображайте лише requestId, model, label, spamProbability та білінг; не додавайте дію mail або рішення Paths.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Результати, помилки та ліміти
Рецепт аналізує лише три зіставлені рядки; незіставлені MIME, альтернативи HTML, вкладення та кінцевий вихідний контент залишаються неаналізованими. Консервативний preflight відхиляє відомі тригери нормалізатора, але не гарантує охоплення всього повідомлення. Ліміти швидкості, паралелізму та денного бюджету проксі відхиляють запити до рівня upstream, а резервування бюджету зберігається до платної спроби; запускайте один процес проксі на один файл бюджету. Проксі виконує одну обмежену спробу через фіксований HTTPS. Будь-яка не-200 або неповна точна відповідь викликає виняток і зупинку; результати не зберігаються, Resume або заміна результату відсутні.
Створити ручний аналіз чернетки
0.2.0
Інструкції для ручного сценарію Make для відображення paid analysis рівно трьох вибраних рядків чернетки. Це не blueprint, не схвалений застосунок SendRepute, не відправник пошти, не маршрут примусового виконання та не твердження про невідповідні MIME, HTML, вкладення або кінцевий вихідний вміст. Bearer token належить виключно до безпечного keychain 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-секундний timeout і не додавайте жодних повторювачів або автоматичних повторів. Вимагайте ліміт відповіді модуля в 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-ключ та явну базову API URL у вашому серверному середовищі, ніколи не в коді браузера.
Зареєструйте createSendReputePlugin на етапі потоку лише після перегляду ціноутворення та навмисного увімкнення згоди на платний аналіз. Консультативний режим повідомляє про результати без блокування доставки. Режим блокування застосовує spamProbabilityThreshold; onApiFailure вибирає allow або block, тоді як відмова через зміну ціни завжди блокує доставку. Класифікація є платною операцією API.
Завантажити Node.js tarball
Публічний репозиторій вихідного коду
Повний README та приклади
Нотатки про безпеку та відомі обмеження
Переглянути перевірений пакет npm
1. Встановлення
Верифікований пакет npm — @sendrepute/node версії 0.1.1; закріплюйте інсталяції з реєстру на @sendrepute/node@0.1.1. Архів tarball з вебсайту та закріплений публічний репозиторій надають сирцевий код та збірку релізу 0.1.1. Nodemailer є необов'язковим і потрібен лише для адаптера транспорту. SDK підтримує типізовані клієнтські API-запити для account, catalog, classification, AI та builders. Використовуйте його на сервері 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 },
});
}
Що ще він може робити?
Згенеровані ідентифікатори операцій охоплюють читання облікового запису та цін, класифікацію та ручне редагування, переписування за допомогою ШІ / генерацію шаблонів, VIP-плани/статус/покупки, нативні шаблони/права доступу, а також стандартний/нативний імпорт/експорт без збереження стану. Зверніться до прикладів вихідного коду та довідника клієнтського API для кожного типу запиту, необхідної області доступу та поточної ціни. Читання каталогу не є купівлею доступу. Нові платні можливості вимагають токенів з явно визначеними межами доступу та явного підтвердження в інтерфейсі користувача.
Результати, помилки та ліміти
SendReputeError надає доступ до status, code та requestId; зберігайте лише ці безпечні операційні метадані. Ніколи не реєструйте тіла запитів, промпти, заголовки або повні відповіді. AbortSignal скасовує роботу; timeoutMs застосовується до кожної спроби. Обмежені повторні спроби залежать від типу операції, а захист квитанцій обмежений у часі, що не є ідентичним необмеженій тарифікації exactly-once. Консультативний режим 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 розрізняють недійсну policy/message, непідтримуваний контент, блокування спаму та блокування через помилки API. Опублікований пакет npm 0.1.1 та завантаження з вебсайту 0.1.1 об'єднують усі відображені в пам'яті альтернативи text/plain та text/html в один обмежений запит на класифікацію; у режимі блокування вони відхиляють непідтримувані відображені альтернативи. Raw повідомлення, потоки, шляхи та 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, тип повернення, область доступу та задокументовані статуси HTTP. Посилання на схему відкриває повні параметри, поля відповіді та приклади в довіднику API клієнта. Ці обгортки використовують налаштований вище клієнт; потрібне підтвердження, нічого не виконується автоматично. Операції читання не авторизують покупки. Мутації, платежі, закриття доступу та платний ШІ потребують відповідної навмисної дії в обліковому записі.
Отримати ціну для аналізу одного агрегату аналітики кампанії
POST /v1/campaign-insights/quote
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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}
Необхідна область доступу: 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 /v1/payments/methods
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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 });
}
Отримати статус VIP
GET /v1/vip
Необхідна область доступу: 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 });
}
Придбати статус VIP
POST /v1/vip/purchase
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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 });
}
Перевірити одну точну візуалізовану фінальну чернетку за наявною квитанцією про оплату «Переписати все» без повторного списання
POST /v1/rewrite/finalize
Необхідна область доступу: 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}
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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}
Необхідна область доступу: 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}
Необхідна область доступу: 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
Необхідна область доступу: 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}
Необхідна область доступу: 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}
Необхідна область доступу: 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}
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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-архів з трьома варіантами HTML без надсилання
POST /v1/vip/email-builder/export
Необхідна область доступу: 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
Необхідна область доступу: 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
Необхідна область доступу: 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}
Необхідна область доступу: 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
Необхідна область доступу: 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}
Необхідна область доступу: 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 });
}
Вузол n8n із власним хостингом
0.1.0
Потрібен Node.js 20.19+ та модифікована локальна інсталяція n8n, що забезпечує n8n-workflow >=2.39.3 <3. Не встановлюйте примусово у застаріле несумісне середовище. Встановіть завантажений tarball у директорію custom-node та перезапустіть n8n. Цей неопублікований вузол недоступний через n8n Cloud або встановлення через спільноту npm-name.
Згода на платні операції вимкнена за замовчуванням. Кожен елемент зі згодою виконує один запит на класифікацію без автоматичних повторів. Результати розміщуються в просторі імен sendrepute. Використовуйте блок IF для sendrepute.allowed перед відправленням і окремо перевіряйте статус помилки. Режими Advisory та Blocking повертають чіткі рішення. Сам вузол (node) не відправляє пошту.
Завантажити tarball n8n
Публічний репозиторій вихідного коду
Повний README та приклади
Нотатки про безпеку та відомі обмеження
1. Встановлення
Запустіть на самостійно розміщеному хості n8n, потім перезапустіть сервіс n8n за допомогою вашого звичайного менеджера процесів. Підтвердьте, що SendRepute з'явився у списку вузлів. Імпортуйте витягнутий package/examples/classify-email.workflow.json з редактора n8n. Встановлення вузлів спільноти через npm-name та 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 у сховищі облікових даних 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. Закриті помилки блокують запит; відкриті помилки дозволяють його, але позначають analysisStatus як failed. Консультативні успішні результати завжди дозволяють дію незалежно від recommendation. Відмова від згоди (Consent-off) повертає not_run. Повторні спроби, одержувачі, вкладення, переписування, вибір моделі або власні кінцеві точки відсутні. Оновлений аудит вихідних залежностей не виявив проблем; це результат на поточний момент часу, а не сертифікація безпеки. Підтримуйте середовище виконання оновленим та ознайомтеся з 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. Виявлення пакетів реєструє провайдера, а vendor:publish створює config/sendrepute.php. Тримайте директорію витягнутого пакета доступною для Composer. Репозиторій артефактів — ще один варіант, описаний у 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. Потрібна точна відповідність trusted-host та перевірений HTTPS. Обидва показані перемикачі залишаються вимкненими, доки ви не ознайомитеся з цінами та не встановите їх у true явно. У config/sendrepute.php виберіть mail.mode, mail.spam_probability_threshold та mail.failure_policy незалежно. За замовчуванням встановлено advisory з дозволом при помилці (allow on failure).
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 лише до навмисно вибраних класів 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. Ця інтеграція підтримує лише класифікацію, а не адміністрування облікового запису, платежі, builders або переписування за допомогою ШІ.
Результати, помилки та ліміти
ClassificationResult містить перевірений результат та дані про білінг. Хук MessageSending повертає false для скасування заблокованого повідомлення; скасування не є помилкою SMTP або подією MessageSent. ClassificationOutcome повідомляє лише про дію, оцінку та очищені метадані помилок, ніколи не передаючи зміст повідомлення. Політика відмов охоплює некоректні вхідні дані/відповіді, автентифікацію, баланс, ліміти запитів та проблеми з транспортом. Повторні спроби або черги не додаються. Обов'язковою є наявність імені відправника та тіла у форматі text/plain або text/html в пам'яті.
Передпольотна перевірка чернетки Mautic
0.1.0
Призначено для однонодових інсталяцій Mautic 5.x з PHP 8.1+ та ext-curl. Mautic 4, Mautic 6 та багатонодові кластери не підтримуються. Розпакуйте SendReputeBundle у вашу директорію плагінів, оновіть список плагінів та очистьте кеш згідно з інструкціями у 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+. Розпакуйте архів із вихідним кодом та встановіть його каталог за допомогою pip. Універсальний серверний клієнт використовує стандартну бібліотеку; Django є необов'язковою залежністю для явного бекенда електронної пошти. Цей пакет не опублікований на PyPI.
Платна згода за замовчуванням вимкнена. Обгортка Django зберігає оригінальні об'єкти транспорту та повідомлень. Вона аналізує один обмежений рядок, що поєднує основний вміст та альтернативні варіанти text/plain і text/html, без вкладень. Режим блокування відхиляє непідтримуваний або надмірно великий відображуваний контент. Помилки автентифікації призводять до блокування за замовчуванням навіть за наявності allow policy; обирайте поведінку для 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, без перенаправлень і без повторних спроб. Згода клієнта за замовчуванням вимкнена; приклад надає згоду на кожен виклик лише після перевірки підтвердження. Перевизначення кінцевої точки потребує явного списку дозволених джерел 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 лише після ознайомлення з цінами. Консультативний режим дозволяє успішний аналіз; блокування порівнюється з SENDREPUTE_SPAM_THRESHOLD. Свідомо оберіть політику дій при незалежних збоях. Помилки автентифікації блокують за замовчуванням навіть у режимі дозволу. Приклад відповідає стандартним налаштуванням 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, builder, rewrite або методів оплати.
Результати, помилки та ліміти
Блокування відхиляє непідтримуваний або завеликий відображуваний вміст замість аналізу лише безпечної підмножини. Помилки автентифікації потребують окремого явного перевизначення для дозволу. Інші помилки відповідають обраній політиці дозволу/блокування; fail_silently визначає, чи будуть помилки блокування викликати виключення, чи ігноруватися. Обгортка не ставить у чергу, не повторює спроби, не змінює транспорти, не перевіряє вкладення та не рендерить шаблони. Універсальний клієнт викликає очищені підкласи SendReputeError з параметрами code/status/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 залишаються помилками, а не оцінками спаму. Методи для акаунтів, платежів, builder або rewrite відсутні.
Результати, помилки та ліміти
Один виклик виконує щонайбільше одну платну спробу HTTP без повторів. Помилки розкривають безпечну категорію, обмежений код/request ID та статус, ніколи не розкриваючи облікові дані, тексти повідомлень або деталі мережі. Тривалість контексту, розміри запитів і відповідей обмежені; некоректні відповіді відхиляються, а не перетворюються на бали. Клієнт не має можливостей парсингу MIME, рендерингу, роботи з одержувачами, вкладеннями, чергами, конструкторами, перезаписом або SMTP. Вибирайте модель явно лише за потреби; інакше застосовується значення за замовчуванням для облікового запису.
listmonk HTTP Messenger
0.1.0
Неопублікований пакет локального коду для Node.js 20+, орієнтований на інтерфейс Custom HTTP Messenger у listmonk 6.2.0. Цей зовнішній сервіс керує подальшою доставкою SMTP після класифікації; він не є вбудованим плагіном або SMTP preflight-проксі. Верифікація ізольована та офлайнова, це не встановлене розгортання listmonk або реальний тест SMTP-провайдера.
Обидва перемикачі paid типово вимкнені. Messenger приймає одне повністю сформоване тіло повідомлення, відхиляє вкладення, перевіряє fresh pricing і вимагає суворого результату 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 лише у секретах сервера. Завершуйте 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, оберіть нуль повторів і виберіть її лише для кампаній, які мають бути перевірені та доставлені. Не вибирайте додатково 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.
Результати, помилки та ліміти
Доставлений дублікат повертає успіх без повторної класифікації чи відправки. Будь-яка квитанція зі статусом blocked, failed, inspecting, sending або uncertain відхиляє повторну відправку. Після невизначеного SMTP-результату узгодьте логи провайдера та контекст 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 mailer, а не лише до маршрутів з назвою Mailcoach. Він аналізує вже відрендерені альтернативи Symfony Email і може скасувати transport. Режим Fail-closed встановлено за замовчуванням; дозвіл на помилки аналізу є окремою свідомою політикою.
Завантажити експериментальний ZIP-архів з вихідним кодом Mailcoach
1. Встановлення
Помістіть завантажений неопублікований ZIP-архів у приватний каталог артефактів Composer, доступний для ліцензованого застосунку Mailcoach. Зареєструйте цей локальний репозиторій артефактів, додайте залежність для гілки 0.1, зафіксуйте lock-файл і, за бажанням, опублікуйте конфігурацію. Це не є встановленням через 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, а не обіцяє фіксовану вартість. Налаштуйте поріг і політику відмов 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 POST /v3/smtp/email. Він не перехоплює відправлення через панель керування Brevo, кампанії, автоматизації, SMTP-реле або виклики через інші SDK. Тести контролюються та проводяться офлайн; вони не сертифікують живий обліковий запис Brevo.
Платна згода за замовчуванням вимкнена. Приймаються лише фіксовані текстові повідомлення та HTML; віддалені шаблони, параметри, заплановані відправлення, версії повідомлень та контент за посиланнями відхиляються. Точний незмінний перевірений знімок надсилається до 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, змінні параметри, розклад або версії повідомлень. Надсилання, здійснені в іншому місці, повністю обходять цю обгортку.
await integration.send({
sendKey: durableBusinessEventId,
message: {
sender: { name: "Example Shop", email: "orders@example.com" },
to: [{ email: recipient }],
subject,
textContent,
htmlContent,
},
});
Результати, помилки та ліміти
Результат Inbox у межах порогового значення дозволяє один запит Brevo transactional API для того самого незмінного snapshot. Стан реєстру змінюється на delivery-unknown перед відправленням провайдером. Тайм-аути, розриви з'єднання, некоректні успішні відповіді, збої та відмови провайдера ніколи не повторюються автоматично; узгоджуйте їх із записами Brevo перед прийняттям будь-якого рішення вручну.
Контрольований потік надсилання BigMailer
0.1.0
Неопублікована локальна обгортка для Node.js 24+ для явних викликів транзакційного API BigMailer. Вона не встановлюється в BigMailer і не перехоплює надсилання з панелі керування або непов'язані виклики API. Оскільки BigMailer володіє контентом кампаній, що редагується віддалено, обгортка не може підтвердити, що кампанія залишилася ідентичною наданому ініціатором знімку рендерингу (snapshot) між перевіркою та доставкою.
Параметр enabled, платна згода та підтвердження обмеження віддаленого шаблону вимкнені за замовчуванням. Ініціатор повинен надати та хешувати повний знімок рендерингу, операційно заморозити відповідну віддалену кампанію та надати стійкий ключ доставки. Ціноутворення перевіряється повторно перед класифікацією, проте поточний API класифікації не має атомарного поля expected-price. Дубльовані, заблоковані, відхилені та неоднозначні стани доставки ніколи не перенадсилаються автоматично.
Завантажити експериментальний вихідний код BigMailer у ZIP-архіві
1. Встановлення
Розпакуйте цей неопублікований вихідний ZIP-архів у контрольований серверний застосунок Node.js 24+ та перегляньте README.md і SECURITY.md. Імпортуйте обгортку та FileDeliveryStore безпосередньо з 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 альтернативи, точний render snapshot та snapshotDigest(snapshot). Підтверджуйте обмеження remote-template лише тоді, коли операційний контроль заморожує ревізію кампанії BigMailer, що відповідає цьому snapshot. Відправлення через Dashboard та непов'язані відправлення API оминають цю обгортку.
await integration.send({
deliveryKey: durableBusinessEventId,
snapshot,
snapshotSha256: snapshotDigest(snapshot),
email: recipient,
variables,
});
Результати, помилки та ліміти
FileDeliveryStore резервує ключ доставки перед класифікацією. Дублікати, конфлікти, блокування, відхилення та неоднозначні результати доставки не можуть бути надіслані повторно автоматично. Кінцева точка відправлення BigMailer приймає дані для злиття, а не перевірене тіло повідомлення, тому успішна класифікація не є доказом того, що змінний віддалений вміст кампанії все ще збігається; використовуйте іншого провайдера, якщо потрібне точне з'єднання.
Конфіденційність та платні операції
Аналіз надсилає ім'я відправника, тему та текст повідомлення до SendRepute. Одержувачі та вкладення не передаються окремо, але вміст, включений у тіло повідомлення, передається. Тримайте облікові дані в секреті та вимкніть логування запитів/тіла. Гарантія доставки або потрапляння в папку 'Вхідні' відсутня.
Класифікація є платною. Ознайомтеся з поточними цінами та лімітами витрат вашого облікового запису перед наданням згоди. Ідентичний запит до облікового запису/вмісту/моделі може повторно відтворити квитанцію протягом 24 годин; змінений вміст або модель можуть призвести до нових витрат. Не припускайте, що повторна спроба є безкоштовною. Переписування ШІ вимагає квоти максимальної вартості для обраної батьківської квитанції, режиму та умов перед платною відправкою; опитуйте квитанцію, що перебуває в процесі, та відновлюйте завершені результати за допомогою оригінального ID запиту замість того, щоб запускати новий. Функція «Переписати все» може перевірити одну точну остаточну візуалізовану чернетку без повторного списання коштів. Генерація шаблонів ШІ та нативний VIP-доступ оплачуються окремо; стандартна обробка в конструкторі безкоштовна. Жоден результат аналізу, переписування чи конструктора не гарантує доставку, потрапляння в папку «Вхідні» або відповідність нормативним вимогам.
Офлайн-валідація не є сертифікацією кожної версії фреймворку, плагіна чи транспорту. Прочитайте вкладені інструкції зі встановлення та безпеки, тримайте платний аналіз вимкненим до моменту навмисного налаштування та протестуйте обрану політику відмов перед її увімкненням для критично важливої пошти.
Ознайомитися з цінами
Довідник API клієнта
Зверніться до підтримки інтеграції