Intégrations de workflow d'e-mail et SDKs
Explorez les API et les intégrations SendRepute pour l'analyse d'e-mails, les réécritures par IA payées séparément et les outils de conception. Les points de terminaison centraux d'analyse, de réécriture et de constructeur n'envoient pas d'e-mails ; la distribution Campaigns délibérément activée et certains adaptateurs de fournisseurs peuvent envoyer des e-mails en utilisant votre fournisseur configuré. Aucun résultat ne garantit le placement en boîte de réception.
Le package Node.js est disponible sur npm. D'autres intégrations peuvent être téléchargées ici ou installées depuis un dépôt GitHub public vérifié. Choisissez une intégration, suivez son guide, et examinez les permissions, la tarification actuelle ainsi que les paramètres d'échec avant de l'activer.
Conservez votre flux de travail de messagerie actuel. Ces exemples d'API centraux servent uniquement à analyser, réécrire ou créer du contenu ; ils n'envoient jamais d'e-mails. Séparément, la diffusion des Campagnes délibérément activée et certains adaptateurs de fournisseurs peuvent envoyer via votre fournisseur configuré. Choisissez un outil en fonction de son installation, de sa configuration, de ses exemples et de ses limites opérationnelles. Les exemples ne s'exécutent pas sur cette page ; examinez séparément les opérations payantes et les actions d'envoi.
Extension WordPress
0.2.0
Nécessite WordPress 5.7+, PHP 7.4+ et OpenSSL. Téléchargez le ZIP via Extensions > Ajouter > Téléverser une extension, puis ouvrez Réglages > SendRepute. Configurez le jeton de chaque site et le consentement d'analyse payante séparément. Les preuves de cycle de vie installé couvrent WordPress 6.8.3 avec WooCommerce 10.4.3 ; les preuves séparées pour les extensions SMTP couvrent WordPress 7.1.2 avec WP Mail SMTP 4.9.0 et FluentSMTP 2.4.0.
Vérifie les messages via pre_wp_mail sans remplacer le SMTP ni réécrire les messages. Le mode consultatif autorise la distribution ; le mode blocage applique un seuil de probabilité. La politique en cas d'échec de l'API est configurée séparément. Les extensions contournant wp_mail ne sont pas couvertes ; les modifications de transport ultérieures ne sont pas analysées. Le blocage ne met pas les messages en file d'attente.
L'analyse est désactivée par défaut. Configurez un jeton client limité, lancez le test de connexion non payant, consultez les tarifs et consentez explicitement avant d'activer l'analyse payante. Les actions IA manuelles nécessitent une confirmation séparée.
Télécharger le ZIP WordPress
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Exécutez ces commandes depuis le répertoire WordPress avec WP-CLI disponible, ou téléchargez le ZIP via Extensions > Ajouter > Téléverser une extension et activez-la. Ouvrez Réglages > SendRepute. Configurez et activez chaque site séparément sur un multisite. Maintenez une combinaison WordPress/PHP prise en charge ; une version minimale n'est pas une recommandation pour exécuter un logiciel en fin de vie.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Configurer en toute sécurité
Créez un jeton client côté serveur avec les portées classify, account:read et catalog:read, une expiration et des plafonds de dépenses. Saisissez-le dans les réglages ou chargez SENDREPUTE_API_TOKEN depuis votre magasin de secrets serveur comme indiqué. Les jetons stockés utilisent un chiffrement authentifié avec les sels WordPress et OpenSSL ; saisissez-les à nouveau après une rotation des sels. Exécutez la vérification de connexion non payante, examinez les tarifs de classification, puis activez explicitement l'analyse automatique. Définissez le mode consultatif/blocage, le seuil et la politique indépendante 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. Utiliser délibérément
La fonction ci-dessous utilise le wp_mail normal et n'envoie que lorsque votre application l'appelle. Avec l'analyse payante activée, l'extension analyse lors du pre_wp_mail puis autorise ou bloque le transport existant. Fournissez votre propre destinataire autorisé ; testez d'abord par rapport à un récepteur de courrier local sans relais. Un résultat faux signifie que l'appelant doit gérer l'envoi rejeté — il n'est pas mis en file d'attente.
// 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.'
);
}
Qu'est-ce qu'il peut faire d'autre ?
Les réglages fournissent également des actions manuelles de réécriture par IA et de génération de modèles avec une confirmation payante distincte. L'affichage du prix nécessite vip:read ; la réécriture nécessite rewrite ; la génération nécessite ai:generate, et la génération VIP nécessite une adhésion VIP active. Les résultats sont du texte échappé en lecture seule : jamais appliqués ou envoyés automatiquement. Les jetons existants ne gagnent pas de portées automatiquement.
Résultats, échecs et limites
Advisory autorise la livraison ; le blocage compare la probabilité de spam finie à votre seuil. Les délais d'expiration et échecs de l'API suivent la politique d'échec distincte, et non une étiquette de spam. Des verrous locaux opaques suppriment les analyses répétées pendant 24 heures ; les résultats réseau inconnus ne sont pas réessayés automatiquement. Les envois eux-mêmes ne sont pas dédupliqués. Les vérifications de mise à jour installées ont couvert un ZIP 0.1.0 suivi mis à niveau vers 0.2.0, le rejet/sauvegarde de nonce administrateur et le chemin WooCommerce sélectionné. Une matrice distincte de 40 scénarios a couvert les deux ordres de chargement de plugin avec WP Mail SMTP et FluentSMTP, incluant To/Cc/Bcc, Reply-To, en-têtes, pièces jointes, rejet SMTP et résultats de politique. Ces tuples exacts ne certifient pas d'autres versions de CMS, de plugin SMTP ou de fournisseur. Les hooks qui contournent wp_mail et les modifications ultérieures du transport restent hors couverture. La désactivation préserve les paramètres ; la désinstallation supprime les identifiants même lors de la conservation des paramètres désactivés. Supprimez vous-même un jeton wp-config.
Adaptateur e-mail WooCommerce
0.2.0
Inclus dans le même ZIP SendRepute 0.2.0 que l'extension WordPress ; il n'y a pas d'extension ou de téléchargement WooCommerce séparé. Il nécessite la base WordPress 5.7+, PHP 7.4+ et OpenSSL de l'extension. L'adaptateur a fait l'objet d'une revue de code par rapport à WooCommerce 10.4.3, et n'est pas certifié sur toutes les versions de WooCommerce ou d'extensions de messagerie.
L'analyse WooCommerce possède son propre commutateur administrateur et des sélections de types d'e-mails intégrés exacts, tous désactivés par défaut. Les contrôles globaux d'analyse et de paid-consent doivent également être activés. Les types non sélectionnés et ceux définis par des extensions ignorent l'analyse. Chaque type customer_* intégré sélectionné est protégé et uniquement consultatif (advisory-only) : il peut être analysé mais n'est jamais bloqué. Les e-mails multipart sélectionnés échouent à la classification avant toute requête payante ; le mode consultatif ou l'ouverture en cas d'échec (fail-open) préserve la distribution, tandis que la fermeture en cas d'échec (fail-closed) ne bloque que les e-mails non protégés.
Télécharger le ZIP partagé WordPress et WooCommerce
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Il s'agit du même ZIP installable utilisé par le guide WordPress. Installez-le une seule fois ; n'installez pas de second add-on WooCommerce. Activez SendRepute, puis ouvrez Réglages > SendRepute. Maintenez WordPress, WooCommerce, PHP et le transport mail réel supportés et à jour.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Configurer en toute sécurité
Utilisez un jeton client restreint provenant des secrets du serveur ou du réglage WordPress chiffré. Configurez d'abord la vérification de connexion non payante partagée, la revue du prix actuel, le consentement payant global, le mode de risque, le seuil et la politique d'échec. Activez ensuite séparément l'analyse WooCommerce et sélectionnez uniquement les types d'e-mails intégrés que vous avez examinés. Les types définis par des extensions ne sont jamais sélectionnés automatiquement.
// 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. Utiliser délibérément
Continuez à envoyer via WooCommerce normalement. L'adaptateur enveloppe le rappel déjà choisi par WooCommerce et préserve ses arguments d'origine et son transport ; il ne fournit pas de nouvelle méthode send. Si un autre filtre mute les arguments du rappel, si un mail ordinaire est imbriqué pendant ce rappel, ou si un rappel personnalisé n'appelle jamais wp_mail, l'analyse est contournée de manière conservatrice plutôt que de tomber dans le chemin général payant. Testez les types non critiques sélectionnés avec un collecteur d'e-mails sans relais.
Résultats, échecs et limites
Les e-mails à partie unique sélectionnés suivent les politiques d'avis, de seuil et d'échec partagées de WordPress, sauf que chaque type customer_* est protégé et uniquement informatif. Les e-mails customer_* protégés continuent toujours après un résultat à haut risque, un échec de l'API ou un contenu non pris en charge. WooCommerce construit des alternatives multipartites après pre_wp_mail, donc les e-mails multipartites sélectionnés échouent avant toute requête payante au lieu d'être partiellement classifiés ; seuls les e-mails non protégés sélectionnés peuvent être refusés par fail-closed. Le contexte du rappel est supprimé après le succès, l'échec et les envois imbriqués.
Backend de messagerie Drupal
0.1.0
Nécessite Drupal 10.3+ ou 11.x et PHP 8.1+. Installez le ZIP en tant que module, accordez administer sendrepute uniquement aux administrateurs de confiance, configurez un nom d'affichage d'expéditeur non-adresse délimité, et sélectionnez les routes exactes de module/key mail. La version 0.1.0 supporte uniquement php_mail du cœur de Drupal ; il s'agit d'un backend Mail, pas d'un fournisseur ou d'un transport de remplacement. Les preuves sur site installé couvrent les versions exactes Drupal 10.6.17 et 11.4.7 avec PHP 8.4.10.
Le paid_analysis_consent et chaque route sont désactivés par défaut. Chaque route exacte utilise le délégué fixe core php_mail, le mode advisory ou block, une politique failure_policy indépendante preserve ou block, un seuil, et une sélection délibérée des e-mails critiques. Les e-mails de compte et de sécurité restent livrables à moins que cette route exacte n'autorise explicitement le blocage critique. La même instance php_mail formate et envoie un corps final scalaire ; les sorties multipart et contenant des pièces jointes ne sont pas prises en charge.
Télécharger le ZIP Drupal
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Exécutez depuis la racine du projet Drupal, ou téléchargez le ZIP avec l'installateur de modules de Drupal. L'archive contient une racine de module sendrepute adaptée à modules/contrib. Activez-le, accordez l'autorisation « administer sendrepute » uniquement aux administrateurs de confiance, et ouvrez Configuration > Système > SendRepute.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-drupal.zip
unzip sendrepute-drupal.zip -d modules/contrib
drush en sendrepute -y
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-drupal.git
cd sendrepute-drupal
2. Configurer en toute sécurité
Stockez un SENDREPUTE_API_TOKEN de portée classification uniquement dans l'environnement du processus web/PHP. Il n'est jamais accepté par le formulaire ni exporté dans la configuration Drupal. Dans le formulaire, saisissez un nom d'affichage de l'expéditeur obligatoire de 320 octets maximum sans adresse, chevrons ou caractères de contrôle. Ajoutez une ligne de sept champs par route exacte comme illustré ; le délégué doit être php_mail. Choisissez le mode advisory/block, la failure_policy preserve/block, le seuil, et critique yes/no. Commencez par advisory, preserve et 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. Utiliser délibérément
Continuez à appeler le gestionnaire de courrier normal de Drupal. Pour une route activée, sendrepute_mail appelle le format() du core php_mail, analyse ce corps scalaire final, applique la politique, puis appelle le mail() de la même instance php_mail mise en cache. Les autres identifiants de délégués sont rejetés. Il n'utilise pas hook_mail_alter et ne réécrit pas le message.
Résultats, échecs et limites
Un succès validé bloque uniquement au niveau ou au-dessus du seuil configuré en mode blocage. Le résultat de classification imbriqué complet et la réponse de facturation sont validés avant que spamProbability ne puisse affecter la livraison. Les échecs d'API, d'authentification, de solde, de limite de débit, de format, de multipart, d'indicateur de pièce jointe et de taille suivent la politique d'échec de route indépendante, sauf que le courrier critique protégé continue. La matrice 10.6.17/11.4.7 installée a couvert l'installation et le remplacement du ZIP sur place lorsqu'il est activé, la connexion administrateur réelle, le rejet/sauvegarde de Form API CSRF, la découverte de plugin, l'opt-in de route, la classification synthétique, la préservation du courrier critique et le php_mail du noyau via un puits local. Les vérifications de source de base couvrent également les archives immuables 10.3.0 et 11.0.0 ; aucun résultat ne certifie chaque correctif ultérieur ou expéditeur contribué. Le nom d'affichage configuré, l'objet non vide et le corps encadré par la longueur sont envoyés ; les adresses, destinataires, en-têtes, paramètres et pièces jointes sont exclus. L'objet est limité à 998 octets et le corps à 256 KiB. Il y a une tentative HTTPS vérifiée, pas de redirection, de nouvel essai ou de file d'attente.
Module de messagerie PrestaShop
0.1.1
La version 0.1.1 supporte exactement PrestaShop 9.0.0, 9.0.1, 9.0.2 et 9.0.3 avec PHP 8.1–8.4. Téléchargez le ZIP dans Modules > Gestionnaire de modules, puis configurez la classification de courrier SendRepute. Les quatre versions classiques officielles préconfigurées ont passé l'installation isolée, la configuration administrateur authentifiée et les vérifications de mise à jour ZIP ; leurs implémentations Mail::send() inchangées ont également passé la matrice de courrier réel hors ligne. PrestaShop 8, 9.1+ et les correctifs 9.0 ultérieurs non listés ne sont pas supportés.
Le module, paid_consent et la sélection exacte du modèle sont désactivés par défaut. Il analyse l'objet rendu final et chaque corps affiché pris en charge sans reconstruire le message Symfony. Un message contenant à la fois text/plain et text/html est envoyé dans une seule requête de classification délimitée : l'alternative plain est rendue inerte, le HTML original est préservé, et le service analyse chaque alternative typée indépendamment sans concaténation. Le résultat utilise le risque le plus élevé avec les audits de contenu complets (contentAudit), produit une classification payante et ne renvoie jamais de score de sécurité partiel. Advisory n'interrompt jamais l'envoi. Le blocage par seuil et le fail-closed lèvent une exception implémentant à la fois ExceptionInterface de Symfony Mailer et ModuleErrorInterface de PrestaShop ; sur chaque version prise en charge, le test installé a observé Mail::send() renvoyer false sans livraison SMTP. La politique d'échec est indépendante du seuil de risque.
Télécharger le ZIP PrestaShop
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Téléchargez le ZIP 0.1.1, puis utilisez Modules > Gestionnaire de modules > Téléverser un module et choisissez-le. Ouvrez Configurer pour la classification d'e-mails SendRepute. Ne forcez pas l'installation en dehors de la plage exacte PrestaShop 9.0.0–9.0.3 : le comportement d'annulation et de signature dépend des chemins Mail::send() audités.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-prestashop.zip
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-prestashop.git
cd sendrepute-prestashop
2. Configurer en toute sécurité
Définissez SENDREPUTE_API_BASE sur l'origine HTTPS SendRepute de production fournie pour ce module et SENDREPUTE_API_TOKEN sur un jeton serveur restreint dans l'environnement PHP-FPM/serveur. La base doit être une origine DNS HTTPS publique sans chemin ; les littéraux, identifiants, redirections et réponses DNS privées sont refusés. Exécutez la vérification de connexion compte/prix non payante, puis activez explicitement le module, le consentement payant/contenu et les noms de modèles exacts. Choisissez indépendamment advisory/block, le seuil et la politique d'échec open/closed.
export SENDREPUTE_API_BASE="replace-with-the-canonical-sendrepute-https-origin"
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
3. Utiliser délibérément
Continuez à utiliser le flux normal Mail::send de PrestaShop. Le hook initial mémorise uniquement un modèle exact ayant reçu un consentement. Le hook final lit l'objet, le corps textuel et le corps HTML déjà rendus de Symfony Email sans modifier les destinataires, les en-têtes, les pièces jointes ou le transport. Pour les corps doubles, il soumet le texte brut inerte et le HTML d'origine en tant qu'alternatives typées dans une seule requête ; la normalisation indépendante du service empêche un fragment d'en consommer un autre tout en conservant les destinations visibles des liens HTML et des images pour l'audit. Un corps simple en texte brut reste sur le chemin étroit du texte inerte, et un corps simple HTML reste sur le chemin étroit de l'extraction DOM. La classification se termine avant que PrestaShop ne crée un message distinct signé par DKIM. La matrice des versions prises en charge a vérifié la structure multipart émise ainsi que le hash du corps DKIM et la signature RSA après classification. Le chemin de signature épinglé de PrestaShop omet le Bcc des en-têtes signés préparés et perd ce destinataire SMTP invisible ; les preuves de signature valide n'établissent donc pas la compatibilité de livraison Bcc. Ne combinez pas DKIM et Bcc sur ce chemin pris en charge. Les sources d'affichage non prises en charge, la sémantique active, le HTML ambigu en quoted-printable ou base64, et le contenu agrégé surdimensionné suivent la politique d'échec configurée avant le paiement. Laissez les modèles critiques non sélectionnés, sauf approbation délibérée.
Résultats, échecs et limites
Le classificateur accepte un corps text/plain, un corps text/html ou les deux comme alternatives affichées analysées indépendamment. Le texte littéral, les entités, le contenu caché et de style dans une alternative acceptée ne peuvent pas consommer ou masquer une alternative ultérieure ; le HTML ambigu en quoted-printable ou base64 est rejeté avant le paiement à la place. Toute alternative acceptée peut déterminer le résultat au risque le plus élevé, tandis que les audits de contenu couvrent chaque alternative ; la classification n'est facturée qu'une seule fois après l'acceptation de l'entrée complète et limitée. Le corps hérité requis duplique exactement l'alternative simple inerte pour un message double, et ce duplicata ainsi que les deux alternatives typées partagent le budget de requête exact de 524288-byte. Les destinataires, les pièces jointes et les ressources intégrées sont exclus, et le message de transport original avant signature est préservé. L'appareil de test (fixture) de courrier réel vérifie séparément l'intégrité MIME/signature et les destinataires SMTP réels : les signatures DKIM restent valides après la classification, mais le chemin signé audité en amont ne préserve pas les destinataires Bcc. Une classification validée stocke un résumé consultatif limité le plus récent. Le mode bloc ne lève une exception qu'au seuil ou au-dessus ; l'exception de la double interface survit à la répartition du hook et produit false avant le transport sur les quatre versions installées. Le contenu non pris en charge, les erreurs d'API et de validation suivent open/closed indépendamment. Une tentative HTTPS utilise un DNS public épinglé, un TLS vérifié, des délais d'attente finis, une limite de réponse de 256 KiB, sans redirections ni tentatives (retry). Le blocage repose sur la capture d'exception auditée de PrestaShop Mail::send(), et non sur la valeur de retour du hook final.
Adaptateur Symfony Mailer
0.1.1
Nécessite PHP 8.1+ et cible uniquement Symfony Mailer 6.4 ou 7.4 ; les versions vérifiées exactes sont 6.4.46 et 7.4.19. Aucune compatibilité avec Symfony 8.1 ou toute version non testée n'est garantie. Installez le fichier ZIP source local via un dépôt de chemin Composer ; ce package n'est pas publié sur Packagist.
Le bundle et le consentement payant sont désactivés par défaut, et seul un message possédant l'en-tête d'opt-in configuré est éligible. La politique de score consultatif ou de blocage est indépendante de la politique d'échec d'autorisation ou de blocage. La classification s'exécute sur le MessageEvent officiel avant l'envoi ; le rejet utilise MessageEvent::reject(). Les événements clones mis en file d'attente sont ignorés afin que l'événement de transport du worker soit l'unique point de classification payante.
Télécharger le ZIP source Symfony
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Extrayez le ZIP téléchargé dans un répertoire packages conservé, enregistrez ce répertoire comme dépôt de chemin Composer, exigez le package exact 0.1.1, et enregistrez SendRepute\Symfony\SendReputeBundle si Flex ne le fait pas. L'archive source est locale et non publiée.
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
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-symfony.git
cd sendrepute-symfony
2. Configurer en toute sécurité
Résolvez SENDREPUTE_API_TOKEN à partir des secrets du serveur. Maintenez enabled et paid_analysis_consent à false pendant l'examen des tarifs actuels. Le mode, le seuil et la politique d'échec sont indépendants. Le point de terminaison est fixé sur HTTPS vérifié avec des délais limités, sans redirections ni tentatives, et une limite de réponse de 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. Utiliser délibérément
Ajoutez l'en-tête d'opt-in exact uniquement aux objets Email non critiques révisés, puis continuez via le Mailer normal. Le message, l'enveloppe, le transport et l'en-tête ne sont pas réécrits. Pour la distribution Messenger, configurez le bundle dans les workers : les événements de clonage de producteur ne sont intentionnellement pas classés.
$email->getHeaders()->addTextHeader('X-SendRepute-Classify', 'yes');
$mailer->send($email);
Résultats, échecs et limites
Exactement un corps text/plain ou text/html en mémoire est pris en charge. Les alternatives mixtes, les DataParts textuels, les flux ou les chemins, les accolades CSS, le balisage, la syntaxe quoted-printable, les en-têtes base64 ou le base64 corps entier échouent avant le paiement et suivent la politique d'échec ; le contenu ordinaire sans accolades reste inchangé. Chaque champ obligatoire de la réponse imbriquée et chaque branche d'audit facultative est validé et les propriétés inconnues sont rejetées. Le mode consultatif ne bloque jamais selon le score ; le blocage rejette au seuil via l'événement de transport réel.
Adaptateur Rails Action Mailer
0.1.0
Nécessite Ruby 3.2+ et a été strictement vérifié avec Action Mailer 7.1.6 et Mail 2.9.1 ; le chemin de rappel a également été observé sur Action Mailer 7.2.3.2. Ceci ne constitue pas une certification de toutes les versions Rails 7.x autorisées. Installez le fichier ZIP source local via Bundler ; aucune publication sur RubyGems n'est garantie.
Les deux verrous payants globaux sont désactivés par défaut, et chaque action de mailer doit appeler explicitement sendrepute_paid_preflight!. Le comportement du score consultatif/blocage et le comportement de préservation/blocage en cas d'échec sont indépendants. Les routes de réinitialisation de mot de passe, MFA, connexion, vérification, facturation et sécurité doivent rester non sélectionnées. Chaque message multipart et tout contenu ambigu de type CSS, quoted-printable ou ressemblant à base64 est rejeté avant paiement ; un corps de texte ou HTML décodé accepté est analysé sans modifier le message d'origine ou le transport.
Télécharger le ZIP source Rails
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Extrayez le ZIP exactement dans vendor/sendrepute-rails, ajoutez l'entrée de chemin local au Gemfile, exécutez Bundler dans votre environnement contrôlé et incluez SendRepute::Rails::Mailer dans ApplicationMailer. Il ne s'agit pas d'une installation RubyGems.
# Download sendrepute-rails.zip, then extract it into vendor/sendrepute-rails.
gem "sendrepute-rails", path: "vendor/sendrepute-rails"
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-rails.git
cd sendrepute-rails
2. Configurer en toute sécurité
Gardez enabled et paid_consent à false jusqu'à ce que les tarifs actuels et les routes soient révisés. Lisez le jeton à partir des identifiants Rails ou d'un autre secret de serveur. Configurez advisory/block, preserve/block et le seuil indépendamment ; les rappels on_result et on_error ne doivent pas consigner le contenu du message, les données d'autorisation ou les réponses complètes.
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. Utiliser délibérément
Appelez sendrepute_paid_preflight! uniquement à l'intérieur de chaque action de mailer non critique délibérément sélectionnée. Les actions normales contournent la classification. Le hook payant utilise la route before_deliver d'Action Mailer ; aucun auto-opt-in global n'est fourni et l'adaptateur ne réécrit pas le Mail::Message.
class ApplicationMailer < ActionMailer::Base
include SendRepute::Rails::Mailer
end
def newsletter
sendrepute_paid_preflight!
mail(to: params[:to], subject: "News")
end
Résultats, échecs et limites
Un seul corps de texte décodé au format text/plain ou text/html est pris en charge. Toute entrée de normalisation multipart ou ambiguë échoue avant le paiement et suit la failure_policy. Une réponse imbriquée typée complète peut bloquer uniquement en mode blocage égal ou supérieur au seuil ; le mode informatif préserve chaque score. Les rappels de résultat et d'erreur reçoivent des données immuables sécurisées, et les exceptions de rappel ou throw(:abort) sont interceptées localement afin qu'elles ne puissent pas interrompre le mode informatif ou préserver la livraison. Le point de terminaison fixe refuse les redirections et les tentatives de réessai, et utilise une échéance totale limitée. Tests réels Action Mailer 7.1.6 réussis : 19 exécutions et 59 assertions ; aucune requête payante ni livraison réelle n'a eu lieu.
Adaptateur Spring JavaMailSender
0.1.1
Nécessite Java 17+ et cible Spring Framework 6.2.x JavaMailSender ; la vérification exacte des dépendances a utilisé Spring Framework 6.2.19. Il n'y a aucune mention de Spring Boot 4 ou de compatibilité globale de version de framework. Compilez le ZIP source local avec Maven ; il n'est pas publié sur Maven Central ou un autre registre.
Le décorateur, le consentement payant, le mode consultatif et les valeurs par défaut d'autorisation en cas d'échec sont explicites. Seul sendWithSendRepute(...) effectue une analyse pré-envoi payante ; chaque surcharge ordinaire de send(...) contourne la classification et délègue sans modification. Utilisez send ordinaire pour le courrier critique, sauf si cet envoi individuel est délibérément sélectionné. Les alternatives MIME affichées prises en charge sont encadrées de manière inerte ; tout contenu non pris en charge, imbriqué, signé, chiffré ou ambigu échoue avant le paiement.
Télécharger le source Spring Java (ZIP)
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Extrayez le code source 0.1.1 du ZIP, exécutez mvn verify, et installez-le uniquement dans votre dépôt Maven local contrôlé. L'application cliente fournit ses propres JavaMailSender et implémentation d'envoi de courrier au moment de l'exécution. La vérification exacte des dépendances a utilisé le bytecode Java 17, Spring Framework 6.2.19 et les versions documentées dans le fichier README inclus.
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
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-java.git
cd sendrepute-java
2. Configurer en toute sécurité
Construisez SendReputeConfiguration à partir d'un jeton côté serveur et de commutateurs explicites. Maintenez enabled et paidAnalysisConsent à false jusqu'à ce que la tarification et les appels sélectionnés soient examinés. Advisory/blocking, le seuil et la politique d'échec allow/block sont indépendants. Le point de terminaison est fixé sur HTTPS vérifié sans redirection ni nouvelle tentative.
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. Utiliser délibérément
Appelez sendWithSendRepute(...) uniquement pour un SimpleMailMessage, MimeMessage ou MimeMessagePreparator individuel devant faire l'objet d'une analyse. Les surcharges unitaires et varargs sont prises en charge. Chaque surcharge send(...) normale contourne la classification. Les préparateurs sont rendus une seule fois et le MIME original préparé est délégué après autorisation par la politique.
// Paid classification is possible only on this explicit method.
reviewedSender.sendWithSendRepute(reviewedMessage);
// Every ordinary JavaMailSender send overload bypasses classification.
reviewedSender.send(criticalMessage);
Résultats, échecs et limites
Toutes les parties affichées supportées en texte brut et HTML sont analysées ; les destinataires et les pièces jointes sont exclus. Le parcours est limité à 16 niveaux, 256 parties et 524,288 octets UTF-8 affichés. Le binaire en ligne ignoré n'est jamais matérialisé ; les sources affichées paresseuses inconnues ou non limitées échouent avant l'ouverture d'un flux ou avant qu'une requête payante ne soit effectuée, et les lectures de sources supportées sont limitées. Le cadrage par entités numériques maintient les fragments inertes via l'ordre du normalisateur du serveur vérifié. Des lots entiers de varargs se préparent et se normalisent avant la première requête payante, et l'inspection ne génère pas d'en-têtes Jakarta Mail. Une réponse imbriquée récursivement exacte est requise.
Adaptateur mail pour Magento Open Source
0.1.1
Prend en charge uniquement Magento Open Source 2.4.7-p5 et 2.4.7-p6 avec les sources exactes et immuables de mail-interface révisées. Des fixtures typées hors ligne ont été validées, mais aucune installation complète de Magento n'a été effectuée ; aucune autre version de Magento ou Adobe Commerce n'est certifiée. Installez le ZIP local via un dépôt de chemin Composer ; il ne s'agit pas d'un package Adobe Marketplace.
Le module, le consentement payant et les listes de routes sont tous désactivés par défaut. Chaque identifiant de modèle nécessite deux approbations exactes indépendantes ; la criticité n'est jamais déduite de son nom. Le plugin aroundSendMessage analyse à la limite finale du transport sans reconstruire le message. Les politiques de seuil consultatif/blocage et les politiques d'échec de conservation/blocage sont indépendantes ; le blocage lève une MailException visible dans Magento. La présence de plusieurs parties MIME affichées ou d'un contenu ambigu entraîne un échec avant le paiement.
Télécharger la source ZIP pour Magento
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Extrayez le ZIP dans un répertoire de paquet conservé, enregistrez sa racine SendRepute_MailAdapter en tant que dépôt de chemin Composer, exigez la version 0.1.1, puis utilisez le processus normal de Magento pour activer le module et mettre à jour l'installation. Ne présentez pas cette archive locale comme un paquet 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
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-magento.git
cd sendrepute-magento
2. Configurer en toute sécurité
Définissez SENDREPUTE_API_TOKEN uniquement dans l'environnement serveur PHP-FPM et CLI. Dans Stores > Configuration > Services > SendRepute, maintenez le module et le consentement payant désactivés initialement. Ajoutez chaque identifiant de template exact aux deux listes indépendantes d'approbation de routage ; les noms, y compris les noms numériques, n'indiquent jamais la criticité. Configurez séparément les comportements advisory/block, le seuil et l'échec preserve/block.
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
# Then configure Stores > Configuration > Services > SendRepute.
3. Utiliser délibérément
Continuez à utiliser le flux normal de modèles et de transport de Magento. La corrélation de route enregistre l'identifiant exact et le magasin sélectionnés via TransportBuilder, tandis que le plugin final aroundSendMessage lit les interfaces officielles d'email typé et MIME avant d'appeler le même transport. L'état du constructeur est nettoyé dans le bloc finally, et les corrélations constructeur/message utilisent des entrées WeakMap à clé d'objet afin qu'un transport construit abandonné ne puisse pas laisser d'autorisation d'ID d'objet numérique réutilisable. L'adaptateur ne fournit pas de nouvelle méthode send et ne mute pas le message.
Résultats, échecs et limites
Seule une partie MIME affichée prise en charge est acceptée ; les pièces jointes sont préservées mais exclues de l'analyse. Plusieurs parties affichées, des encodages de transfert ou des jeux de caractères non pris en charge, des flux, des MIME imbriqués et des textes de normalisation ambigus échouent avant le paiement. Une requête HTTPS vérifiée a des délais et une taille de réponse limités sans nouvelle tentative ni redirection. Un résultat imbriqué valide peut bloquer au seuil ; le fail-block configuré lève une MailException Magento.
Adaptateur MailKit pour .NET
0.1.0
Nécessite .NET 8 et des preuves de dépendance exactes pour MailKit/MimeKit 4.18.0. Il s'agit d'un wrapper explicite autour d'un IMailTransport appartenant à l'application, et non d'un hook global, d'un client SMTP ou d'un transport de remplacement. Compilez ou référencez le ZIP source local ; aucune publication NuGet n'est revendiquée.
L'adaptateur et le consentement payant sont désactivés par défaut ; le mode consultatif et la conservation de l'envoi sont des paramètres par défaut indépendants. Les appels à AnalyzeAsync, AnalyzeThenSend ou AnalyzeThenSendAsync sont explicites. Le courrier critique pour la sécurité ou le compte nécessite une catégorie et un consentement distincts par appel. Chaque alternative text/plain ou text/html prise en charge est encadrée de manière inerte dans une requête limitée ; le contenu non pris en charge, imbriqué, signé ou chiffré échoue avant le paiement. Le MimeMessage original et le jeton d'annulation n'atteignent le transport existant qu'après autorisation par la politique.
Télécharger le ZIP source .NET MailKit
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Extrayez le ZIP source et référencez src/SendRepute.MailKit/SendRepute.MailKit.csproj à partir du projet .NET 8 consommateur. Restore obtient MailKit/MimeKit 4.18.0. Ce package source est local et non publié ; ce n'est pas une installation 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
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-dotnet.git
cd sendrepute-dotnet
2. Configurer en toute sécurité
Enveloppez le IMailTransport existant appartenant à l'application avec SendReputeMailAdapter. Lisez le jeton API depuis la configuration du serveur et maintenez Enabled et PaidAnalysisConsent sur false jusqu'à révision. Le seuil advisory/block et les paramètres d'échec preserve/block sont indépendants. Le point de terminaison, le plancher TLS, le comportement à une seule tentative, les délais et les limites de 1 MiB sont fixes.
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. Utiliser délibérément
Invoquez AnalyzeAsync pour l'analyse uniquement, ou AnalyzeThenSend et AnalyzeThenSendAsync pour un comportement explicite avant l'envoi. Aucun chemin de courrier ordinaire ou global n'est intercepté. Transmettez le consentement payant et la catégorie de message sur chaque opération sélectionnée ; le courrier critique de sécurité/compte nécessite le paramètre distinct critical-consent.
await adapter.AnalyzeThenSendAsync(message, new AnalysisConsent {
PaidAnalysisConsent = true,
Category = MessageCategory.Ordinary
}, cancellationToken);
Résultats, échecs et limites
Le décodage réel de MimeKit collecte chaque alternative affichée en texte brut et HTML prise en charge dans un cadre inerte tout en excluant les destinataires et les pièces jointes. Le cadrage externe non-base64 et les entités décodées tardivement neutralisent les accolades CSS, le texte quoted-printable, les en-têtes base64, le base64 du corps entier et le balisage avant la normalisation du service. Le contenu affiché non pris en charge, imbriqué, signé ou crypté échoue avant le paiement. Chaque champ de réponse requis est typé ; le flaggedTermCount optionnel doit être un entier non négatif et le contentAudit optionnel est entièrement et récursivement validé par rapport au contrat public. Le MimeMessage original exact et le jeton d'annulation atteignent le transport fourni uniquement lorsque les politiques indépendantes de score et d'échec le permettent.
Analyse manuelle de brouillons Zapier
0.2.0
Recette Zapier manuelle pour afficher l'analyse payante de précisément trois chaînes de caractères de brouillon sélectionnées par le propriétaire. Il ne s'agit pas d'une application Zapier SendRepute, d'une fiche de place de marché, d'un artefact d'importation, d'un adaptateur pré-envoi, d'un expéditeur, d'une route d'autorisation/blocage ou d'un classificateur de message complet. Zapier Webhooks utilise un proxy HTTPS borné exploité par le propriétaire car le jeton SendRepute ne doit pas entrer dans le Zap.
Deux constantes de temps de compilation sont à false par défaut avant HTTP. Le Zap mappe uniquement le nom d'affichage de l'expéditeur, le sujet et le corps, publie le JSON vers la conception de proxy du propriétaire incluse, valide complètement la réponse imbriquée, puis affiche les champs consultatifs et de facturation dans une étape de révision privée. Il ne doit pas ajouter d'expéditeur, d'application de Paths, d'Autoreplay ou de route de conservation en cas d'échec ; les étapes Code ou Webhook ayant échoué s'arrêtent.
Télécharger le ZIP de recette Zapier et Make
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Téléchargez et extrayez la source de la recette partagée 0.2.0. Lisez le guide Zapier inclus et déployez le proxy Node loopback inclus uniquement derrière un proxy inverse HTTPS géré par le propriétaire. Ce package ne le déploie pas. Il n'y a pas d'application SendRepute Zapier ni d'artéfact Zap importable.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cd sendrepute-automation-recipes
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Configurer en toute sécurité
Laissez le Zap désactivé. Dans le code source exact de preflight, ENABLED et PAID_CONSENT restent tous deux à false jusqu'à ce que l'utilisation payante soit examinée. Le proxy propriétaire stocke SENDREPUTE_API_TOKEN ; le Zap ne reçoit qu'un seul identifiant révocable séparément de SENDREPUTE_PROXY_CREDENTIALS. Les éditeurs et l'historique des tâches peuvent l'exposer, donc limitez, effectuez une rotation et révoquez-le. Configurez des limites de compartiment de jetons et de simultanéité par identifiant, des plafonds globaux de connexion/simultanéité, un budget quotidien d'appels payants persistant défini par le propriétaire, des limites de dépenses en amont restrictives et des contrôles de taille/débit/délai de terminaison TLS correspondants. N'activez pas Autoreplay.
// In zapier/preflight.js; review charges before changing either literal.
const ENABLED = false;
const PAID_CONSENT = false;
3. Utiliser délibérément
Créez les étapes manuellement : déclencheur de brouillon ; mappage Code de preflight uniquement pour l'expéditeur, l'objet et le corps ; Webhooks POST avec des lignes JSON vers le proxy du propriétaire ; Code de validation de réponse ; affichage de révision privée. N'interpolez jamais manuellement de JSON brut. Affichez uniquement requestId, model, label, spamProbability et la facturation ; n'ajoutez pas d'action de courrier ou de décision Paths.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Résultats, échecs et limites
La recette analyse uniquement les trois chaînes mappées ; le MIME non mappé, les alternatives HTML, les pièces jointes et le contenu sortant éventuel restent non analysés. Le preflight conservateur rejette les déclencheurs de normalisation connus mais ne prouve pas la couverture de l'intégralité du message. Les limites de débit, de simultanéité et de budget quotidien du proxy rejettent avant l'amont, et la réservation du budget persiste avant la tentative payante ; exécutez un processus proxy par fichier de budget. Le proxy effectue une tentative HTTPS fixe et limitée. Toute réponse exacte non-200 ou incomplète lève une exception et s'arrête ; il n'y a pas de conservation, de Resume ou de résultat de substitution.
Analyse manuelle de brouillons Make
0.2.0
Instructions de scénario Make manuel pour l'affichage de l'analyse payante de précisément trois chaînes de brouillon sélectionnées. Ce n'est pas un blueprint, une application SendRepute approuvée, un expéditeur de courrier, une route d'application ou une déclaration sur les MIME non mappés, le HTML, les pièces jointes ou le contenu sortant éventuel. Le jeton porteur (bearer token) appartient uniquement au trousseau sécurisé HTTP de Make.
Les booléens persistants enabled et paidConsent sont par défaut à false et un filtre AND s'arrête avant HTTP. Le JSON est produit par le module JSON de Make et envoyé une seule fois par le module HTTP avec les redirections et les tentatives désactivées. Un filtre de réponse est uniquement un garde d'affichage, pas une validation complète ou une permission d'envoi. Les échecs HTTP utilisent Break, jamais Resume ou une sortie de substitution.
Télécharger le ZIP des recettes Zapier et Make
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Téléchargez et extrayez la source de la recette partagée 0.2.0, puis suivez le guide Make inclus pour construire manuellement les modules natifs actuels. Aucun blueprint, application de place de marché ou format d'importation n'est revendiqué. Maintenez la planification de scénario désactivée lors des tests par rapport à un point de terminaison fictif.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cat sendrepute-automation-recipes/make/README.md
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Configurer en toute sécurité
Créez des variables Tools booléennes persistantes enabled=false et paidConsent=false, suivies d'un filtre AND exigeant que les deux soient true. Utilisez JSON > Create JSON pour exactement sender, subject et body. Stockez le jeton porteur SendRepute uniquement dans le trousseau sécurisé de l'application HTTP ; les scénarios exportés ne doivent contenir aucun identifiant.
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. Utiliser délibérément
Configurez une requête HTTP POST vers l'URL fixe classify. Sélectionnez le type de Body Raw et le contrôle de content-type application/json sans ajouter d'en-tête de texte libre conflictuel, puis mappez la sortie sérialisée via JSON > Create JSON. Activez la réponse analysée, désactivez les redirections, définissez un timeout de 10 secondes et n'ajoutez aucun répéteur ou tentative automatique. Exigez la limite de réponse de 1 MiB du module ; si elle est indisponible, utilisez à la place un proxy délimité contrôlé par le propriétaire. Ajoutez uniquement un affichage de révision privé après le Minimal display guard—jamais de routeur d'expéditeur ou d'autorisation/blocage.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Résultats, échecs et limites
Seules les chaînes mappées sont analysées ; la normalisation n'est pas une identité avec un e-mail original ou sortant. Le filtre de réponse vérifie uniquement le statut et la présence du résultat principal/facturation et n'est explicitement pas une validation ou une application complète du schéma. Les erreurs HTTP utilisent Break pour que les actions ultérieures ne s'exécutent pas ; n'utilisez jamais Resume, une sortie fabriquée ou une route préservant les échecs.
SDK Node.js
0.1.1
SDK côté serveur uniquement pour Node.js 18.17+. Installez @sendrepute/node depuis npm ou utilisez l'archive tarball téléchargeable. L'adaptateur Nodemailer optionnel préserve votre transport existant. Définissez une clé API restreinte et une URL de base d'API explicite dans votre environnement serveur, jamais dans le code du navigateur.
Enregistrez createSendReputePlugin lors de l'étape du flux uniquement après avoir examiné la tarification et activé délibérément le consentement à l'analyse payante. Le mode consultatif rapporte les résultats sans bloquer la distribution. Le mode blocage applique spamProbabilityThreshold ; onApiFailure choisit allow ou block, tandis qu'un refus pour changement de prix bloque toujours la distribution. La classification est une opération API payante.
Télécharger l'archive tarball Node.js
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
Voir le paquet npm vérifié
1. Installer
Le package npm vérifié est @sendrepute/node version 0.1.1 ; épinglez les installations du registre sur @sendrepute/node@0.1.1. L'archive tarball du site web et le dépôt public épinglé fournissent la source et la build de la version 0.1.1. Nodemailer est optionnel et n'est nécessaire que pour l'adaptateur de transport. Le SDK prend en charge les requêtes d'API client typées pour account, catalog, classification, AI et builders. Utilisez-le dans un serveur Node.js, jamais dans un bundle de navigateur.
npm install @sendrepute/node nodemailer
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
npm install @sendrepute/node@0.1.1
npm install nodemailer
2. Configurer en toute sécurité
Injectez SENDREPUTE_API_KEY depuis votre magasin de secrets serveur et définissez l'URL de base explicite ci-dessous pour l'API client hébergée. Ne collez pas de secrets dans les commandes, les fichiers sources ou les journaux. Accordez uniquement les portées requises par vos opérations. La configuration utilise un transport de rendu local, pas SMTP ; maxRetries est défini sur zéro ici pour rendre les tentatives payantes délibérées.
export SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
Configuration Nodemailer
Cet exemple configure un transport de rendu local et n'appelle pas sendMail. L'envoi via l'extension configurée effectue une analyse payante. Remplacez le transport local par votre transport SMTP existant uniquement lorsque vous êtes prêt.
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. Utiliser délibérément
Utilisez le client de la configuration ci-dessus. Lisez le compte et les tarifs actuels avant d'afficher une action de consentement. Invoquez classifyAfterConsent uniquement depuis une action serveur authentifiée après confirmation ; elle renvoie la réponse typée de classification et de facturation. L'envoi via l'extension Nodemailer configurée est également une action de classification payante. L'adaptateur exige paidAnalysisConsent: true et refuse toute autre valeur avant l'enregistrement ; ne le définissez qu'après autorisation.
// 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", {}),
]);
}
Constructeurs Standard et VIP natifs
Le constructeur standard gratuit importe, valide, compile et exporte le MJML au format HTML, MJML ou un ZIP des deux. Le constructeur VIP natif distinct utilise son propre format de document, pas le MJML : ses opérations d'importation, de validation, de compilation et d'exportation nécessitent une adhésion active et un droit d'accès ouvert détenu, et son ZIP contient trois variantes HTML CSS. La génération par IA optionnelle est payée séparément, produisant un design MJML standard ou VIP natif modifiable ; affichez le prix effectif actuel et transmettez la valeur confirmée expectedPriceMillicents, jamais un prix codé en dur. Les réponses ZIP contiennent archiveBase64, et non un champ html : decodeExportBytes renvoie les octets que votre application doit enregistrer. Ces points de terminaison de traitement ne récupèrent pas les ressources, ne conservent pas les designs et n'envoient pas d'e-mails.
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 },
});
}
Qu'est-ce qu'il peut faire d'autre ?
Les identifiants d'opération générés couvrent les lectures de compte et de tarifs, la classification et les éditions manuelles, la réécriture/génération de modèles par IA, les plans/statuts/achats VIP, les modèles natifs/droits d'accès, et l'import/export standard/natif sans état. Consultez les exemples sources et la référence de l'API client pour chaque type de requête, portée requise et prix actuel. Les lectures de catalogue n'achètent pas d'accès. Les nouvelles fonctionnalités payantes nécessitent des jetons délibérément délimités et une confirmation explicite de l'interface utilisateur.
Résultats, échecs et limites
SendReputeError expose status, code et requestId ; ne conservez que ces métadonnées opérationnelles sécurisées. Ne journalisez jamais les corps, les prompts, les en-têtes ou les réponses complètes. AbortSignal annule le travail ; timeoutMs s'applique par tentative. Les tentatives limitées (retries) tiennent compte de l'opération et la protection des reçus est limitée dans le temps, et non une facturation exactly-once illimitée. Le mode Advisory de Nodemailer signale sans bloquer ; le blocage utilise spamProbabilityThreshold et onApiFailure de manière indépendante. Préservez et testez votre transport réel séparément.
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;
}
}
Référence de l'API et des méthodes
SendReputeClient nécessite apiKey et baseUrl ; les options facultatives timeoutMs (par défaut 30000, maximum 300000), maxRetries (par défaut 2, plage 0–10) et fetch acceptent une implémentation serveur compatible. request(operationId, input, { signal }) renvoie la réponse typée de l'opération ; input contient son corps, son chemin et/ou ses champs de requête. Une configuration non valide génère une TypeError ; les échecs de l'API utilisent SendReputeError avec status, code, requestId et retryAfterMs. decodeExportBytes convertit un export ZIP en Uint8Array et rejette les entrées non ZIP ou base64 non valides. OperationInput, OperationResponse et les types de schémas générés sont exportés pour les appelants TypeScript.
Alternative : envelopper un transport Nodemailer de bas niveau
createSendReputeTransport(existingTransport, options) enveloppe un objet transport existant avec des méthodes send, close et verify facultatives ; ce n'est pas un transporteur sendMail. Choisissez ceci ou createSendReputePlugin, mais pas les deux, pour éviter une double analyse. Les deux acceptent client et policy plus, en option, model, un expéditeur string/resolver, signal et onDiagnostic. Les rappels de diagnostic ne peuvent pas modifier la livraison. Les codes d'erreur SendReputeNodemailerError distinguent une policy/message invalide, un contenu non supporté, les blocages de spam et les blocages par échec d'API. Le package npm 0.1.1 publié et le téléchargement 0.1.1 du site web combinent toutes les alternatives text/plain et text/html en mémoire affichées en une seule requête de classification limitée ; en mode bloquant, ils rejettent les alternatives affichées non supportées. Les messages bruts, les flux, les chemins et les URL restent non supportés.
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);
},
});
}
Toutes les 49 opérations de l'API client
Développez une opération pour voir son type d'entrée SDK exact, son type de retour, sa portée et ses statuts HTTP documentés. Le lien du schéma ouvre ses paramètres complets, les champs de réponse et les exemples dans la référence de l'API client. Ces wrappers utilisent le client configuré ci-dessus ; une confirmation est requise et rien ne s'exécute automatiquement. Les opérations de lecture n'autorisent pas les achats. Les mutations, les paiements, la fermeture d'accès et l'IA payante nécessitent l'action délibérée correspondante sur le compte.
Devis pour une analyse d'insights de campagne agrégés
POST /v1/campaign-insights/quote
Portée requise: ai:generate
Entrée: { body: CustomerCampaignInsightsQuoteInput; }
Retours: CustomerCampaignInsightsQuote
Statuts HTTP documentés: 200, 400, 401, 403, 429, 503
Paramètres, schémas et exemples 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.
Analyser les métriques de livraison de campagne agrégées avec l'IA
POST /v1/campaign-insights/analyze
Portée requise: ai:generate
Entrée: { body: CustomerCampaignInsightsAnalyzeInput; }
Retours: CustomerCampaignInsightsAnalysis
Statuts HTTP documentés: 200, 400, 401, 402, 403, 409, 413, 429, 502, 503
Paramètres, schémas et exemples 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 });
}
Lister les modèles de classification de l'API client
GET /v1/models
Portée requise: models:read
Entrée: Record<string, never>
Retours: CustomerApiModelsResponse
Statuts HTTP documentés: 200, 401, 403, 429, 503
Paramètres, schémas et exemples 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 });
}
Obtenir l'utilisation et les limites de l'API client
GET /v1/usage
Portée requise: usage:read
Entrée: Record<string, never>
Retours: CustomerApiUsageResponse
Statuts HTTP documentés: 200, 401, 403, 429, 503
Paramètres, schémas et exemples 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 });
}
Classifier l'e-mail d'un client
POST /v1/classify
Portée requise: classify
Entrée: { body: CustomerClassificationInput; }
Retours: CustomerClassificationResponse
Statuts HTTP documentés: 200, 400, 401, 402, 403, 409, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Obtenir le compte actuel et le solde
GET /v1/account
Portée requise: account:read
Entrée: Record<string, never>
Retours: Account
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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 });
}
Obtenir le lien de parrainage et l'historique des récompenses du compte actuel
GET /v1/account/referrals
Portée requise: account:read
Entrée: { query?: { page?: number; pageSize?: number; }; }
Retours: ReferralDashboard
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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 });
}
Lister le registre des crédits du compte actuel
GET /v1/account/ledger
Portée requise: billing:read
Entrée: { query?: { kind?: "usage" | "payments"; limit?: number; offset?: number; }; }
Retours: Array<CreditLedgerEntry>
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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 });
}
Lister les factures Bitcoin du compte actuel
GET /v1/payments/invoices
Portée requise: billing:read
Entrée: { query?: { limit?: number; offset?: number; }; }
Retours: Array<BitcoinInvoice>
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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 });
}
Créer une facture de dépôt Bitcoin libellée en USD
POST /v1/payments/invoices
Portée requise: billing:write
Entrée: { body: InvoiceInput; }
Retours: BitcoinInvoice
Statuts HTTP documentés: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Masquer une facture Bitcoin impayée
DELETE /v1/payments/invoices/{invoiceId}
Portée requise: billing:write
Entrée: { path: { invoiceId: string; }; }
Retours: undefined
Statuts HTTP documentés: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerDeletePaymentInvoice(
input: OperationInput<"customerDeletePaymentInvoice">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerDeletePaymentInvoice">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerDeletePaymentInvoice", input, { signal });
}
GET /payments/methods
GET /v1/payments/methods
Portée requise: billing:read
Entrée: Record<string, never>
Retours: Array<PaymentMethod>
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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 });
}
Obtenir l'offre de bonus de dépôt Bitcoin actuellement active
GET /v1/payments/deposit-offer
Portée requise: billing:read
Entrée: Record<string, never>
Retours: DepositBonusOffer | null
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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 });
}
Actualiser les confirmations pour les factures du compte actuel
POST /v1/payments/refresh
Portée requise: billing:write
Entrée: Record<string, never>
Retours: Array<BitcoinInvoice>
Statuts HTTP documentés: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Obtenir les tarifs publics actuels pour l'analyse et l'édition
GET /v1/pricing
Portée requise: catalog:read
Entrée: Record<string, never>
Retours: PricingSettings
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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 });
}
Obtenir le devis VIP public actuel et la comparaison des prix
GET /v1/vip/plans
Portée requise: catalog:read
Entrée: Record<string, never>
Retours: VipPlanQuote
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipPlans(
input: OperationInput<"customerGetVipPlans">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipPlans">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipPlans", input, { signal });
}
GET /vip
GET /v1/vip
Portée requise: vip:read
Entrée: Record<string, never>
Retours: VipState
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVip(
input: OperationInput<"customerGetVip">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVip">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVip", input, { signal });
}
POST /vip/purchase
POST /v1/vip/purchase
Portée requise: vip:purchase
Entrée: { body: CustomerVipPurchaseInput; }
Retours: VipPurchaseResult
Statuts HTTP documentés: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Chiffrer une modification et revérifier par rapport à une classification enregistrée
POST /v1/rewrite/quote
Portée requise: rewrite
Entrée: { body: EditQuoteInput; }
Retours: EditQuote
Statuts HTTP documentés: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Chiffrer une modification et revérifier par rapport à une classification enregistrée
POST /v1/classify/edit/quote
Portée requise: classify
Entrée: { body: EditQuoteInput; }
Retours: EditQuote
Statuts HTTP documentés: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Classifier un e-mail en utilisant le nom de l'expéditeur, l'objet et le corps
POST /v1/classify/edit
Portée requise: classify
Entrée: { body: CustomerManualEditInput; }
Retours: CustomerManualEditResult
Statuts HTTP documentés: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Demander une réécriture par IA, facturée séparément, des termes signalés sélectionnés et reclasser le résultat
POST /v1/rewrite
Portée requise: rewrite
Entrée: { body: CustomerAiRewriteInput; }
Retours: AiRewriteResult
Statuts HTTP documentés: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Paramètres, schémas et exemples 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 });
}
Vérifier une version finale exacte par rapport à un reçu payé « Tout réécrire » sans débit supplémentaire
POST /v1/rewrite/finalize
Portée requise: rewrite
Entrée: { body: { requestId: string; sender: string; subject: string; body: string; }; }
Retours: { requestId: string; input: RewrittenClassificationInput; classification: ClassificationResult; }
Statuts HTTP documentés: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Récupérer un reçu de réécriture IA payé et terminé appartenant à l'utilisateur
GET /v1/rewrite/result/{requestId}
Portée requise: rewrite
Entrée: { path: { requestId: string; }; }
Retours: AiRewriteResult
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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 });
}
Citer le prix maximum autorisé d'une réécriture IA payée séparément
POST /v1/rewrite/ai-quote
Portée requise: rewrite
Entrée: { body: AiRewriteQuoteInput; }
Retours: AiRewriteQuote
Statuts HTTP documentés: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Générer un modèle d'e-mail MJML standard modifiable avec l'IA au prix de compte confirmé
POST /v1/email-builder/ai-template
Portée requise: ai:generate
Entrée: { body: CustomerAiEmailTemplateInput; }
Retours: AiEmailTemplateResult
Statuts HTTP documentés: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Paramètres, schémas et exemples 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 });
}
Générer un modèle d'e-mail VIP natif modifiable avec l'IA au prix membre confirmé
POST /v1/vip/email-template
Portée requise: ai:generate
Entrée: { body: CustomerVipEmailTemplateInput; }
Retours: CustomerVipEmailTemplateResult
Statuts HTTP documentés: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Paramètres, schémas et exemples 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 });
}
Ouvrir gratuitement une session standard de l'éditeur de conception d'e-mails
POST /v1/email-builder/access
Portée requise: builder:write
Entrée: { body: CustomerEmailBuilderAccessInput; }
Retours: EmailBuilderAccess
Statuts HTTP documentés: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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}
Portée requise: builder:read
Entrée: { query?: { designId?: string; }; path: { accessId: string; }; }
Retours: EmailBuilderActiveAccess
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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}
Portée requise: builder:write
Entrée: { path: { accessId: string; }; }
Retours: undefined
Statuts HTTP documentés: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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
Portée requise: vip:builder
Entrée: { body: CustomerVipBuilderAccessInput; }
Retours: VipBuilderAccess
Statuts HTTP documentés: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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}
Portée requise: builder:read
Entrée: { path: { accessId: string; }; }
Retours: VipBuilderAccess
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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}
Portée requise: vip:builder
Entrée: { path: { accessId: string; }; }
Retours: undefined
Statuts HTTP documentés: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Paramètres, schémas et exemples 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}
Portée requise: authenticated original credential
Entrée: { path: { recoveryId: string; }; }
Retours: { 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; }; }
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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
Portée requise: authenticated credential
Entrée: Record<string, never>
Retours: { accountId: string; credentialId: string; }
Statuts HTTP documentés: 200, 401, 403, 429, 503
Paramètres, schémas et exemples 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
Portée requise: original ai:generate or vip:builder service scope
Entrée: { body: { action: "resolve"; reason: string; }; path: { recoveryId: string; }; }
Retours: { 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; }; }
Statuts HTTP documentés: 200, 400, 401, 403, 404, 429, 503
Paramètres, schémas et exemples 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 });
}
Importer et compiler un design MJML standard sans l'enregistrer ni l'envoyer
POST /v1/email-builder/import
Portée requise: builder:write
Entrée: { body: CustomerStandardBuilderInput; }
Retours: CustomerStandardBuilderImportResult
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Valider et compiler un design MJML standard sans l'enregistrer ni l'envoyer
POST /v1/email-builder/validate
Portée requise: builder:write
Entrée: { body: CustomerStandardBuilderInput; }
Retours: CustomerStandardBuilderValidateResult
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Compiler un design MJML standard en HTML sans l'enregistrer ni l'envoyer
POST /v1/email-builder/compile
Portée requise: builder:write
Entrée: { body: CustomerStandardBuilderInput; }
Retours: CustomerStandardBuilderCompileResult
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Exporter une conception MJML standard en HTML, MJML ou ZIP sans envoi
POST /v1/email-builder/export
Portée requise: builder:write
Entrée: { body: CustomerStandardBuilderInput; }
Retours: CustomerStandardBuilderExportResult
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Importer et compiler une conception VIP native avec un abonnement actif et un accès ouvert détenu
POST /v1/vip/email-builder/import
Portée requise: vip:builder
Entrée: { body: CustomerNativeBuilderInput; }
Retours: CustomerNativeBuilderImportResult
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Valider et compiler une conception VIP native avec un abonnement actif et un accès ouvert détenu
POST /v1/vip/email-builder/validate
Portée requise: vip:builder
Entrée: { body: CustomerNativeBuilderInput; }
Retours: CustomerNativeBuilderValidateResult
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Compiler une conception native VIP en HTML avec un abonnement actif et un libre accès détenu
POST /v1/vip/email-builder/compile
Portée requise: vip:builder
Entrée: { body: CustomerNativeBuilderInput; }
Retours: CustomerNativeBuilderCompileResult
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Exporter une conception native VIP en HTML ou en archive ZIP HTML à trois variantes sans envoi
POST /v1/vip/email-builder/export
Portée requise: vip:builder
Entrée: { body: CustomerNativeBuilderInput; }
Retours: CustomerNativeBuilderExportResult
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Lancer un transfert unique vers l'éditeur hébergé VIP natif standard ou avec droits
POST /v1/email-builder/hosted-handoffs
Portée requise: builder:write
Entrée: { body: CustomerHostedBuilderHandoffInput; }
Retours: CustomerHostedBuilderHandoff
Statuts HTTP documentés: 201, 400, 401, 403, 429, 503
Paramètres, schémas et exemples 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 });
}
Lister les modèles du constructeur Vip
GET /v1/vip/email-builder/templates
Portée requise: vip:read
Entrée: Record<string, never>
Retours: CustomerVipTemplateCatalog
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Obtenir le modèle de constructeur VIP
GET /v1/vip/email-builder/templates/{templateId}
Portée requise: vip:read
Entrée: { path: { templateId: string; }; }
Retours: CustomerVipTemplateDocument
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Lister les modèles de constructeur standard
GET /v1/email-builder/templates
Portée requise: catalog:read
Entrée: Record<string, never>
Retours: CustomerStandardTemplateCatalog
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Obtenir le modèle de constructeur standard
GET /v1/email-builder/templates/{templateId}
Portée requise: catalog:read
Entrée: { path: { templateId: string; }; }
Retours: CustomerStandardTemplateDetail
Statuts HTTP documentés: 200, 400, 401, 403, 404, 413, 429, 503
Paramètres, schémas et exemples 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 });
}
Nœud n8n auto-hébergé
0.1.0
Nécessite Node.js 20.19+ et une installation n8n auto-hébergée patchée fournissant n8n-workflow >=2.39.3 <3. Ne forcez pas l'installation dans un hôte plus ancien incompatible. Installez l'archive tarball téléchargée dans votre répertoire custom-node et redémarrez n8n. Ce nœud non publié n'est pas disponible via n8n Cloud ou une installation communautaire npm-name.
Le consentement payant est désactivé par défaut. Chaque élément consenti effectue une requête de classification sans tentative automatique. Les résultats sont placés dans l'espace de noms sendrepute. Utilisez une porte IF sur sendrepute.allowed avant l'envoi, et vérifiez le statut d'échec séparément. Les modes conseil et blocage renvoient des décisions explicites. Le nœud lui-même n'envoie pas de courrier électronique.
Télécharger le tarball n8n
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Exécutez sur l'hôte n8n auto-hébergé, puis redémarrez son service n8n via votre gestionnaire de processus habituel. Confirmez que SendRepute apparaît dans le sélecteur de nœuds. Importez le fichier package/examples/classify-email.workflow.json extrait depuis l'éditeur n8n. L'installation de nœuds communautaires npm-name et n8n Cloud n'est pas prise en charge par ce package non publié.
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
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou 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. Configurer en toute sécurité
Créez un identifiant API SendRepute avec une clé client à portée classify dans le stockage d'identifiants n8n. Ne le placez jamais dans le JSON du workflow ou dans des expressions. Le JSON ci-dessous montre les paramètres du nœud, pas un workflow complet importable. Mappez le nom d'affichage de l'expéditeur, l'objet et le corps ; choisissez advisory/blocking, le seuil et la politique d'échec open/closed. Consultez les tarifs avant de passer paidConsent à true. Chaque élément consentant effectue au plus une requête.
{
"operation": "classify",
"paidConsent": false,
"sender": "={{ $json.sender }}",
"subject": "={{ $json.subject }}",
"body": "={{ $json.body }}",
"decisionMode": "blocking",
"threshold": 0.8,
"failurePolicy": "closed"
}
3. Utiliser délibérément
Placez un nœud IF immédiatement après SendRepute et utilisez cette condition booléenne. Connectez uniquement la sortie true à votre nœud d'e-mail existant ; dirigez false vers une révision ou un arrêt. Inspectez analysisStatus séparément même lorsque sendrepute.allowed est true. Le workflow inclus démarre avec le consentement payant désactivé et ne contient aucun identifiant. SendRepute lui-même n'envoie jamais de courrier.
{{ $json.sendrepute.allowed === true }}
Résultats, échecs et limites
Les résultats réussis remplacent l'espace de noms sendrepute par les champs analysisStatus, decision, allowed, recommendation, le score validé et la facturation. Les échecs omettent les scores de spam et renvoient les champs failureCategory/errorCode nettoyés. Les échecs fermés bloquent ; les échecs ouverts autorisent mais marquent analysisStatus comme échoué. Les succès consultatifs autorisent toujours, quelle que soit la recommendation. Consent-off renvoie not_run. Il n'y a pas de tentatives, de destinataires, de pièces jointes, de réécritures, de sélecteur de modèle ou de points de terminaison personnalisés. L'audit de dépendance source mis à jour a rapporté zéro résultat ; il s'agit d'un résultat ponctuel et non d'une certification de sécurité. Maintenez le runtime auto-hébergé à jour avec les correctifs et consultez SECURITY.md avant l'installation.
Intégration Laravel
0.1.0
Cible PHP 8.2+ et Laravel 12–13. Installez le ZIP en utilisant un dépôt d'artefacts Composer local, ou extrayez-le et configurez un dépôt de chemin Composer comme décrit dans le README inclus. Aucune publication sur Packagist n'est revendiquée.
Le consentement payant et le hook d'e-mail sont désactivés par défaut. Même lorsqu'ils sont activés, chaque message doit explicitement donner son accord avec X-SendRepute-Classify: yes. L'en-tête est supprimé avant la livraison. Les modes consultatif et de blocage ont des politiques d'échec indépendantes ; les réinitialisations de mot de passe et les e-mails transactionnels restent inchangés à moins d'un opt-in délibéré.
Télécharger le ZIP Laravel
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Exécutez à l'intérieur de votre application Laravel. Ces commandes extraient le téléchargement et enregistrent un dépôt de chemin Composer ; il ne s'agit pas d'une installation Packagist. La découverte de package enregistre le fournisseur, et vendor:publish crée config/sendrepute.php. Gardez le répertoire du package extrait accessible à Composer. Un dépôt d'artefacts est une autre option documentée dans le 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
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou 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. Configurer en toute sécurité
Stockez SENDREPUTE_API_KEY dans les secrets du serveur. L'URL de base se termine par /api ; le client ajoute /v1/classify. Une correspondance exacte de l'hôte de confiance et un HTTPS vérifié sont requis. Les deux commutateurs illustrés restent désactivés jusqu'à ce que vous consultiez les tarifs et les définissiez explicitement sur true. Dans config/sendrepute.php, choisissez indépendamment mail.mode, mail.spam_probability_threshold et mail.failure_policy. Le défaut est advisory avec autorisation en cas d'échec.
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. Utiliser délibérément
Ajoutez l'en-tête d'activation exact uniquement aux classes Mailable délibérément sélectionnées, jamais à un rappel de courrier global. Les deux commutateurs globaux et l'en-tête par message sont nécessaires pour le hook automatique. L'en-tête est supprimé avant la livraison. Écartez les réinitialisations de mot de passe et les notifications critiques du blocage automatique à moins d'avoir été explicitement testées. La classification manuelle peut alternativement résoudre le contrat Classifier et accorder le consentement par appel, comme illustré.
// 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,
);
}
Référence de l'API et des méthodes
Résolvez l'interface Classifier depuis le conteneur de Laravel. classify(string sender, string subject, string body, ?string model = null, bool paidAnalysisConsent = false) retourne ClassificationResult. Ses champs publics sont requestId, model, label, spamProbability, confidence, replayed et chargedMillicents. SendReputeException fournit la catégorie assainie, le statut HTTP, le code API et l'ID de requête. Le hook automatique est AnalyzeOutgoingMessage sur MessageSending et son diagnostic sécurisé est ClassificationOutcome. Cette intégration supporte uniquement la classification, pas l'administration de compte, les paiements, les builders ou la réécriture par IA.
Résultats, échecs et limites
ClassificationResult contient le résultat validé et les données de facturation. Le hook MessageSending renvoie false pour annuler un message bloqué ; l'annulation n'est pas une erreur SMTP ou un événement MessageSent. ClassificationOutcome signale uniquement l'action, le score et les métadonnées d'échec aseptisées, jamais le contenu du message. La politique d'échec couvre les entrées/réponses malformées, l'authentification, le solde, les limites de débit et les problèmes de transport. Aucune tentative supplémentaire ni file d'attente n'est ajoutée. Un expéditeur nommé et un corps texte ou HTML en mémoire sont requis.
Vérification avant envoi des brouillons Mautic
0.1.0
Cible les installations Mautic 5.x sur un seul nœud Web avec PHP 8.1+ et ext-curl. Mautic 4, Mautic 6 et les clusters multi-nœuds ne sont pas pris en charge. Extrayez SendReputeBundle dans votre répertoire de plugins, rechargez les plugins et videz le cache en suivant le fichier README inclus. Configurez l'identifiant et confirmez explicitement le mode de verrouillage local-flock dans l'environnement serveur.
Analyse consultative payante d'un brouillon enregistré uniquement, initiée par l'administrateur. Un opt-in global, des vérifications d'accès aux entités, une validation CSRF et une confirmation à usage unique protègent chaque demande. Il n'envoie, ne réécrit ni ne bloque les e-mails et n'a aucune application au moment de l'envoi. Les substitutions de destinataires restent non développées ; enregistrez d'abord les modifications de l'éditeur.
Télécharger le ZIP Mautic
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Exécutez depuis la racine de Mautic avec le même utilisateur PHP et le même environnement que l'application web, ou extrayez le ZIP via votre processus de déploiement avant de recharger les plugins. Nécessite Mautic 5.x, PHP 8.1+, ext-curl et un seul nœud web Linux/POSIX. Mautic 4/6 et les clusters multi-nœuds ne sont pas pris en charge ; aucune certification d'installation de correctif par correctif en direct n'est revendiquée.
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
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
git clone https://github.com/sendrepute/sendrepute-mautic.git
cd sendrepute-mautic
python3 package.py
2. Configurer en toute sécurité
Créez le répertoire de registre persistant illustré en dehors de la racine web, appartenant à l'utilisateur PHP avec le mode 0700. N'utilisez pas /tmp, des conteneurs éphémères, des liens symboliques ou un stockage réseau incertain. Stockez SENDREPUTE_API_KEY côté serveur. Confirmez local-flock uniquement lorsqu'un seul nœud web fournit un verrouillage de processus partagé. L'analyse payante globale reste désactivée à 0 ; réglez-la sur 1 uniquement après avoir consulté les tarifs et les limites. Aucun champ du navigateur ne doit fournir l'identifiant ou le point de terminaison.
SENDREPUTE_MAUTIC_PAID_ANALYSIS_ENABLED=0
SENDREPUTE_MAUTIC_ATOMIC_LOCK_MODE=local-flock
SENDREPUTE_MAUTIC_LEDGER_DIR=/var/lib/mautic/sendrepute-ledger
3. Utiliser délibérément
Enregistrez d'abord les modifications de l'éditeur. En tant qu'administrateur Mautic réel ayant accès à cet e-mail, ouvrez le brouillon enregistré et choisissez le preflight SendRepute. Lisez la confirmation et acceptez explicitement l'opération payante. La requête nécessite une validation CSRF et une intention à usage unique de dix minutes liée au contenu enregistré. Le verrouillage persistant et un registre sans contenu empêchent les doubles dépenses simultanées sur le nœud unique pris en charge.
Résultats, échecs et limites
Affiche la probabilité validée, l'étiquette, la confiance et le montant réel facturé ou la relecture du reçu. Les échecs n'affichent aucune décision de spam et ne sont pas automatiquement réessayés. Seuls le nom d'affichage de l'expéditeur, l'objet et le corps enregistrés sont analysés ; les substitutions de contacts restent non développées. Le plugin ne réécrit pas les brouillons, n'envoie pas d'e-mail, ne bloque pas les campagnes et n'applique pas de politique d'heure d'envoi. Un examen de brouillon enregistré ne peut pas certifier le message final tel qu'affiché par le destinataire.
Client Python et backend Django
0.1.0
Nécessite Python 3.9+. Extrayez le ZIP source et installez son répertoire avec pip. Le client serveur générique utilise la bibliothèque standard ; Django est une dépendance optionnelle pour le backend d'e-mail explicite. Ce paquet n'est pas publié sur PyPI.
Le consentement payant est désactivé par défaut. Le wrapper Django préserve les objets de transport et de message d'origine. Il analyse une chaîne délimitée combinant le corps principal et les alternatives en ligne text/plain et text/html, hors pièces jointes. Le mode de blocage rejette les contenus affichés non pris en charge ou trop volumineux. Les échecs d'authentification bloquent par défaut, même avec une politique d'autorisation ; choisissez délibérément le comportement des e-mails critiques.
Télécharger le ZIP source Python
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Utilisez un environnement virtuel. Le client générique ne dépend que de la bibliothèque standard ; la commande finale ajoute la dépendance Django optionnelle et est inutile pour une utilisation avec Flask, FastAPI ou d'autres serveurs génériques. Le package est installé à partir du répertoire source téléchargé, pas de PyPI. Python 3.9+ est le minimum requis pour le package ; choisissez des versions de Python/Django supportées ensemble.
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]'
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou 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. Configurer en toute sécurité
Injectez SENDREPUTE_API_KEY via les secrets du serveur. Le client générique utilise par défaut le point de terminaison hébergé canonique, HTTPS vérifié, sans redirections ni tentatives. Le consentement du client est désactivé par défaut ; l'exemple n'accorde le consentement par appel qu'après vérification. Les surcharges de point de terminaison nécessitent une liste blanche d'origines HTTPS explicite. Le dictionnaire renvoyé contient le résultat validé et les données de facturation, pas une décision d'envoi.
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
Backend de messagerie Django
Conservez votre backend existant dans SENDREPUTE_ORIGINAL_EMAIL_BACKEND et gardez ses paramètres SMTP normaux. L'exemple maintient le consentement payant désactivé ; réglez-le sur True uniquement après examen des tarifs. Le mode consultatif (Advisory) autorise les analyses réussies ; le blocage compare à SENDREPUTE_SPAM_THRESHOLD. Choisissez délibérément la politique d'échec indépendante. Les erreurs d'authentification bloquent par défaut même en mode autorisation. L'exemple suit les valeurs par défaut du README et n'est pas une recommandation d'échouer en mode ouvert pour le courrier critique.
# 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. Utiliser délibérément
Cette fonction n'envoie que lorsqu'elle est appelée. Avec le wrapper Django configuré et le consentement payant activé, le backend d'origine reçoit les objets de message originaux inchangés. Le classificateur reçoit une chaîne délimitée combinant le corps principal avec les alternatives en ligne text/plain et text/html ; les pièces jointes et les destinataires ne sont pas des entrées distinctes. Rendu des templates avant l'appel. Utilisez d'abord un backend de test local, puis votre transport réel délibérément configuré.
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()
Référence de l'API et des méthodes
Le constructeur public est SendReputeClient(api_key, endpoint, allowed_origins, timeout, paid_analysis_consent), avec tous les paramètres sauf api_key passés par mot-clé. timeout doit être supérieur à zéro et au maximum de 30 secondes. classify nécessite les mots-clés sender, subject et body ; model et le paid_analysis_consent par appel sont optionnels. Sender fait 1–320 caractères, subject 1–998 et body 1–524,288, avec une limite distincte pour la requête encodée. Le dict retourné contient requestId, model, result et billing ; result inclut label, spamProbability, confidence, reasons et contentAudit optionnel. billing contient chargedMillicents et replayed. Les erreurs incluent ConsentRequiredError, AuthenticationError, BalanceError, RateLimitError, TransportError et InvalidResponseError, toutes sous SendReputeError. Une configuration invalide peut lever une ValueError. Le backend Django expose open(), close() et send_messages(email_messages), retournant le nombre de messages envoyés du backend original ; il n'ajoute aucune API générique, builder, rewrite ou méthodes de paiement.
Résultats, échecs et limites
Le blocage rejette le contenu affiché non supporté ou trop volumineux au lieu d'analyser seulement un sous-ensemble plus sûr. Les échecs d'authentification nécessitent une surcharge explicite séparée pour autoriser. Les autres erreurs suivent la politique autoriser/bloquer choisie ; fail_silently contrôle si les échecs bloqués sont levés ou ignorés. Le wrapper ne met pas en file d'attente, ne réessaie pas, n'échange pas les transports, n'inspecte pas les pièces jointes et ne rend pas de templates. Le client générique lève des sous-classes SendReputeError aseptisées avec code/statut/request_id ; ne journalisez pas les corps de messages.
Client de classification Go
0.1.0
Nécessite Go 1.22+. Le client utilisant uniquement la bibliothèque standard prend en charge la classification, mais pas le transport d'e-mails. Choisissez le fichier ZIP source téléchargeable avec un remplacement de module local, ou l'installation du module public vérifié affichée sous l'alternative source.
Classification côté serveur utilisant uniquement la bibliothèque standard, avec consentement payant explicite, requêtes limitées, HTTPS vérifié, redirections refusées et sans nouvelle tentative. Il n'envoie pas d'e-mail et ne prend pas de décisions d'envoi ou de blocage. Votre application doit délibérément choisir les seuils et le comportement en cas d'échec, en particulier pour les messages transactionnels critiques.
Télécharger le ZIP source Go
Dépôt source public
README complet et exemples
Notes de sécurité et limites connues
1. Installer
Extrayez la source dans le répertoire de votre application Go existante et exécutez-y les commandes du module. Le remplacement local pointe vers le module téléchargé ; déplacez ou ajustez ce chemin si la structure de votre projet diffère. Exécutez go mod init avec votre propre nom de module d'abord uniquement lors de la création d'une nouvelle application. Aucun module d'exécution externe n'est requis par ce client.
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
Alternative : installation à partir d'une source publique
Utilisez ce chemin source au lieu des instructions de téléchargement du site web ci-dessus. Le fichier README du dépôt explique les étapes d'activation et de configuration restantes ; la simple création d'un ZIP n'installe pas d'extension. Pour Python, la seconde commande ajoute le support Django optionnel. Conservez les identifiants dans les secrets du serveur et consultez les notes de sécurité avant d'activer les fonctionnalités payantes. Seul Node est présent sur npm ; un dépôt GitHub public n'implique pas une publication sur WordPress.org, n8n Cloud, Packagist ou PyPI.
go get github.com/sendrepute/sendrepute-go@bfd656f829618348232da506225a5d92587d48e2
2. Configurer en toute sécurité
Injectez SENDREPUTE_API_KEY à partir des secrets du serveur. La fonction présentée n'effectue aucun travail jusqu'à ce qu'elle soit appelée avec confirmed=true ; cet appel peut entraîner une classification payante. Elle définit un contexte de dix secondes et utilise le point de terminaison HTTPS canonique. Le consentement du client est désactivé par défaut ; le dernier argument true accorde le consentement pour cette requête unique. Une surcharge du point de terminaison nécessite une entrée AllowedOrigins explicite ; les redirections sont refusées.
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. Utiliser délibérément
Appelez Analyze depuis votre application authentifiée uniquement après examen des tarifs et consentement explicite. Le seuil de 0.90 et l'erreur d'examen sont des exemples de politique d'application, pas des valeurs par défaut du SDK. Décidez si les erreurs signifient différer, autoriser ou échouer en mode fermé avant de connecter tout code d'envoi. Le client renvoie un résultat typé avec Result.SpamProbability et les champs de facturation ; il n'envoie jamais d'e-mail et ne prend pas de décisions de livraison lui-même.
Référence de l'API et des méthodes
NewClient(Config) retourne (*Client, error). Config accepte APIKey, Endpoint, AllowedOrigins, Timeout et PaidAnalysisConsent. Classify(ctx, ClassificationInput, consent) retourne (*ClassificationResponse, error). Les champs d'entrée sont Sender, Subject, Body et Model (optionnel). Sender contient 1–320 runes, subject 1–998 runes et body au maximum 524 288 octets UTF-8. La réponse typée contient RequestID, Model, Result et Billing ; Billing expose ChargedMillicents et Replayed. Result inclut Label, SpamProbability, Confidence, Reasons, FlaggedTerms et ContentAudit (optionnel). Utilisez errors.As pour inspecter *Error en toute sécurité ; les échecs de configuration et d'API restent des erreurs, pas des scores de spam. Il n'existe aucune méthode de compte, de paiement, de builder ou de réécriture.
Résultats, échecs et limites
Une invocation effectue au plus une tentative HTTP payante sans tentatives supplémentaires. Les erreurs exposent une catégorie sûre, un code/request ID restreint et un statut, jamais les identifiants, les corps ou les détails du réseau. La durée du contexte, les tailles de requête et de réponse sont limitées ; les réponses malformées sont rejetées plutôt que converties en scores. Le client n'a pas de capacités d'analyse MIME, de rendu, de destinataires, de pièces jointes, de file d'attente, de constructeur, de réécriture ou SMTP. Choisissez explicitement le modèle uniquement si nécessaire ; sinon, le défaut du compte s'applique.
listmonk HTTP Messenger
0.1.0
Un package source local non publié pour Node.js 20+ ciblant l'interface Custom HTTP Messenger de listmonk 6.2.0. Ce service externe gère la distribution SMTP en aval après la classification ; il ne s'agit pas d'un plugin intégré au processus ni d'un proxy SMTP de type preflight. La vérification est isolée et hors ligne, sans déploiement listmonk installé ni test réel de fournisseur SMTP.
Les deux commutateurs paid sont désactivés par défaut. Le messenger accepte un corps entièrement rendu, rejette les pièces jointes, vérifie les tarifs récents et exige le résultat strict Inbox : label inbox, spamProbability d'au plus 0.12, et aucun flaggedTermCount. Il construit et envoie ensuite ce même corps inspecté via sa connexion SMTP configurée. Des reçus durables empêchent les répétitions automatiques après des résultats bloqués, échoués, en cours ou incertains.
Télécharger le ZIP source non publié de listmonk
1. Installer
Extrayez cette source ZIP non publiée du site web sur l'hôte dédié au messager. Consultez README.md et SECURITY.md, copiez l'environnement d'exemple et vérifiez la syntaxe du point d'entrée du serveur avant la configuration. L'artéfact téléchargeable autorisé exclut intentionnellement la suite de tests du dépôt. Il n'y a pas de packages d'exécution tiers. Ceci n'est pas une installation via la marketplace listmonk ou en cours de processus.
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. Configurer en toute sécurité
Utilisez un compte dédié non privilégié et un répertoire d'état local durable avec le mode 0700. Laissez les trois commutateurs de sécurité affichés sur false jusqu'à ce que la tarification et la limitation de prix non atomique soient acceptées. Stockez SendRepute, l'authentification Basic Auth du messager et les identifiants SMTP en aval uniquement dans les secrets du serveur. Terminez le HTTPS au niveau d'un proxy inverse de confiance.
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. Utiliser délibérément
Exposez uniquement POST /v1/listmonk derrière HTTPS et une authentification Basic Auth dédiée. Dans les paramètres de listmonk > Messengers, ajoutez son URL en tant que Custom HTTP Messenger, choisissez zéro tentative, et sélectionnez-le uniquement pour les campagnes devant être inspectées et délivrées. Ne sélectionnez pas en plus listmonk SMTP : ce service effectue lui-même l'envoi SMTP en aval.
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.
Résultats, échecs et limites
Un doublon délivré retourne un succès sans nouvelle classification ni envoi. Chaque reçu bloqué (blocked), échoué (failed), en cours d'inspection (inspecting), en cours d'envoi (sending), ou incertain (uncertain) refuse un autre envoi. Après un résultat SMTP incertain, réconciliez manuellement les journaux du fournisseur et le contexte listmonk ; ne supprimez jamais un reçu simplement pour forcer une nouvelle tentative. La vérification du tarif actuel est récente mais non atomique car la classification n'accepte aucun champ expectedPriceMillicents.
Adaptateur Mailcoach Self-Hosted
0.1.0
Un package Composer local non publié ciblant Mailcoach Self-Hosted v10 sur Laravel 12. Le cœur licencié spatie/laravel-mailcoach v10 n'est pas disponible dans cet espace de travail, ce package ne prétend donc pas à un test de bout en bout installé de Mailcoach v10. Les tests réels de Laravel 12 Mailer couvrent l'événement annulable MessageSending documenté ; un détenteur de licence doit vérifier chaque chemin d'envoi exact de Mailcoach avant la production.
Les commutateurs enabled, paidConsent et d'acceptation de current-pricing sont tous désactivés par défaut. Une fois activé, le hook s'applique à chaque message via ce mailer Laravel, et pas seulement aux routes nommées Mailcoach. Il analyse les alternatives Symfony Email déjà rendues et peut annuler le transport. Le mode fail-closed est par défaut ; autoriser les échecs d'analyse est une politique distincte délibérée.
Télécharger le ZIP source expérimental Mailcoach
1. Installer
Placez le fichier ZIP non publié téléchargé dans un répertoire d'artefacts Composer privé accessible à l'application Mailcoach sous licence. Enregistrez ce dépôt d'artefacts local, requérez la ligne 0.1, commitez le fichier lock de consommation, et publiez éventuellement la configuration. Il ne s'agit pas d'une installation Packagist. Un détenteur de licence doit effectuer la vérification par rapport à la version exacte de 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. Configurer en toute sécurité
Laissez les trois commutateurs sur false initialement. Stockez la clé API dans les secrets du serveur et configurez un plafond de dépenses côté compte. L'opération actuelle de classification n'ayant pas de garde atomique expectedPriceMillicents, le troisième commutateur accepte explicitement la tarification actuelle de l'API plutôt que de promettre un devis verrouillé. Configurez le seuil et la politique d'échec allow/block indépendamment.
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. Utiliser délibérément
La découverte du package enregistre un écouteur Laravel MessageSending. Il n'y a pas d'appel par campagne dans le code de l'application : lorsqu'il est délibérément activé dans une installation dédiée de Mailcoach, il inspecte chaque Symfony Email envoyé via ce mailer Laravel immédiatement avant le transport. Dans une application Laravel mixte, les e-mails de l'application hôte sont également couverts.
Résultats, échecs et limites
L'adaptateur soumet le nom d'affichage de l'expéditeur, le sujet et chaque alternative text/plain ou text/html en mémoire non vide, tout en excluant les destinataires, les adresses, les pièces jointes, les données d'enveloppe et le MIME brut. Le contenu manquant ou non pris en charge, les réponses malformées et les échecs de l'API bloquent par défaut. Les tests de base hors ligne exercent l'annulation réelle du Laravel Mailer, mais les routes de campagne, d'automatisation, transactionnelles et de messages de test de Mailcoach sous licence restent non vérifiées.
Flux d'envoi contrôlé Brevo
0.1.0
Un package source Node.js 20+ local non publié implémentant une API d'envoi explicite côté serveur autour de l'opération transactionnelle POST /v3/smtp/email de Brevo. Il n'intercepte pas les envois du tableau de bord Brevo, les campagnes, les automatisations, le relais SMTP ou les appels via d'autres SDK. Les tests sont contrôlés et hors ligne ; ils ne certifient pas un compte Brevo actif.
Le paramètre paidConsent est désactivé par défaut. Seuls les messages text/plain et text/html fixes sont acceptés ; les modèles distants, les paramètres, les envois programmés, les versions de messages et le contenu basé sur URL sont rejetés. Le snapshot exact et immuable inspecté est envoyé à Brevo. Un registre sendKey durable bloque les doublons et les tentatives ambiguës, et les résultats incertains du fournisseur nécessitent une réconciliation manuelle par l'opérateur.
Télécharger le ZIP source Brevo non publié
1. Installer
Extrayez la source ZIP non publiée dans une application serveur, consultez son README et ses notes de sécurité, puis vérifiez la syntaxe de src/index.mjs. L'artéfact téléchargeable autorisé exclut intentionnellement la suite de tests du dépôt. Importez SendReputeBrevo depuis src/index.mjs ; ceci n'est pas une installation via npm ou la marketplace Brevo. Node.js 20+ est requis et il n'y a aucune dépendance d'exécution.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-brevo.zip
unzip sendrepute-brevo.zip
cd sendrepute-brevo
node --check src/index.mjs
2. Configurer en toute sécurité
Maintenez paidConsent à false tant que les tarifs actuels et la limitation de prix non atomique ne sont pas acceptés. Conservez les deux clés API dans les secrets du serveur et utilisez un répertoire de registre persistant privé sur un stockage durable à hôte unique. expectedPriceMillicents doit être égal au maximum fraîchement récupéré, mais le débit de classify ne peut pas encore appliquer cette valeur de manière atomique.
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. Utiliser délibérément
Appelez send uniquement à partir du chemin serveur contrôlé qui doit à la fois classifier et distribuer. Réutilisez une sendKey stable pour chaque tentative du même e-mail prévu. Fournissez un contenu en ligne fixe ; ne fournissez pas d'identifiants de modèle Brevo, de paramètres mutables, de planification ou de versions de message. Les envois effectués ailleurs contournent complètement ce wrapper.
await integration.send({
sendKey: durableBusinessEventId,
message: {
sender: { name: "Example Shop", email: "orders@example.com" },
to: [{ email: recipient }],
subject,
textContent,
htmlContent,
},
});
Résultats, échecs et limites
Un résultat Inbox en deçà du seuil permet une requête API transactionnelle Brevo pour le même snapshot immuable. Le registre passe à delivery-unknown avant l'envoi du fournisseur. Les délais expirés (timeouts), déconnexions, succès malformés, plantages et rejets du fournisseur ne font jamais l'objet d'une tentative automatique ; réconciliez-les avec les enregistrements Brevo avant toute décision manuelle.
Flux d'envoi contrôlé BigMailer
0.1.0
Un wrapper Node.js 24+ local non publié pour les appels API transactionnels explicites de BigMailer. Il ne s'installe pas dans BigMailer et n'intercepte pas le tableau de bord ni les envois API non liés. Étant donné que BigMailer possède le contenu des campagnes modifiable à distance, le wrapper ne peut pas prouver que la campagne est restée identique au snapshot de rendu fourni par l'appelant entre la révision et la livraison.
Les paramètres enabled, paidConsent et l'acceptation de la limitation des modèles distants sont désactivés par défaut. L'appelant doit fournir et hacher un snapshot de rendu complet, geler opérationnellement la campagne distante correspondante, et fournir une deliveryKey durable. La tarification est revérifiée avant la classification, mais l'API de classification actuelle ne possède pas de champ atomique de prix attendu. Les états de livraison en double, bloqués, rejetés ou ambigus ne sont jamais renvoyés automatiquement.
Télécharger le ZIP source expérimental pour BigMailer
1. Installer
Extrayez cette archive ZIP source non publiée dans l'application serveur contrôlée Node.js 24+ et consultez README.md et SECURITY.md. Importez le wrapper et FileDeliveryStore directement depuis src. Il ne s'agit pas d'une installation via npm ou la place de marché BigMailer et ne possède aucune dépendance d'exécution tierce.
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. Configurer en toute sécurité
Maintenez enabled, paidConsent, et remoteTemplateSnapshotLimitationAcknowledged à false jusqu'à révision. Stockez les clés API, les UUID de marque et de campagne uniquement côté serveur. Placez FileDeliveryStore sur un stockage durable privé. Copiez la tarification fraîchement révisée dans expectedPricing, en comprenant que l'API classify actuelle ne peut pas la verrouiller de manière atomique.
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. Utiliser délibérément
Pour chaque envoi d'API contrôlé, fournissez une deliveryKey stable, toutes les alternatives text/plain et text/html affichées, le rendu exact du snapshot et le snapshotDigest(snapshot). N'acceptez la remote-template limitation que lorsqu'un contrôle opérationnel gèle la révision de la campagne BigMailer correspondant à ce snapshot. Le tableau de bord et les envois d'API non liés contournent ce wrapper.
await integration.send({
deliveryKey: durableBusinessEventId,
snapshot,
snapshotSha256: snapshotDigest(snapshot),
email: recipient,
variables,
});
Résultats, échecs et limites
Le magasin de fichiers réserve la deliveryKey avant la classification. Les résultats de livraison Duplicate, conflict, block, rejection, et les résultats ambigus ne peuvent pas être renvoyés automatiquement. Le point de terminaison d'envoi de BigMailer accepte des données de fusion plutôt que le corps inspecté, par conséquent, une classification réussie n'est pas une preuve que le contenu mutable d'une campagne distante correspond toujours ; utilisez un autre fournisseur lorsqu'un couplage exact est requis.
Confidentialité et opérations payantes
L'analyse envoie le nom d'affichage de l'expéditeur, l'objet et le corps du message à SendRepute. Les destinataires et les pièces jointes ne sont pas transmis séparément, mais le contenu inclus dans le corps est transmis. Gardez les identifiants secrets et désactivez la journalisation des requêtes/corps. Aucune garantie de placement en boîte de réception ou de distribution.
La classification est payante. Prenez connaissance des tarifs actuels et des limites de dépenses de votre compte avant de donner votre consentement. Une requête identique pour le compte/contenu/modèle peut rejouer un reçu dans les 24 heures ; un contenu ou un modèle modifié peut entraîner de nouveaux frais. Ne supposez pas qu'une tentative de rejeu soit gratuite. La réécriture par IA nécessite un devis de charge maximale pour le reçu parent, le mode et les conditions sélectionnés avant toute soumission payante ; interrogez pour un reçu en cours et récupérez les résultats terminés avec l'ID de requête original au lieu de lancer une autre requête. « Tout réécrire » peut vérifier un brouillon final rendu exact sans autre débit. La génération de modèles par IA et l'accès VIP natif font l'objet d'une tarification distincte ; le traitement standard du constructeur est gratuit. Aucun résultat d'analyse, de réécriture ou du constructeur ne garantit la livraison, le placement en boîte de réception ou la conformité.
La validation hors ligne ne constitue pas une certification de chaque version de framework, plugin ou transport. Lisez les instructions d'installation et de sécurité incluses, laissez l'analyse payante désactivée jusqu'à sa configuration délibérée, et testez votre politique d'échec choisie avant de l'activer pour le courrier critique.
Consulter les tarifs
Référence de l'API Client
Demander un support d'intégration