Integrazioni del flusso di lavoro email e SDK
Esplora le API e le integrazioni di SendRepute per l'analisi delle email, le riscritture AI a pagamento e gli strumenti di progettazione. Gli endpoint centrali di analisi, riscrittura e builder non inviano email; le sezioni Campaigns appositamente abilitate e alcuni adattatori possono inviare messaggi tramite il provider configurato. Nessun risultato garantisce il posizionamento in inbox.
Il pacchetto Node.js è disponibile su npm. Altre integrazioni possono essere scaricate qui o installate da un repository GitHub pubblico verificato. Scegli un'integrazione, segui la relativa guida e rivedi i permessi, i prezzi attuali e le impostazioni di errore prima di abilitarla.
Mantieni il tuo attuale flusso di lavoro email. Questi esempi di API centrali analizzano, riscrivono o creano contenuti solo; non inviano mai email. Separatamente, le funzioni di invio Campagne deliberatamente abilitate e alcuni adattatori provider possono inviare tramite il fornitore configurato. Scegli uno strumento in base a installazione, configurazione, esempi e limiti operativi. Gli esempi non vengono eseguiti su questa pagina; esamina separatamente le operazioni a pagamento e le azioni di invio.
Plugin WordPress
0.2.0
Richiede WordPress 5.7+, PHP 7.4+ e OpenSSL. Carica il file ZIP tramite Plugin > Aggiungi nuovo > Carica plugin, quindi apri Impostazioni > SendRepute. Configura il token di ogni sito e il consenso all'analisi a pagamento separatamente. L'evidenza del ciclo di vita installato copre WordPress 6.8.3 con WooCommerce 10.4.3; l'evidenza separata del plugin SMTP copre WordPress 7.1.2 con WP Mail SMTP 4.9.0 e FluentSMTP 2.4.0.
Controlla i messaggi tramite pre_wp_mail senza sostituire l'SMTP o riscrivere i messaggi. La modalità Advisory consente la consegna; la modalità di blocco applica un probability threshold. La policy API failure è configurata separatamente. I plugin che bypassano wp_mail non sono coperti; eventuali modifiche successive al trasporto non vengono analizzate. Il blocco non mette i messaggi in coda.
L'analisi è disabilitata per impostazione predefinita. Configura un token cliente con ambito, esegui il controllo di connessione non a pagamento, rivedi i prezzi e fornisci il consenso esplicito prima di abilitare l'analisi a pagamento. Le azioni manuali dell'IA richiedono una conferma separata.
Scarica lo ZIP per WordPress
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Esegui questi comandi dalla directory di WordPress con WP-CLI disponibile, oppure carica il file ZIP scaricato tramite Plugin > Aggiungi nuovo > Carica plugin e attivalo. Apri Impostazioni > SendRepute. Configura e attiva ogni sito separatamente su multisite. Mantieni una combinazione WordPress/PHP supportata; una versione minima non è una raccomandazione per eseguire software a fine vita.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Configura in modo sicuro
Crea un token cliente lato server con gli scope classify, account:read e catalog:read, scadenza e massimali di spesa. Inseriscilo nelle impostazioni o carica SENDREPUTE_API_TOKEN dal tuo archivio segreti del server come mostrato. I token memorizzati utilizzano la crittografia autenticata con i salt di WordPress e OpenSSL; reinseriscili dopo la rotazione dei salt. Esegui il controllo di connessione non a pagamento, rivedi i prezzi di classificazione, quindi abilita esplicitamente l'analisi automatica. Imposta la modalità consultiva/bloccante, la soglia (threshold) e la politica indipendente 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. Usa deliberatamente
La funzione sottostante utilizza la normale wp_mail e invia solo quando la tua applicazione la richiama. Con l'analisi a pagamento abilitata, il plugin analizza a pre_wp_mail e quindi autorizza o blocca il trasporto esistente. Fornisci il tuo destinatario autorizzato; esegui prima un test verso un mail sink locale senza inoltro. Un risultato falso significa che il chiamante deve gestire l'invio rifiutato: non viene messo in coda.
// 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.'
);
}
Cos'altro può fare?
Le Impostazioni forniscono anche azioni manuali di riscrittura AI e generazione di template con conferma di pagamento separata. La visualizzazione del prezzo richiede vip:read; la riscrittura richiede rewrite; la generazione richiede ai:generate, e la generazione VIP richiede un abbonamento VIP attivo. I risultati sono testo in sola copia con escape: non vengono mai applicati o inviati automaticamente. I token esistenti non acquisiscono scope automaticamente.
Risultati, errori e limiti
La modalità consultiva consente la consegna; il blocco confronta la probabilità di spam finita con la tua soglia. I timeout e i guasti dell'API seguono la policy di fallimento separata, non un'etichetta di spam. I blocchi locali opachi sopprimono l'analisi ripetuta per 24 ore; gli esiti di rete sconosciuti non vengono riprovati automaticamente. Gli invii stessi non sono deduplicati. I controlli degli aggiornamenti installati hanno coperto un archivio ZIP 0.1.0 tracciato aggiornato alla 0.2.0, il rifiuto/salvataggio del nonce dell'amministratore e il percorso WooCommerce selezionato. Una matrice separata di 40 scenari ha coperto entrambi gli ordini di caricamento dei plugin con WP Mail SMTP e FluentSMTP, inclusi To/Cc/Bcc, Reply-To, intestazioni, allegati, rifiuto SMTP ed esiti delle policy. Queste tuple esatte non certificano altre versioni di CMS, plugin SMTP o provider. Gli hook che bypassano wp_mail e le successive modifiche al trasporto rimangono fuori dalla copertura. La disattivazione preserva le impostazioni; la disinstallazione rimuove le credenziali anche quando si mantengono le impostazioni disabilitate. Rimuovi autonomamente un token wp-config.
Adattatore email WooCommerce
0.2.0
Incluso nello stesso ZIP di SendRepute 0.2.0 del plugin WordPress; non esiste un add-on o un download separato per WooCommerce. Richiede i requisiti minimi del plugin: WordPress 5.7+, PHP 7.4+ e OpenSSL. L'adattatore è stato sottoposto a revisione del codice rispetto a WooCommerce 10.4.3, non certificato per ogni versione di WooCommerce o estensione email.
L'analisi WooCommerce ha il proprio interruttore amministratore e selezioni integrate esatte del tipo di email, tutti disattivati per impostazione predefinita. Devono essere attivi anche i controlli globali di analisi e paid-consent. I tipi non selezionati e quelli definiti dalle estensioni ignorano l'analisi. Ogni tipo customer_* integrato selezionato è protetto e solo consultivo: può essere analizzato ma non viene mai bloccato. La posta multipart selezionata fallisce la classificazione prima di qualsiasi richiesta a pagamento; la modalità consultiva o fail-open preserva la consegna, mentre il fail-closed blocca solo la posta non protetta.
Scarica lo ZIP condiviso per WordPress e WooCommerce
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Questo è lo stesso ZIP installabile utilizzato dalla guida WordPress. Installalo una sola volta; non installare un secondo add-on WooCommerce. Attiva SendRepute, quindi apri Impostazioni > SendRepute. Mantieni WordPress, WooCommerce, PHP e il trasporto mail reale supportati e aggiornati.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Configura in modo sicuro
Utilizza un token cliente con ambito (scoped) dai segreti del server o dall'impostazione crittografata di WordPress. Per prima cosa configura il controllo di connessione non a pagamento condiviso, la revisione del prezzo corrente, il consenso paid (pagamento) globale, la modalità di rischio, la soglia e la policy di fallimento. Quindi abilita separatamente l'analisi di WooCommerce e seleziona solo i tipi di email integrati che hai revisionato. I tipi definiti dalle estensioni non vengono mai selezionati automaticamente.
// 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. Usa deliberatamente
Continua a inviare tramite WooCommerce normalmente. L'adattatore avvolge la callback già scelta da WooCommerce e conserva i suoi argomenti originali e il trasporto; non fornisce un nuovo metodo di invio. Se un altro filtro muta gli argomenti della callback, se una mail ordinaria viene nidificata durante quella callback, o se una callback personalizzata non chiama mai wp_mail, l'analisi viene prudentemente bypassata invece di finire nel percorso generale a pagamento. Testa i tipi non critici selezionati con un sink di posta che non effettua l'inoltro.
Risultati, errori e limiti
Le mail a parte singola (single-part) selezionate seguono l'informativa WordPress condivisa, la soglia e le policy di errore, tranne per il fatto che ogni tipo customer_* è protetto e solo consultivo (advisory-only). La posta customer protetta continua sempre dopo un risultato ad alto rischio, un guasto API o contenuto non supportato. WooCommerce costruisce alternative multipart dopo pre_wp_mail, quindi la posta multipart selezionata fallisce prima di qualsiasi richiesta a pagamento invece di essere parzialmente classificata; solo la posta selezionata non protetta può essere rifiutata da un fail-closed. Il contesto del callback viene rimosso dopo il successo, il fallimento e gli invii nidificati.
Backend email Drupal
0.1.0
Richiede Drupal 10.3+ o 11.x e PHP 8.1+. Installa lo ZIP come modulo, concedi administer sendrepute solo agli amministratori fidati, configura un nome visualizzato del mittente non indirizzo delimitato e seleziona le rotte esatte per modulo/chiave mail. La versione 0.1.0 supporta solo php_mail del core di Drupal; è un backend Mail, non un provider o un trasporto sostitutivo. L'evidenza del sito installato copre esattamente le release Drupal 10.6.17 e 11.4.7 con PHP 8.4.10.
Il consenso a pagamento e ogni rotta sono disattivati per impostazione predefinita. Ogni rotta esatta utilizza il delegato fisso core php_mail, la modalità consultiva o di blocco, una policy di fallimento indipendente di conservazione o blocco, la soglia e una deliberata selezione delle email critiche. Le email di account e sicurezza rimangono recapitabili a meno che quella rotta esatta non consenta esplicitamente il blocco critico. La stessa istanza php_mail formatta e invia un unico corpo scalare finale; gli output multipart e con allegati non sono supportati.
Scarica lo ZIP Drupal
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Esegui dalla radice (root) del progetto Drupal, o carica lo ZIP con l'installer dei moduli di Drupal. L'archivio contiene una radice del modulo sendrepute adatta per modules/contrib. Abilitalo, concedi administer sendrepute solo agli amministratori fidati e apri Configurazione > Sistema > SendRepute.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-drupal.zip
unzip sendrepute-drupal.zip -d modules/contrib
drush en sendrepute -y
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-drupal.git
cd sendrepute-drupal
2. Configura in modo sicuro
Memorizza un SENDREPUTE_API_TOKEN con ambito classify esclusivamente nell'ambiente del processo web/PHP. Non viene mai accettato dal modulo né esportato nella configurazione di Drupal. Nel modulo, inserisci un nome visualizzato del mittente obbligatorio di massimo 320 byte senza indirizzo, parentesi angolari o caratteri di controllo. Aggiungi una riga di sette campi per ogni rotta esatta come mostrato; il delegato deve essere php_mail. Scegli la modalità consultiva/di blocco, la policy di fallimento di conservazione/blocco, la soglia e criticità sì/no. Inizia con consultiva, conservazione e 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. Usa deliberatamente
Continua a chiamare il normale gestore di posta di Drupal. Per una rotta con opt-in, sendrepute_mail chiama il metodo format() del core php_mail, analizza quel corpo scalare finale, applica la policy e quindi chiama il metodo mail() della stessa istanza php_mail memorizzata nella cache. Altri ID delegati vengono rifiutati. Non utilizza hook_mail_alter e non riscrive il messaggio.
Risultati, errori e limiti
Un successo convalidato blocca solo alla soglia configurata o al di sopra di essa in modalità blocco. Il risultato completo della classificazione annidata e la risposta di fatturazione sono convalidati prima che spamProbability possa influenzare la consegna. I guasti relativi a API, autenticazione, saldo, rate-limit, formati non corretti, multipart, indicatori di allegati e dimensioni seguono la policy di fallimento della rotta indipendente, ad eccezione della posta critica protetta che continua. La matrice installata 10.6.17/11.4.7 ha coperto l'installazione e la sostituzione dello ZIP in loco mentre è abilitato (enabled), il login reale dell'amministratore, il rifiuto/salvataggio Form API CSRF, la scoperta dei plugin, l'opt-in della rotta, la classificazione sintetica, la preservazione delle email critiche e il php_mail del core attraverso un sink locale. I controlli dei sorgenti di base coprono anche gli archivi immutabili 10.3.0 e 11.0.0; nessuno dei due risultati certifica ogni patch successiva o mailer contribuito. Vengono inviati il nome visualizzato configurato, l'oggetto non vuoto e il corpo delimitato dalla lunghezza; indirizzi, destinatari, intestazioni, parametri e allegati sono esclusi. L'oggetto è limitato a 998 byte e il corpo a 256 KiB. Vi è un unico tentativo HTTPS verificato, senza reindirizzamenti, tentativi o code.
Modulo email PrestaShop
0.1.1
La versione 0.1.1 supporta esattamente PrestaShop 9.0.0, 9.0.1, 9.0.2 e 9.0.3 con PHP 8.1–8.4. Carica lo ZIP in Moduli > Module Manager, quindi configura la classificazione mail di SendRepute. Tutte e quattro le release ufficiali predefinite classic hanno superato l'installazione isolata, la configurazione dell'amministratore autenticato e i controlli di aggiornamento ZIP; le loro implementazioni Mail::send() invariate hanno superato anche la matrice offline real-mail. PrestaShop 8, 9.1+ e le successive patch 9.0 non elencate non sono supportate.
Il modulo, il consenso a pagamento/sui contenuti e la selezione esatta del template sono tutti disattivati per impostazione predefinita. Analizza l'oggetto finale renderizzato e ogni corpo visualizzato supportato senza ricostruire il messaggio Symfony. Un messaggio contenente sia text/plain che text/html viene inviato in una singola richiesta di classificazione delimitata: l'alternativa plain viene resa inerte, l'HTML originale viene preservato e il servizio analizza ogni alternativa tipizzata indipendentemente senza concatenazione. Il risultato utilizza il rischio più elevato con gli audit completi dei contenuti, produce una classificazione a pagamento e non restituisce mai un punteggio di sicurezza parziale. La modalità consultiva non interrompe mai l'invio. Il blocco per soglia e il fail-closed sollevano un'eccezione che implementa sia l'ExceptionInterface di Symfony Mailer che la ModuleErrorInterface di PrestaShop; su ogni release supportata, i test installati hanno osservato Mail::send() restituire false senza alcuna consegna SMTP. La policy di fallimento è indipendente dalla soglia di rischio.
Scarica lo ZIP PrestaShop
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Scarica lo ZIP 0.1.1, quindi utilizza Moduli > Gestione Moduli > Carica un modulo e selezionalo. Apri Configura per la classificazione della posta SendRepute. Non forzare l'installazione al di fuori delle versioni esatte PrestaShop 9.0.0–9.0.3: il comportamento di cancellazione e firma dipende dai percorsi Mail::send() verificati.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-prestashop.zip
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-prestashop.git
cd sendrepute-prestashop
2. Configura in modo sicuro
Imposta SENDREPUTE_API_BASE all'origine HTTPS di produzione canonica di SendRepute fornita per questo modulo e SENDREPUTE_API_TOKEN a un token server con ambito nell'ambiente PHP-FPM/server. La base deve essere un'origine DNS pubblica HTTPS senza percorsi; letterali, credenziali, reindirizzamenti e risposte DNS private vengono rifiutati. Esegui il controllo di connessione account/pricing non a pagamento, quindi abilita esplicitamente il modulo, il consenso paid/content e i nomi esatti dei template. Scegli indipendentemente advisory/block, la soglia e la policy di errore open/closed.
export SENDREPUTE_API_BASE="replace-with-the-canonical-sendrepute-https-origin"
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
3. Usa deliberatamente
Continua a utilizzare il normale flusso Mail::send di PrestaShop. L'hook iniziale memorizza solo un template esatto per cui è stato dato il consenso. L'hook finale legge l'oggetto, il corpo del testo e il corpo HTML della Symfony Email già renderizzata senza modificare destinatari, header, allegati o transport. Per i corpi doppi, invia il testo normale inerte e l'HTML originale come alternative tipizzate in un'unica richiesta; la normalizzazione indipendente del servizio impedisce a un frammento di consumarne un altro, mantenendo le destinazioni visibili di link e immagini HTML per l'audit. Un singolo corpo semplice rimane sul percorso ristretto del testo inerte, e un singolo corpo HTML rimane sul percorso ristretto dell'estrazione DOM. La classificazione si completa prima che PrestaShop crei un messaggio separato firmato con DKIM. La matrice delle versioni supportate ha verificato la struttura multipart emessa, oltre all'hash del corpo DKIM e alla firma RSA dopo la classificazione. Il percorso di firma fissato di PrestaShop omette Bcc dagli header firmati preparati e perde quel destinatario SMTP cieco; l'evidenza di una firma valida non stabilisce quindi la compatibilità della consegna Bcc. Non combinare DKIM e Bcc su questo percorso supportato. Sorgenti di visualizzazione non supportate, semantica attiva, HTML quoted-printable o base64 ambiguo e contenuti aggregati eccessivi seguono la failure_policy configurata prima del pagamento. Lascia i template critici non selezionati a meno che non siano deliberatamente approvati.
Risultati, errori e limiti
Il classificatore accetta un corpo text/plain, un corpo text/html o entrambi come alternative visualizzate analizzate indipendentemente. Il testo letterale, le entità, i contenuti nascosti e di stile in un'alternativa accettata non possono consumare o nascondere un'alternativa successiva; l'HTML ambiguo quoted-printable o base64 viene rifiutato prima del pagamento. Qualsiasi alternativa accettata può determinare il risultato a rischio più elevato, mentre i contentAudit coprono ogni alternativa; la classificazione viene addebitata una sola volta dopo che l'input limitato completo è stato accettato. Il corpo legacy richiesto duplica esattamente l'alternativa semplice inerte per un messaggio doppio, e quel duplicato più entrambe le alternative tipizzate condividono il budget esatto della richiesta di 524288 byte. Destinatari, allegati e risorse incorporate sono esclusi, e il messaggio transport originale pre-firma viene preservato. Il fixture real-mail controlla separatamente l'integrità MIME/firma e i destinatari SMTP effettivi: le firme DKIM rimangono valide dopo la classificazione, ma il percorso firmato a monte verificato non preserva i destinatari Bcc. Una classificazione convalidata memorizza un riepilogo consultivo limitato più recente. La modalità di blocco lancia un'eccezione solo alla soglia o sopra di essa; l'eccezione della doppia interfaccia sopravvive al dispacciamento dell'hook e produce false prima del trasporto su tutte e quattro le versioni installate. I contenuti non supportati, gli errori API e di validazione seguono le modalità aperta/chiusa indipendentemente. Un tentativo HTTPS utilizza DNS pubblico fissato, TLS verificato, timeout finiti, un limite di risposta di 256 KiB, nessun redirect e nessun tentativo di retry. Il blocco si affida all'intercettazione dell'eccezione Mail::send() verificata di PrestaShop, non al valore di ritorno dell'hook finale.
Adattatore Symfony Mailer
0.1.1
Richiede PHP 8.1+ e supporta esclusivamente Symfony Mailer 6.4 o 7.4; le versioni verificate sono 6.4.46 e 7.4.19. Non è garantita la compatibilità con Symfony 8.1 o linee non testate. Installare il file ZIP sorgente locale tramite un repository path di Composer; questo pacchetto non è pubblicato su Packagist.
Il bundle e il consenso a pagamento sono disattivati per impostazione predefinita, e solo un messaggio con l'esatto header di opt-in configurato è idoneo. La policy di punteggio consultiva o di blocco è indipendente dalla policy di fallimento di autorizzazione o blocco. La classificazione viene eseguita sul MessageEvent ufficiale pre-invio; il rifiuto utilizza MessageEvent::reject(). Gli eventi clone in coda vengono saltati, rendendo l'evento di trasporto del worker l'unico punto di classificazione a pagamento.
Scarica il sorgente Symfony in formato ZIP
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Estrai lo ZIP scaricato in una directory dedicata per i pacchetti, registra tale directory come repository path di Composer, richiedi il pacchetto esatto 0.1.1 e registra SendRepute\Symfony\SendReputeBundle se Flex non lo fa. L'archivio sorgente è locale e non pubblicato.
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
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-symfony.git
cd sendrepute-symfony
2. Configura in modo sicuro
Risolvi SENDREPUTE_API_TOKEN dai segreti del server. Mantieni enabled e paid_analysis_consent a false durante la revisione dei prezzi attuali. La modalità, la soglia e la policy di fallimento sono indipendenti. L'endpoint è fissato su HTTPS verificato con scadenze limitate, senza reindirizzamenti o tentativi, e un limite di risposta di 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. Usa deliberatamente
Aggiungi l'header di opt-in esatto solo agli oggetti Email non critici revisionati, quindi procedi attraverso il normale Mailer. Il messaggio, l'envelope, il transport e l'header non vengono riscritti. Per la consegna tramite Messenger, configura il bundle nei worker: gli eventi producer clone intenzionalmente non vengono classificati.
$email->getHeaders()->addTextHeader('X-SendRepute-Classify', 'yes');
$mailer->send($email);
Risultati, errori e limiti
È supportato esattamente un corpo in-memory text o HTML. Alternative miste, DataParts testuali, stream o percorsi, parentesi graffe CSS, markup, sintassi quoted-printable, header base64 o whole-body base64 falliscono prima del pagamento e seguono la policy di fallimento; il contenuto ordinario senza parentesi graffe rimane invariato. Ogni campo obbligatorio di risposta nidificato e ogni ramo opzionale di audit viene validato e le proprietà sconosciute vengono rifiutate. La modalità consultiva non blocca mai in base al punteggio; il blocco rifiuta alla soglia tramite l'evento reale di trasporto.
Adattatore Rails Action Mailer
0.1.0
Richiede Ruby 3.2+ ed è verificato in modo specifico con le versioni reali Action Mailer 7.1.6 e Mail 2.9.1; il percorso di callback è stato osservato anche su Action Mailer 7.2.3.2. Questa non è una certificazione per ogni rilascio Rails 7.x consentito. Installa il sorgente locale ZIP tramite Bundler; non è dichiarata alcuna pubblicazione su RubyGems.
Entrambi i gate a pagamento globali sono disattivati per impostazione predefinita, e ogni azione del mailer deve chiamare esplicitamente sendrepute_paid_preflight!. Il comportamento del punteggio consultivo/di blocco e il comportamento di fallimento preserva/blocca sono indipendenti. Le rotte per password resets, MFA, login, verification, billing e security dovrebbero rimanere non selezionate. Ogni messaggio multipart e contenuti ambigui CSS, quoted-printable o dall'aspetto base64 vengono rifiutati prima del pagamento; un corpo di testo decodificato o HTML accettato viene analizzato senza modificare il messaggio originale o il trasporto.
Scarica il file ZIP dei sorgenti Rails
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Estrai lo ZIP esattamente in vendor/sendrepute-rails, aggiungi la voce del percorso locale al Gemfile, esegui Bundler nel tuo ambiente controllato e includi SendRepute::Rails::Mailer in ApplicationMailer. Questa non è un'installazione tramite RubyGems.
# Download sendrepute-rails.zip, then extract it into vendor/sendrepute-rails.
gem "sendrepute-rails", path: "vendor/sendrepute-rails"
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-rails.git
cd sendrepute-rails
2. Configura in modo sicuro
Mantieni enabled e paid_consent a false finché non vengono rivisti i prezzi attuali e le rotte. Leggi il token dai Rails credentials o da un altro segreto del server. Configura advisory/block, preserve/block e threshold indipendentemente; i callback on_result e on_error non devono registrare il contenuto del messaggio, i dati di autorizzazione o le risposte complete.
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. Usa deliberatamente
Chiamare sendrepute_paid_preflight! solo all'interno di ogni azione mailer non critica deliberatamente selezionata. Le azioni normali saltano la classificazione. L'hook a pagamento utilizza la rotta before_deliver di Action Mailer; non viene fornito alcun auto-opt-in globale e l'adapter non riscrive il Mail::Message.
class ApplicationMailer < ActionMailer::Base
include SendRepute::Rails::Mailer
end
def newsletter
sendrepute_paid_preflight!
mail(to: params[:to], subject: "News")
end
Risultati, errori e limiti
È supportato un singolo corpo visualizzato decodificato come text/plain o text/html. Ogni input di normalizzazione multipart o ambiguo fallisce prima del pagamento e segue la failure_policy. Una risposta nidificata tipizzata completa può bloccare solo in modalità blocco al raggiungimento o superamento della soglia; la modalità advisory preserva ogni punteggio. I callback di risultato ed errore ricevono dati sicuri immutabili, e le eccezioni dei callback o throw(:abort) vengono catturate localmente in modo da non terminare l'advisory o preservare la consegna. L'endpoint fisso rifiuta reindirizzamenti e tentativi e utilizza una scadenza totale limitata. Test reali su Action Mailer 7.1.6 superati: 19 esecuzioni e 59 asserzioni; non si è verificata alcuna richiesta a pagamento o consegna reale.
Adattatore Spring JavaMailSender
0.1.1
Richiede Java 17+ e supporta Spring Framework 6.2.x JavaMailSender; la verifica esatta delle dipendenze è stata effettuata con Spring Framework 6.2.19. Non sono presenti dichiarazioni per Spring Boot 4 o per versioni generiche del framework. Compilare il file ZIP dei sorgenti locali con Maven; il pacchetto non è pubblicato su Maven Central o altri registri.
Il decorator, paidConsent, la modalità advisory e i valori predefiniti per allow-on-failure sono espliciti. Solo sendWithSendRepute(...) esegue l'analisi a pagamento pre-invio; ogni sovraccarico ordinario di send(...) ignora la classificazione e delega senza modifiche. Utilizzare la normale send per comunicazioni critiche, a meno che quel singolo invio non sia deliberatamente selezionato. Le alternative MIME supportate e visualizzate vengono incorniciate insieme in modo inerte; i contenuti non supportati, annidati, firmati, crittografati o ambigui generano un errore prima del pagamento.
Scarica il sorgente Java per Spring in formato ZIP
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Estrarre lo ZIP dei sorgenti 0.1.1, eseguire mvn verify e installarlo solo nel proprio repository Maven locale controllato. L'applicazione utilizzatrice fornisce il proprio JavaMailSender esistente e l'implementazione runtime del sistema mail. La verifica esatta delle dipendenze ha utilizzato bytecode Java 17+, Spring Framework 6.2.19 e le versioni documentate nel file README incluso.
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
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-java.git
cd sendrepute-java
2. Configura in modo sicuro
Costruisci SendReputeConfiguration da un token lato server e switch espliciti. Mantieni enabled e paidAnalysisConsent a false fino a quando i prezzi e le chiamate selezionate non saranno stati esaminati. La modalità consultiva/di blocco, la soglia e la policy di fallimento di autorizzazione/blocco sono indipendenti. L'endpoint è fissato su HTTPS verificato senza reindirizzamenti o tentativi.
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. Usa deliberatamente
Chiamare sendWithSendRepute(...) solo per singoli oggetti SimpleMailMessage, MimeMessage o MimeMessagePreparator che devono essere sottoposti ad analisi. Sono supportati overload singoli e varargs. Ogni normale overload di send(...) ignora la classificazione. I preparatori effettuano il rendering una sola volta e il MIME originale preparato viene delegato dopo che la policy lo consente.
// Paid classification is possible only on this explicit method.
reviewedSender.sendWithSendRepute(reviewedMessage);
// Every ordinary JavaMailSender send overload bypasses classification.
reviewedSender.send(criticalMessage);
Risultati, errori e limiti
Tutte le parti plain e HTML visualizzate supportate vengono analizzate; destinatari e allegati sono esclusi. L'attraversamento è limitato a 16 livelli, 256 parti e 524,288 byte UTF-8 visualizzati. I binari inline ignorati non vengono mai materializzati; sorgenti visualizzate lazy sconosciute o illimitate falliscono prima dell'apertura di uno stream o dell'invio di una richiesta a pagamento, e le letture delle sorgenti supportate sono limitate. Il framing tramite entità numeriche mantiene i frammenti inerti attraverso l'ordine di normalizzazione del server controllato. Interi batch varargs vengono preparati e normalizzati prima della prima richiesta a pagamento, e l'ispezione non genera intestazioni Jakarta Mail. È richiesta una risposta nidificata ricorsivamente esatta.
Adattatore mail per Magento Open Source
0.1.1
Supporta solo Magento Open Source 2.4.7-p5 e 2.4.7-p6 con i sorgenti mail-interface immutabili esatti revisionati. I test con fixture offline tipizzate hanno avuto esito positivo, ma non è stata eseguita un'installazione completa di Magento; nessun'altra release di Magento o Adobe Commerce è certificata. Installare lo ZIP locale tramite un repository di percorsi Composer; non è un pacchetto Adobe Marketplace.
Il modulo, il consenso a pagamento e le liste di instradamento sono tutti disattivati per impostazione predefinita. Ogni identificatore di template richiede due approvazioni esatte indipendenti; la criticità non viene mai dedotta dal suo nome. Il plugin aroundSendMessage analizza al limite finale del trasporto senza ricostruire il messaggio. La politica di soglia advisory/block e la politica di errore preserve/block sono indipendenti; il blocco genera una MailException visibile in Magento. Parti MIME multiple visualizzate e contenuti ambigui falliscono prima del pagamento.
Scarica il file ZIP dei sorgenti per Magento
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Estrarre lo ZIP in una directory pacchetti conservata, registrare la sua root SendRepute_MailAdapter come repository di percorsi Composer, richiedere la versione 0.1.1, quindi utilizzare il normale processo di abilitazione del modulo e di aggiornamento della configurazione di Magento. Non rappresentare questo archivio locale come un pacchetto 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
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-magento.git
cd sendrepute-magento
2. Configura in modo sicuro
Impostare SENDREPUTE_API_TOKEN solo nell'ambiente server PHP-FPM e CLI. In Stores > Configuration > Services > SendRepute, mantenere inizialmente disattivati il modulo e il consenso a pagamento. Aggiungere ogni identificatore esatto di template a entrambe le liste indipendenti di approvazione dei percorsi; i nomi, inclusi i nomi numerici, non deducono mai la criticità. Configurare separatamente advisory/block, threshold e il comportamento di errore preserve/block.
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
# Then configure Stores > Configuration > Services > SendRepute.
3. Usa deliberatamente
Continua a utilizzare il normale flusso di template e trasporto di Magento. La correlazione del percorso registra l'identificatore esatto e il negozio selezionato tramite TransportBuilder, mentre il plugin aroundSendMessage finale legge le interfacce ufficiali tipizzate per email e MIME prima di chiamare lo stesso trasporto. Lo stato del builder viene pulito nel blocco finally, e le correlazioni builder/messaggio utilizzano voci WeakMap con chiavi oggetto, così che un trasporto costruito e abbandonato non possa lasciare autorizzazioni riutilizzabili basate su ID-oggetto numerici. L'adattatore non fornisce un nuovo metodo send(...) o muta il messaggio.
Risultati, errori e limiti
Viene accettata solo una parte MIME visualizzata supportata; gli allegati vengono preservati ma esclusi dall'analisi. Parti visualizzate multiple, codifiche di trasferimento o set di caratteri non supportati, stream, MIME nidificati e testo normalizzato ambiguo falliscono prima del pagamento. Una richiesta HTTPS verificata ha scadenze limitate e dimensioni della risposta definite, senza tentativi di retry o reindirizzamenti. Un risultato nidificato valido può bloccare al raggiungimento della soglia; la configurazione fail-block solleva una MailException di Magento.
Adattatore .NET MailKit
0.1.0
Richiede .NET 8 e una dipendenza specifica verificata per MailKit/MimeKit 4.18.0. Si tratta di un wrapper esplicito attorno a un IMailTransport di proprietà dell'applicazione, non di un hook globale, di un client SMTP o di un trasporto sostitutivo. Compilare o fare riferimento al file ZIP dei sorgenti locali; non è dichiarata alcuna pubblicazione su NuGet.
L'adattatore e il consenso a pagamento sono disattivati per impostazione predefinita; advisory e preserve-send sono impostazioni predefinite indipendenti. Le chiamate a AnalyzeAsync, AnalyzeThenSend o AnalyzeThenSendAsync sono esplicite. Le email critiche di sicurezza/account necessitano di una categoria e un consenso separati per ogni chiamata. Ogni alternativa plain/HTML supportata visualizzata viene inquadrata in modo inerte in un'unica richiesta limitata; i contenuti non supportati, nidificati, firmati o crittografati falliscono prima del pagamento. Il MimeMessage originale e il cancellation token raggiungono il trasporto esistente solo dopo che la policy lo consente.
Scarica il file ZIP del codice sorgente .NET MailKit
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Estrarre lo ZIP dei sorgenti e fare riferimento a src/SendRepute.MailKit/SendRepute.MailKit.csproj dal progetto .NET 8 che lo utilizza. Il ripristino ottiene MailKit/MimeKit 4.18.0. Questo pacchetto sorgente è locale e non pubblicato; non si tratta di un'installazione 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
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-dotnet.git
cd sendrepute-dotnet
2. Configura in modo sicuro
Avvolgi l'esistente IMailTransport di proprietà dell'applicazione con SendReputeMailAdapter. Leggi il token API dalla configurazione del server e mantieni Enabled e PaidAnalysisConsent su false fino alla revisione. La soglia di avviso/blocco e le impostazioni di mantenimento/blocco in caso di errore sono indipendenti. L'endpoint, il limite minimo TLS, il comportamento a tentativo singolo, le scadenze e i limiti di 1 MiB sono fissi.
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. Usa deliberatamente
Richiama AnalyzeAsync solo per l'analisi, oppure AnalyzeThenSend e AnalyzeThenSendAsync per un comportamento esplicito pre-invio. Nessun percorso email ordinario o globale viene intercettato. Passa il consenso a pagamento e la categoria del messaggio su ogni operazione selezionata; le email critiche di sicurezza/account richiedono l'impostazione separata del consenso critico.
await adapter.AnalyzeThenSendAsync(message, new AnalysisConsent {
PaidAnalysisConsent = true,
Category = MessageCategory.Ordinary
}, cancellationToken);
Risultati, errori e limiti
La decodifica MimeKit effettiva raccoglie ogni alternativa di testo plain e HTML visualizzata supportata in un framing inerte escludendo destinatari e allegati. Il framing esterno non-base64 e le entità decodificate tardivamente neutralizzano parentesi graffe CSS, testo quoted-printable, header base64, l'intero corpo base64 e il markup prima della normalizzazione del servizio. I contenuti visualizzati non supportati, annidati, firmati o crittografati falliscono prima del pagamento. Ogni campo di risposta richiesto è tipizzato; l'opzionale flaggedTermCount deve essere un intero non negativo e l'opzionale contentAudit è validato in modo completo e ricorsivo rispetto al contratto pubblico. L'originale MimeMessage esatto e il token di cancellazione raggiungono il trasporto fornito solo quando il punteggio indipendente e le failure_policy lo consentono.
Analisi manuale della bozza su Zapier
0.2.0
Ricetta manuale Zapier per visualizzare l'analisi a pagamento di esattamente tre stringhe bozza selezionate dal proprietario. Non è un'app Zapier di SendRepute, un elenco di marketplace, un artefatto di importazione, un adattatore pre-invio, un mittente, un instradamento consenti/blocca o un classificatore dell'intero messaggio. Zapier Webhooks utilizza un proxy HTTPS limitato gestito dal proprietario poiché il token SendRepute non deve entrare in Zap.
Due costanti a tempo di compilazione sono impostate per impostazione predefinita su false prima di HTTP. Lo Zap mappa solo il nome visualizzato del mittente, l'oggetto e il corpo, invia il JSON al design del proxy del proprietario incluso, convalida completamente la risposta nidificata, quindi visualizza i campi consultivi e di fatturazione in una fase di revisione privata. Non deve aggiungere un mittente, l'applicazione di Paths, Autoreplay o un instradamento per la conservazione dei guasti; i passaggi Code o Webhook non riusciti si interrompono.
Scarica il file ZIP delle ricette Zapier e Make
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Scarica ed estrai il sorgente della ricetta 0.2.0 condivisa. Leggi la guida Zapier inclusa e distribuisci il proxy Node di loopback incluso solo dietro un reverse proxy HTTPS gestito dal proprietario. Questo pacchetto non lo distribuisce. Non esiste un'app Zapier di SendRepute o un artefatto Zap importabile.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cd sendrepute-automation-recipes
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Configura in modo sicuro
Mantieni lo Zap spento. Nel codice sorgente esatto del preflight, ENABLED e PAID_CONSENT rimangono entrambi false finché l'uso a pagamento non viene revisionato. Il proxy del proprietario memorizza SENDREPUTE_API_TOKEN; lo Zap riceve solo una credenziale revocabile separatamente da SENDREPUTE_PROXY_CREDENTIALS. Gli editor e la cronologia delle attività potrebbero esporla, quindi limitatela, ruotatela e revocatela. Configura i limiti di token-bucket e concorrenza per credenziale, i limiti globali di connessione/concorrenza, un budget giornaliero per chiamate a pagamento persistente impostato dal proprietario, limiti di spesa a monte restrittivi e controlli corrispondenti di dimensione/velocità/scadenza del terminatore TLS. Non abilitare Autoreplay.
// In zapier/preflight.js; review charges before changing either literal.
const ENABLED = false;
const PAID_CONSENT = false;
3. Usa deliberatamente
Crea i passaggi manualmente: bozza del trigger; mappatura Code preflight solo per mittente, oggetto e corpo; Webhooks POST con righe JSON verso il proxy del proprietario; Code per la validazione della risposta; visualizzazione della revisione privata. Non interpolare mai manualmente JSON grezzo. Visualizza solo requestId, model, label, spamProbability e billing; non aggiungere un'azione mail o una decisione Paths.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Risultati, errori e limiti
La ricetta analizza solo le tre stringhe mappate; i MIME non mappati, le alternative HTML, gli allegati e l'eventuale contenuto in uscita rimangono non analizzati. Il preflight conservativo rifiuta i trigger noti del normalizzatore ma non garantisce la copertura dell'intero messaggio. I limiti di frequenza, concorrenza e budget giornaliero del proxy rifiutano prima dell'upstream, e la prenotazione del budget persiste prima del tentativo a pagamento; esegui un processo proxy per file di budget. Il proxy effettua un unico tentativo HTTPS fisso e limitato. Qualsiasi risposta esatta non-200 o incompleta lancia un errore e si interrompe; non esiste alcun mantenimento, Resume o risultato sostitutivo.
Analisi manuale della bozza su Make
0.2.0
Istruzioni manuali dello scenario Make per visualizzare l'analisi a pagamento di esattamente tre stringhe di bozza selezionate. Non è un blueprint, un'app SendRepute approvata, un mittente di posta, un percorso di applicazione o una dichiarazione su MIME non mappati, HTML, allegati o eventuale contenuto in uscita. Il bearer token appartiene esclusivamente al portachiavi sicuro di Make HTTP.
I valori booleani persistenti enabled e paidConsent sono predefiniti come false e un filtro AND si interrompe prima di HTTP. Il JSON è prodotto dal modulo JSON di Make e inviato una sola volta dal modulo HTTP con reindirizzamenti e tentativi disabilitati. Un filtro di risposta è solo una protezione per la visualizzazione, non una validazione completa o un permesso di invio. I guasti HTTP utilizzano Break, mai Resume o output sostitutivo.
Scarica lo ZIP della ricetta Zapier e Make
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Scarica ed estrai il codice sorgente della ricetta condivisa 0.2.0, quindi segui la guida Make inclusa per costruire manualmente i moduli nativi correnti. Non viene rivendicato alcun blueprint, marketplace app o formato di importazione. Mantieni disattivata la pianificazione degli scenari durante i test contro un endpoint mock.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cat sendrepute-automation-recipes/make/README.md
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Configura in modo sicuro
Crea variabili Tools booleane persistenti enabled=false e paidConsent=false, seguite da un filtro AND che richiede entrambe true. Usa JSON > Create JSON esattamente per sender, subject e body. Memorizza il bearer token di SendRepute solo nel portachiavi sicuro dell'app HTTP; gli scenari esportati non devono contenere alcuna credenziale.
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. Usa deliberatamente
Configura una HTTP POST verso l'URL fisso classify. Seleziona come tipo di Body Raw e il controllo content-type application/json senza aggiungere un header di testo libero in conflitto, quindi mappa l'output serializzato da JSON > Create JSON. Abilita la risposta analizzata, disabilita i reindirizzamenti, imposta un timeout di 10 secondi e non aggiungere alcun ripetitore o tentativo automatico (retry). Richiedi il limite di risposta di 1 MiB del modulo; se non disponibile, utilizza invece un proxy delimitato controllato dal proprietario. Aggiungi solo una visualizzazione di revisione privata dopo il Minimal display guard—mai un mittente o un router allow/block.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Risultati, errori e limiti
Vengono analizzate solo le stringhe mappate; la normalizzazione non coincide con l'identità di un'email originale o in uscita. Il filtro di risposta verifica esclusivamente lo status e la presenza del risultato principale/fatturazione e non costituisce esplicitamente una validazione completa dello schema o un'imposizione. Gli errori HTTP utilizzano Break in modo che le azioni successive non vengano eseguite; non utilizzare mai Resume, output fabbricati o percorsi che preservano il fallimento.
SDK Node.js
0.1.1
SDK solo lato server per Node.js 18.17+. Installa @sendrepute/node da npm o usa il tarball scaricabile. L'adattatore Nodemailer opzionale preserva il trasporto esistente. Imposta una chiave API con ambito e un URL di base API esplicito nel tuo ambiente server, mai nel codice del browser.
Registra createSendReputePlugin nella fase di stream solo dopo aver rivisto i prezzi e abilitato deliberatamente il consenso all'analisi a pagamento. La modalità Advisory segnala i risultati senza bloccare la consegna. La modalità di blocco applica spamProbabilityThreshold; onApiFailure sceglie tra allow o block, mentre un rifiuto per cambio di prezzo blocca sempre la consegna. La classificazione è un'operazione API a pagamento.
Scarica il tarball Node.js
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
Visualizza il pacchetto npm verificato
1. Installa
Il pacchetto npm verificato è @sendrepute/node versione 0.1.1; blocca le installazioni del registro a @sendrepute/node@0.1.1. Il tarball del sito web e il repository pubblico bloccato forniscono il sorgente e la build della release 0.1.1. Nodemailer è opzionale e necessario solo per l'adattatore del transport. L'SDK supporta richieste API cliente tipizzate per account, catalogo, classificazione, AI e builder. Utilizzalo in un server Node.js, mai in un bundle browser.
npm install @sendrepute/node nodemailer
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
npm install @sendrepute/node@0.1.1
npm install nodemailer
2. Configura in modo sicuro
Inserisci SENDREPUTE_API_KEY dal tuo archivio segreti del server e imposta l'URL di base esplicito di seguito per l'API cliente ospitata. Non incollare segreti nei comandi, nei file sorgente o nei log. Concedi solo gli scope richiesti dalle tue operazioni. La configurazione utilizza un trasporto di rendering locale, non SMTP; maxRetries è impostato a zero qui per rendere deliberati i tentativi a pagamento.
export SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
Configurazione Nodemailer
Questo esempio configura un trasporto di rendering locale e non chiama sendMail. L'invio tramite il plugin configurato esegue un'analisi a pagamento. Sostituisci il trasporto locale con il tuo trasporto SMTP esistente solo quando sei pronto.
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. Usa deliberatamente
Utilizza il client della configurazione sopra indicata. Leggi l'account e i prezzi correnti prima di visualizzare un'azione di consenso. Invoca classifyAfterConsent solo da un'azione server autenticata dopo la conferma; restituisce la classificazione tipizzata e la risposta di fatturazione. L'invio tramite il plugin Nodemailer configurato è anch'esso un'azione di classificazione a pagamento. L'adattatore richiede paidAnalysisConsent: true e rifiuta qualsiasi altro valore prima della registrazione; impostalo solo dopo l'autorizzazione.
// 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", {}),
]);
}
Builder VIP standard e nativi
Il builder standard gratuito importa, convalida, compila ed esporta MJML come HTML, MJML o un file ZIP di entrambi. Il builder nativo VIP separato utilizza il proprio formato di documento, non MJML: le sue operazioni di importazione, convalida, compilazione ed esportazione richiedono un abbonamento attivo e un diritto di accesso aperto e di proprietà, e il suo file ZIP contiene tre varianti HTML CSS. La generazione AI opzionale è pagata separatamente e produce un design MJML standard modificabile o un design VIP nativo; mostra il prezzo effettivo corrente e trasmetti il valore confermato expectedPriceMillicents, mai un prezzo codificato. Le risposte ZIP contengono archiveBase64, non un campo html: decodeExportBytes restituisce i byte che la tua applicazione deve salvare. Questi endpoint di elaborazione non recuperano risorse, non salvano design né inviano email.
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 },
});
}
Cos'altro può fare?
Gli ID operazione generati coprono le letture di account e prezzi, la classificazione e le modifiche manuali, la riscrittura AI/generazione di template, i piani/stato/acquisti VIP, i template nativi/diritti di accesso e l'importazione/esportazione standard/nativa senza stato. Consulta gli esempi sorgente e il riferimento API cliente per ogni tipo di richiesta, lo scope richiesto e il prezzo corrente. Le letture del catalogo non acquistano l'accesso. Nuove funzionalità a pagamento richiedono token con scope deliberati e una conferma esplicita dell'interfaccia utente.
Risultati, errori e limiti
SendReputeError espone status, code e requestId; conserva solo questi metadati operativi sicuri. Non registrare mai corpi, prompt, header o risposte complete. AbortSignal annulla il lavoro; timeoutMs si applica per tentativo. I tentativi limitati sono consapevoli dell'operazione e la protezione della ricevuta è limitata nel tempo, non è una fatturazione exactly-once illimitata. La modalità Advisory Nodemailer segnala senza bloccare; il blocco utilizza spamProbabilityThreshold e onApiFailure in modo indipendente. Preserva e testa separatamente il tuo transport reale.
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;
}
}
Riferimento API e metodi
SendReputeClient richiede apiKey e baseUrl; l'opzione facoltativa timeoutMs è predefinita a 30000 (massimo 300000), maxRetries è predefinito a 2 (intervallo 0–10) e fetch accetta un'implementazione server compatibile. request(operationId, input, { signal }) restituisce la risposta tipizzata dell'operazione; input contiene il corpo, il percorso e/o i campi della query. Una configurazione non valida genera TypeError; i guasti delle API utilizzano SendReputeError con status, code, requestId e retryAfterMs. decodeExportBytes converte un'esportazione ZIP in Uint8Array e rifiuta input non ZIP o base64 non validi. OperationInput, OperationResponse e i tipi di schema generati sono esportati per i chiamanti TypeScript.
Alternativa: racchiudere un transport Nodemailer di basso livello
createSendReputeTransport(existingTransport, options) avvolge un oggetto transport esistente con i metodi send, close opzionale e verify; non è un transporter sendMail. Scegli questo o createSendReputePlugin, non entrambi, per evitare una doppia analisi. Entrambi accettano client e policy più model, stringa/risolutore sender, signal e onDiagnostic opzionali. I callback di diagnostica non possono modificare la consegna. I codici SendReputeNodemailerError distinguono tra policy/messaggio non validi, contenuto non supportato, blocchi spam e blocchi per errori API. Il pacchetto npm 0.1.1 pubblicato e il download 0.1.1 del sito web combinano tutte le alternative in-memory text/plain e text/html visualizzate in un'unica richiesta di classificazione limitata; in modalità blocco, rifiutano le alternative visualizzate non supportate. I messaggi grezzi, gli stream, i percorsi e gli URL rimangono non supportati.
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);
},
});
}
Tutte le 49 operazioni dell'API per il cliente
Espandi un'operazione per visualizzare il tipo esatto di input dell'SDK, il tipo restituito, lo scope e gli stati HTTP documentati. Il link allo schema apre i parametri completi, i campi di risposta e gli esempi nel riferimento dell'API per il cliente. Questi wrapper utilizzano il client configurato sopra; è richiesta la conferma e nulla viene eseguito automaticamente. Le operazioni di lettura non autorizzano acquisti. Mutazioni, pagamenti, chiusura dell'accesso e AI a pagamento richiedono la corrispondente azione deliberata dell'account.
Preventiva una singola analisi aggregata degli insight della campagna
POST /v1/campaign-insights/quote
Scope richiesto: ai:generate
Input: { body: CustomerCampaignInsightsQuoteInput; }
Restituisce: CustomerCampaignInsightsQuote
Stati HTTP documentati: 200, 400, 401, 403, 429, 503
Parametri, schemi ed esempi 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.
Analizza le metriche aggregate di consegna della campagna con AI
POST /v1/campaign-insights/analyze
Scope richiesto: ai:generate
Input: { body: CustomerCampaignInsightsAnalyzeInput; }
Restituisce: CustomerCampaignInsightsAnalysis
Stati HTTP documentati: 200, 400, 401, 402, 403, 409, 413, 429, 502, 503
Parametri, schemi ed esempi 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 });
}
Elenca i modelli del classificatore dell'API per il cliente
GET /v1/models
Scope richiesto: models:read
Input: Record<string, never>
Restituisce: CustomerApiModelsResponse
Stati HTTP documentati: 200, 401, 403, 429, 503
Parametri, schemi ed esempi 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 });
}
Ottieni l'utilizzo e i limiti dell'API del cliente
GET /v1/usage
Scope richiesto: usage:read
Input: Record<string, never>
Restituisce: CustomerApiUsageResponse
Stati HTTP documentati: 200, 401, 403, 429, 503
Parametri, schemi ed esempi 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 });
}
Classifica una email del cliente
POST /v1/classify
Scope richiesto: classify
Input: { body: CustomerClassificationInput; }
Restituisce: CustomerClassificationResponse
Stati HTTP documentati: 200, 400, 401, 402, 403, 409, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Ottieni l'account corrente e il saldo
GET /v1/account
Scope richiesto: account:read
Input: Record<string, never>
Restituisce: Account
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi 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 });
}
Ottieni il link di referral dell'account corrente e l'attività dei premi
GET /v1/account/referrals
Scope richiesto: account:read
Input: { query?: { page?: number; pageSize?: number; }; }
Restituisce: ReferralDashboard
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi 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 });
}
Elenca il registro dei crediti dell'account corrente
GET /v1/account/ledger
Scope richiesto: billing:read
Input: { query?: { kind?: "usage" | "payments"; limit?: number; offset?: number; }; }
Restituisce: Array<CreditLedgerEntry>
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi 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 });
}
Elenca le fatture Bitcoin dell'account corrente
GET /v1/payments/invoices
Scope richiesto: billing:read
Input: { query?: { limit?: number; offset?: number; }; }
Restituisce: Array<BitcoinInvoice>
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi 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 });
}
Crea una fattura di deposito Bitcoin denominata in USD
POST /v1/payments/invoices
Scope richiesto: billing:write
Input: { body: InvoiceInput; }
Restituisce: BitcoinInvoice
Stati HTTP documentati: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Nascondi una fattura Bitcoin non pagata
DELETE /v1/payments/invoices/{invoiceId}
Scope richiesto: billing:write
Input: { path: { invoiceId: string; }; }
Restituisce: undefined
Stati HTTP documentati: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerDeletePaymentInvoice(
input: OperationInput<"customerDeletePaymentInvoice">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerDeletePaymentInvoice">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerDeletePaymentInvoice", input, { signal });
}
GET /payments/methods
GET /v1/payments/methods
Scope richiesto: billing:read
Input: Record<string, never>
Restituisce: Array<PaymentMethod>
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi 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 });
}
Ottieni l'offerta bonus di deposito Bitcoin attualmente attiva
GET /v1/payments/deposit-offer
Scope richiesto: billing:read
Input: Record<string, never>
Restituisce: DepositBonusOffer | null
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi 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 });
}
Aggiorna le conferme per le fatture dell'account corrente
POST /v1/payments/refresh
Scope richiesto: billing:write
Input: Record<string, never>
Restituisce: Array<BitcoinInvoice>
Stati HTTP documentati: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Ottieni i prezzi pubblici correnti per l'analisi e l'editing
GET /v1/pricing
Scope richiesto: catalog:read
Input: Record<string, never>
Restituisce: PricingSettings
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi 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 });
}
Ottieni il preventivo VIP pubblico attuale e i prezzi di confronto
GET /v1/vip/plans
Scope richiesto: catalog:read
Input: Record<string, never>
Restituisce: VipPlanQuote
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipPlans(
input: OperationInput<"customerGetVipPlans">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipPlans">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipPlans", input, { signal });
}
GET /vip
GET /v1/vip
Scope richiesto: vip:read
Input: Record<string, never>
Restituisce: VipState
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVip(
input: OperationInput<"customerGetVip">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVip">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVip", input, { signal });
}
POST /vip/purchase
POST /v1/vip/purchase
Scope richiesto: vip:purchase
Input: { body: CustomerVipPurchaseInput; }
Restituisce: VipPurchaseResult
Stati HTTP documentati: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Quota una modifica e ricontrolla rispetto a una classificazione salvata
POST /v1/rewrite/quote
Scope richiesto: rewrite
Input: { body: EditQuoteInput; }
Restituisce: EditQuote
Stati HTTP documentati: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Quota una modifica e ricontrolla rispetto a una classificazione salvata
POST /v1/classify/edit/quote
Scope richiesto: classify
Input: { body: EditQuoteInput; }
Restituisce: EditQuote
Stati HTTP documentati: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Classifica un'email utilizzando nome del mittente, oggetto e corpo
POST /v1/classify/edit
Scope richiesto: classify
Input: { body: CustomerManualEditInput; }
Restituisce: CustomerManualEditResult
Stati HTTP documentati: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Richiedi una riscrittura con AI a pagamento dei termini segnalati selezionati e riclassifica il risultato
POST /v1/rewrite
Scope richiesto: rewrite
Input: { body: CustomerAiRewriteInput; }
Restituisce: AiRewriteResult
Stati HTTP documentati: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Parametri, schemi ed esempi 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 });
}
Verifica una bozza finale renderizzata esatta rispetto a una ricevuta Rewrite All a pagamento posseduta senza un ulteriore addebito
POST /v1/rewrite/finalize
Scope richiesto: rewrite
Input: { body: { requestId: string; sender: string; subject: string; body: string; }; }
Restituisce: { requestId: string; input: RewrittenClassificationInput; classification: ClassificationResult; }
Stati HTTP documentati: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Recupera una ricevuta di riscrittura AI a pagamento completata e posseduta
GET /v1/rewrite/result/{requestId}
Scope richiesto: rewrite
Input: { path: { requestId: string; }; }
Restituisce: AiRewriteResult
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi 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 });
}
Quota il prezzo massimo autorizzato di una riscrittura AI pagata separatamente
POST /v1/rewrite/ai-quote
Scope richiesto: rewrite
Input: { body: AiRewriteQuoteInput; }
Restituisce: AiRewriteQuote
Stati HTTP documentati: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Genera un design email MJML standard modificabile con AI al prezzo confermato per l'account
POST /v1/email-builder/ai-template
Scope richiesto: ai:generate
Input: { body: CustomerAiEmailTemplateInput; }
Restituisce: AiEmailTemplateResult
Stati HTTP documentati: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Parametri, schemi ed esempi 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 });
}
Genera un design email VIP nativo modificabile con AI al prezzo confermato per i membri
POST /v1/vip/email-template
Scope richiesto: ai:generate
Input: { body: CustomerVipEmailTemplateInput; }
Restituisce: CustomerVipEmailTemplateResult
Stati HTTP documentati: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Parametri, schemi ed esempi 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 });
}
Apri gratuitamente una sessione dell'editor di progettazione email standard
POST /v1/email-builder/access
Scope richiesto: builder:write
Input: { body: CustomerEmailBuilderAccessInput; }
Restituisce: EmailBuilderAccess
Stati HTTP documentati: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerAccessEmailBuilder(
input: OperationInput<"customerAccessEmailBuilder">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerAccessEmailBuilder">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerAccessEmailBuilder", input, { signal });
}
GET /email-builder/access/{accessId}
GET /v1/email-builder/access/{accessId}
Scope richiesto: builder:read
Input: { query?: { designId?: string; }; path: { accessId: string; }; }
Restituisce: EmailBuilderActiveAccess
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetEmailBuilderAccess(
input: OperationInput<"customerGetEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetEmailBuilderAccess", input, { signal });
}
DELETE /email-builder/access/{accessId}
DELETE /v1/email-builder/access/{accessId}
Scope richiesto: builder:write
Input: { path: { accessId: string; }; }
Restituisce: undefined
Stati HTTP documentati: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCloseEmailBuilderAccess(
input: OperationInput<"customerCloseEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCloseEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCloseEmailBuilderAccess", input, { signal });
}
POST /vip/email-builder/access
POST /v1/vip/email-builder/access
Scope richiesto: vip:builder
Input: { body: CustomerVipBuilderAccessInput; }
Restituisce: VipBuilderAccess
Stati HTTP documentati: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerCreateVipEmailBuilderAccess(
input: OperationInput<"customerCreateVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerCreateVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerCreateVipEmailBuilderAccess", input, { signal });
}
GET /vip/email-builder/access/{accessId}
GET /v1/vip/email-builder/access/{accessId}
Scope richiesto: builder:read
Input: { path: { accessId: string; }; }
Restituisce: VipBuilderAccess
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetVipEmailBuilderAccess(
input: OperationInput<"customerGetVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetVipEmailBuilderAccess", input, { signal });
}
DELETE /vip/email-builder/access/{accessId}
DELETE /v1/vip/email-builder/access/{accessId}
Scope richiesto: vip:builder
Input: { path: { accessId: string; }; }
Restituisce: undefined
Stati HTTP documentati: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parametri, schemi ed esempi HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerDeleteVipEmailBuilderAccess(
input: OperationInput<"customerDeleteVipEmailBuilderAccess">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerDeleteVipEmailBuilderAccess">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerDeleteVipEmailBuilderAccess", input, { signal });
}
Read permanent paid-result evidence with the original account and credential
GET /customer/paid-results/{recoveryId}
Scope richiesto: authenticated original credential
Input: { path: { recoveryId: string; }; }
Restituisce: { 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; }; }
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerGetPaidResult(
input: OperationInput<"customerGetPaidResult">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerGetPaidResult">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerGetPaidResult", input, { signal });
}
Read the authenticated account and credential identity before paid dispatch
GET /customer/paid-results/identity
Scope richiesto: authenticated credential
Input: Record<string, never>
Restituisce: { accountId: string; credentialId: string; }
Stati HTTP documentati: 200, 401, 403, 429, 503
Parametri, schemi ed esempi HTTP
import type { OperationInput, OperationResponse } from "@sendrepute/node";
async function customerPaidResultIdentity(
input: OperationInput<"customerPaidResultIdentity">,
confirmed: boolean,
signal?: AbortSignal,
): Promise<OperationResponse<"customerPaidResultIdentity">> {
if (confirmed !== true) throw new Error("Explicit action confirmation required");
return client.request("customerPaidResultIdentity", input, { signal });
}
Explicitly resolve an owned paid result with the original credential and service scope
POST /customer/paid-results/{recoveryId}/resolve
Scope richiesto: original ai:generate or vip:builder service scope
Input: { body: { action: "resolve"; reason: string; }; path: { recoveryId: string; }; }
Restituisce: { 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; }; }
Stati HTTP documentati: 200, 400, 401, 403, 404, 429, 503
Parametri, schemi ed esempi 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 });
}
Importa e compila un design MJML standard senza salvare o inviare
POST /v1/email-builder/import
Scope richiesto: builder:write
Input: { body: CustomerStandardBuilderInput; }
Restituisce: CustomerStandardBuilderImportResult
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Valida e compila un design MJML standard senza salvare o inviare
POST /v1/email-builder/validate
Scope richiesto: builder:write
Input: { body: CustomerStandardBuilderInput; }
Restituisce: CustomerStandardBuilderValidateResult
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Compila un design MJML standard in HTML senza salvare o inviare
POST /v1/email-builder/compile
Scope richiesto: builder:write
Input: { body: CustomerStandardBuilderInput; }
Restituisce: CustomerStandardBuilderCompileResult
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Esporta un design MJML standard come HTML, MJML o ZIP senza invio
POST /v1/email-builder/export
Scope richiesto: builder:write
Input: { body: CustomerStandardBuilderInput; }
Restituisce: CustomerStandardBuilderExportResult
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Importa e compila un design VIP nativo con abbonamento attivo e accesso aperto di proprietà
POST /v1/vip/email-builder/import
Scope richiesto: vip:builder
Input: { body: CustomerNativeBuilderInput; }
Restituisce: CustomerNativeBuilderImportResult
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Convalida e compila un design VIP nativo con abbonamento attivo e accesso aperto di proprietà
POST /v1/vip/email-builder/validate
Scope richiesto: vip:builder
Input: { body: CustomerNativeBuilderInput; }
Restituisce: CustomerNativeBuilderValidateResult
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Compila un design VIP nativo in HTML con abbonamento attivo e accesso aperto di proprietà
POST /v1/vip/email-builder/compile
Scope richiesto: vip:builder
Input: { body: CustomerNativeBuilderInput; }
Restituisce: CustomerNativeBuilderCompileResult
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Esporta un design VIP nativo come HTML o come ZIP HTML a tre varianti senza invio
POST /v1/vip/email-builder/export
Scope richiesto: vip:builder
Input: { body: CustomerNativeBuilderInput; }
Restituisce: CustomerNativeBuilderExportResult
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Avvia un passaggio di consegne unico all'editor hosted VIP nativo, standard o con diritto
POST /v1/email-builder/hosted-handoffs
Scope richiesto: builder:write
Input: { body: CustomerHostedBuilderHandoffInput; }
Restituisce: CustomerHostedBuilderHandoff
Stati HTTP documentati: 201, 400, 401, 403, 429, 503
Parametri, schemi ed esempi 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 });
}
Elenco template VIP Builder
GET /v1/vip/email-builder/templates
Scope richiesto: vip:read
Input: Record<string, never>
Restituisce: CustomerVipTemplateCatalog
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Ottieni il modello Vip Builder
GET /v1/vip/email-builder/templates/{templateId}
Scope richiesto: vip:read
Input: { path: { templateId: string; }; }
Restituisce: CustomerVipTemplateDocument
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Elenca i modelli Standard Builder
GET /v1/email-builder/templates
Scope richiesto: catalog:read
Input: Record<string, never>
Restituisce: CustomerStandardTemplateCatalog
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Ottieni il modello Standard Builder
GET /v1/email-builder/templates/{templateId}
Scope richiesto: catalog:read
Input: { path: { templateId: string; }; }
Restituisce: CustomerStandardTemplateDetail
Stati HTTP documentati: 200, 400, 401, 403, 404, 413, 429, 503
Parametri, schemi ed esempi 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 });
}
Nodo n8n self-hosted
0.1.0
Richiede Node.js 20.19+ e un'installazione n8n self-hosted patchata che fornisca n8n-workflow >=2.39.3 <3. Non forzare l'installazione in un host più datato e incompatibile. Installa il tarball scaricato nella directory custom-node e riavvia n8n. Questo nodo non pubblicato non è disponibile tramite n8n Cloud o installazione community npm-name.
Il consenso a pagamento è disattivato per impostazione predefinita. Ogni elemento consenziente esegue una richiesta di classificazione senza tentativi automatici. I risultati sono raggruppati sotto il namespace sendrepute. Utilizzare un gate IF su sendrepute.allowed prima dell'invio e verificare separatamente lo stato di errore. Le modalità Advisory e Blocking restituiscono decisioni esplicite. Il nodo stesso non invia email.
Scarica tarball n8n
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Esegui sull'host n8n self-hosted, quindi riavvia il relativo servizio n8n utilizzando il tuo normale process manager. Conferma che SendRepute appaia nel selettore dei nodi. Importa il file estratto package/examples/classify-email.workflow.json dall'editor n8n. L'installazione di nodi Community npm-name e n8n Cloud non è supportata da questo pacchetto non pubblicato.
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
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o 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. Configura in modo sicuro
Crea una credenziale API SendRepute con una chiave cliente con ambito classify nello storage delle credenziali di n8n. Non inserirla mai nel JSON del workflow o nelle espressioni. Il JSON sottostante mostra i parametri del nodo, non un workflow completo importabile. Mappa il nome visualizzato del mittente, l'oggetto e il corpo; scegli tra advisory/blocking, la soglia e la policy di fallimento open/closed. Rivedi i prezzi prima di impostare paidConsent su true. Ogni elemento consenziente esegue al massimo una richiesta.
{
"operation": "classify",
"paidConsent": false,
"sender": "={{ $json.sender }}",
"subject": "={{ $json.subject }}",
"body": "={{ $json.body }}",
"decisionMode": "blocking",
"threshold": 0.8,
"failurePolicy": "closed"
}
3. Usa deliberatamente
Posiziona un nodo IF immediatamente dopo SendRepute e utilizza questa condizione booleana. Connetti solo l'output true al tuo nodo email esistente; instrada false verso la revisione o l'arresto. Ispeziona analysisStatus separatamente anche quando allowed è true. Il workflow incluso inizia con il consenso a pagamento disabilitato e non contiene credenziali. SendRepute stesso non invia mai email.
{{ $json.sendrepute.allowed === true }}
Risultati, errori e limiti
I risultati positivi sostituiscono il namespace sendrepute con i campi analysisStatus, decision, allowed, recommendation, punteggio validato e dati di fatturazione. I fallimenti omettono i punteggi spam e restituiscono failureCategory/errorCode sanificati. I fallimenti closed bloccano; i fallimenti open consentono ma contrassegnano analysisStatus come failed. I successi advisory consentono sempre indipendentemente dalla recommendation. Consent-off restituisce not_run. Non sono previsti retries, destinatari, allegati, riscritture, selettore di modelli o endpoint personalizzati. L'audit aggiornato delle dipendenze dei sorgenti ha riportato zero risultati; questo è un risultato puntuale, non una certificazione di sicurezza. Mantieni aggiornato il runtime self-hosted e consulta SECURITY.md prima dell'installazione.
Integrazione Laravel
0.1.0
Destinato a PHP 8.2+ e Laravel 12–13. Installare il file ZIP utilizzando un repository locale di artefatti Composer, oppure estrarlo e configurare un repository di tipo 'path' in Composer come descritto nel README incluso. Non viene dichiarata alcuna pubblicazione su Packagist.
Il consenso a pagamento e l'hook email sono disabilitati per impostazione predefinita. Anche se abilitati, ogni messaggio deve esplicitamente aderire con X-SendRepute-Classify: yes. L'header viene rimosso prima della consegna. Le modalità advisory e blocking hanno policy di errore indipendenti; i reset delle password e le email transazionali rimangono intatti a meno che non si scelga deliberatamente l'opt-in.
Scarica ZIP Laravel
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Esegui all'interno della tua applicazione Laravel. Questi comandi estraggono il download e registrano un repository di percorsi Composer; questa non è un'installazione tramite Packagist. La package discovery registra il provider e vendor:publish crea config/sendrepute.php. Mantieni la directory del pacchetto estratto disponibile per Composer. Un repository artifact è un'altra opzione documentata nel 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
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o 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. Configura in modo sicuro
Memorizza SENDREPUTE_API_KEY nei segreti del server. L'URL di base termina con /api; il client aggiunge /v1/classify. Sono richiesti la corrispondenza esatta dell'host attendibile e HTTPS verificato. Entrambi gli interruttori mostrati rimangono disattivati finché non rivedi i prezzi e li imposti esplicitamente su true. In config/sendrepute.php scegli mail.mode, mail.spam_probability_threshold e mail.failure_policy in modo indipendente. L'impostazione predefinita è advisory con allow in caso di fallimento.
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. Usa deliberatamente
Aggiungi l'header di opt-in esatto solo alle classi Mailable selezionate deliberatamente, mai a una callback globale per la posta. Per l'hook automatico sono necessari sia gli interruttori globali che l'header per messaggio. L'header viene rimosso prima della consegna. Mantieni i reset delle password e le notifiche critiche al di fuori del blocco automatico a meno che non siano esplicitamente testati. La classificazione manuale può invece risolvere il contratto Classifier e concedere il consenso per chiamata, come mostrato.
// 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,
);
}
Riferimento API e metodi
Risolvi l'interfaccia Classifier dal container di Laravel. classify(string sender, string subject, string body, ?string model = null, bool paidAnalysisConsent = false) restituisce ClassificationResult. I suoi campi pubblici sono requestId, model, label, spamProbability, confidence, replayed e chargedMillicents. SendReputeException fornisce categoria sanificata, stato HTTP, codice API e ID richiesta. L'hook automatico è AnalyzeOutgoingMessage su MessageSending e la sua diagnostica sicura è ClassificationOutcome. Questa integrazione supporta solo la classificazione, non l'amministrazione dell'account, i pagamenti, i builder o la riscrittura AI.
Risultati, errori e limiti
ClassificationResult contiene il risultato validato e i dati di fatturazione. L'hook MessageSending restituisce false per annullare un messaggio bloccato; l'annullamento non è un errore SMTP o un evento MessageSent. ClassificationOutcome riporta solo azione, punteggio e metadati di fallimento sanificati, mai il contenuto del messaggio. La policy di fallimento copre input/risposta malformati, autenticazione, saldo, limiti di frequenza e problemi di trasporto. Non vengono aggiunti tentativi o code. Sono richiesti un mittente nominativo e un corpo di testo o HTML in memoria.
Preflight bozze Mautic
0.1.0
Destinato a installazioni Mautic 5.x su nodo web singolo con PHP 8.1+ e ext-curl. Mautic 4, Mautic 6 e i cluster multi-nodo non sono supportati. Estrarre SendReputeBundle nella directory dei plugin, ricaricare i plugin e svuotare la cache seguendo il file README incluso. Configurare le credenziali e confermare esplicitamente la modalità di blocco local-flock nell'ambiente server.
Analisi advisory a pagamento di una bozza salvata, avviata solo dall'amministratore. Opt-in globale, controlli di accesso all'entità, validazione CSRF e una conferma monouso proteggono ogni richiesta. Non invia, riscrive o blocca le email e non ha alcuna esecuzione al momento dell'invio. Le sostituzioni dei destinatari rimangono non espanse; salvare prima le modifiche dell'editor.
Scarica ZIP Mautic
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Esegui dalla root di Mautic con lo stesso utente PHP e ambiente dell'applicazione web, oppure estrai lo ZIP tramite il tuo processo di deployment prima di ricaricare i plugin. Richiede Mautic 5.x, PHP 8.1+, ext-curl e un singolo nodo web Linux/POSIX. Mautic 4/6 e i cluster multi-nodo non sono supportati; non viene rivendicata alcuna certificazione di installazione live patch-per-patch.
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
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-mautic.git
cd sendrepute-mautic
python3 package.py
2. Configura in modo sicuro
Crea la directory persistente del registro mostrata all'esterno della root web, di proprietà dell'utente PHP con modalità 0700. Non utilizzare /tmp, container effimeri, link simbolici o storage di rete incerto. Memorizza SENDREPUTE_API_KEY lato server. Conferma local-flock solo quando un singolo nodo web fornisce il blocco del processo condiviso. L'analisi globale a pagamento rimane disabilitata a 0; impostala a 1 solo dopo aver rivisto prezzi e limiti. Nessun campo del browser può fornire le credenziali o l'endpoint.
SENDREPUTE_MAUTIC_PAID_ANALYSIS_ENABLED=0
SENDREPUTE_MAUTIC_ATOMIC_LOCK_MODE=local-flock
SENDREPUTE_MAUTIC_LEDGER_DIR=/var/lib/mautic/sendrepute-ledger
3. Usa deliberatamente
Salva prima le modifiche dell'editor. Come amministratore reale di Mautic con accesso a quella email, apri la bozza salvata e scegli il preflight di SendRepute. Rivedi la conferma e accetta esplicitamente l'operazione a pagamento. La richiesta necessita della validazione CSRF e di un intento di dieci minuti a uso singolo legato al contenuto salvato. Il blocco persistente e un registro privo di contenuti impediscono spese duplicate concorrenti sul singolo nodo supportato.
Risultati, errori e limiti
Mostra la probabilità validata, l'etichetta, la confidenza e l'importo effettivamente fatturato o il replay della ricevuta. I fallimenti non mostrano alcuna decisione sullo spam e non vengono riprovati automaticamente. Vengono analizzati solo il nome visualizzato del mittente salvato, l'oggetto e il corpo; le sostituzioni dei contatti rimangono non espanse. Il plugin non riscrive le bozze, non invia email, non blocca le campagne né applica una policy sull'orario di invio. Una revisione della bozza salvata non può certificare il messaggio finale renderizzato dal destinatario.
Client Python e backend Django
0.1.0
Richiede Python 3.9+. Estrai lo ZIP dei sorgenti e installa la sua directory con pip. Il client server generico utilizza la libreria standard; Django è una dipendenza opzionale per il backend email esplicito. Questo pacchetto non è pubblicato su PyPI.
Il consenso a pagamento è disattivato per impostazione predefinita. Il wrapper Django preserva il trasporto originale e gli oggetti messaggio. Analizza una stringa delimitata che combina il corpo principale e le alternative inline text/plain e text/html, non gli allegati. La modalità di blocco rifiuta i contenuti visualizzati non supportati o sovradimensionati. Gli errori di autenticazione bloccano per impostazione predefinita anche con una policy di autorizzazione; scegliere deliberatamente il comportamento per critical-mail.
Scarica ZIP sorgenti Python
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Usa un ambiente virtuale. Il client generico utilizza solo la libreria standard; il comando finale aggiunge la dipendenza facoltativa Django e non è necessario per Flask, FastAPI o altri usi generici del server. Il pacchetto viene installato dalla directory sorgente scaricata, non da PyPI. Python 3.9+ è il minimo del pacchetto; scegli versioni Python/Django supportate insieme.
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]'
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o 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. Configura in modo sicuro
Inietta SENDREPUTE_API_KEY tramite i segreti del server. Il client generico utilizza per impostazione predefinita l'endpoint ospitato canonico, HTTPS verificato, nessun reindirizzamento e nessun tentativo. Il consenso del client è disattivato per impostazione predefinita; l'esempio concede il consenso per singola chiamata solo dopo aver verificato confirmed. Le sovrascritture degli endpoint richiedono una allowlist esplicita dell'origine HTTPS. Il dizionario restituito contiene il risultato validato e i dati di fatturazione, non una decisione di invio.
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 email Django
Conserva il tuo backend esistente in SENDREPUTE_ORIGINAL_EMAIL_BACKEND e mantieni le sue normali impostazioni SMTP. L'esempio mantiene il consenso a pagamento disattivato; impostalo su True solo dopo aver esaminato i prezzi. La modalità consultiva (advisory) consente analisi riuscite; la modalità di blocco (blocking) confronta con SENDREPUTE_SPAM_THRESHOLD. Scegli deliberatamente la policy di fallimento indipendente. Gli errori di autenticazione bloccano per impostazione predefinita anche in caso di consenso (allow). L'esempio segue i valori predefiniti del README e non è una raccomandazione a fallire in modalità aperta per la posta critica.
# 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. Usa deliberatamente
Questa funzione invia solo quando chiamata. Con il wrapper Django configurato e il consenso a pagamento abilitato, il backend originale riceve gli oggetti del messaggio originale invariati. Il classificatore riceve una stringa delimitata che combina il corpo principale con le alternative inline text/plain e text/html; gli allegati e i destinatari non sono input separati. Esegui il rendering dei template prima della chiamata. Usa prima un backend di test locale, poi il tuo trasporto reale deliberatamente configurato.
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()
Riferimento API e metodi
Il costruttore pubblico è SendReputeClient(api_key, endpoint, allowed_origins, timeout, paid_analysis_consent), con tutti i parametri tranne api_key passati come keyword. timeout deve essere maggiore di zero e al massimo 30 secondi. classify richiede le keyword sender, subject e body; model e paid_analysis_consent per singola chiamata sono opzionali. Sender è da 1–320 caratteri, subject 1–998 e body 1–524,288, con un limite separato per la richiesta codificata. Il dict restituito contiene requestId, model, result e billing; result include label, spamProbability, confidence, reasons e l'opzionale contentAudit. billing contiene chargedMillicents e replayed. Gli errori includono ConsentRequiredError, AuthenticationError, BalanceError, RateLimitError, TransportError e InvalidResponseError, tutti sotto SendReputeError. Una configurazione non valida può sollevare ValueError. Il backend Django espone open(), close() e send_messages(email_messages), restituendo il conteggio degli invii del backend originale; non aggiunge API generiche, builder, rewrite o metodi di pagamento.
Risultati, errori e limiti
Il blocco rifiuta i contenuti visualizzati non supportati o sovradimensionati invece di analizzare solo un sottoinsieme più sicuro. I fallimenti di autenticazione richiedono una sovrascrittura esplicita separata per consentire. Altri errori seguono la policy allow/block scelta; fail_silently controlla se i fallimenti bloccati vengono sollevati o saltati. Il wrapper non mette in coda, non riprova, non scambia i trasporti, non ispeziona gli allegati né esegue il rendering dei template. Il client generico solleva sottoclassi SendReputeError sanitizzate con codice/stato/request_id; non registrare i corpi dei messaggi.
Client di classificazione Go
0.1.0
Richiede Go 1.22+. Il client basato solo sulla libreria standard supporta la classificazione, non il trasporto email. Scegli il file ZIP sorgente scaricabile con una sostituzione locale del modulo, oppure l'installazione del modulo pubblico verificato mostrata sotto l'alternativa sorgente.
Classificazione lato server basata solo sulla libreria standard con consenso a pagamento esplicito, richieste limitate, HTTPS verificato, redirect rifiutati e nessun tentativo automatico. Non invia email né prende decisioni di invio/blocco. L'applicazione deve scegliere deliberatamente le soglie e il comportamento in caso di errore, specialmente per la posta transazionale critica.
Scarica ZIP sorgenti Go
Repository sorgente pubblico
README completo ed esempi
Note di sicurezza e limitazioni note
1. Installa
Estrai il sorgente nella directory della tua applicazione Go esistente ed esegui lì i comandi del modulo. La sostituzione locale punta al modulo scaricato; sposta o regola quel percorso se il layout del tuo progetto differisce. Esegui go mod init con il tuo nome di modulo solo quando crei una nuova applicazione. Nessun modulo runtime esterno è richiesto da questo 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
Alternativa: installazione da sorgente pubblica
Usa questo percorso sorgente invece delle istruzioni di download del sito web sopra riportate. Il README del repository spiega i restanti passaggi di attivazione e configurazione; la sola creazione di un file ZIP non installa un plugin. Per Python, il secondo comando aggiunge il supporto opzionale Django. Conserva le credenziali nei segreti del server e consulta le note di sicurezza prima di abilitare le funzionalità a pagamento. Solo Node è su npm; un repository GitHub pubblico non implica la pubblicazione su WordPress.org, n8n Cloud, Packagist o PyPI.
go get github.com/sendrepute/sendrepute-go@bfd656f829618348232da506225a5d92587d48e2
2. Configura in modo sicuro
Inietta SENDREPUTE_API_KEY dai segreti del server. La funzione mostrata non esegue alcun lavoro finché non viene chiamata con confirmed=true; tale chiamata può comportare una classificazione a pagamento. Imposta un contesto di dieci secondi e utilizza l'endpoint HTTPS canonico. Il consenso del client è disattivato per impostazione predefinita; l'ultimo argomento true concede il consenso per questa singola richiesta. Una sovrascrittura dell'endpoint richiede una voce AllowedOrigins esplicita; i reindirizzamenti vengono rifiutati.
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. Usa deliberatamente
Chiama Analyze dalla tua applicazione autenticata solo dopo la revisione dei prezzi e il consenso esplicito. La soglia 0.90 e l'errore di revisione sono policy dell'applicazione di esempio, non impostazioni predefinite dell'SDK. Decidi se gli errori significano differire, consentire o fallire in modo chiuso prima di collegare qualsiasi codice di invio. Il client restituisce un risultato tipizzato con Result.SpamProbability e campi di fatturazione; non invia mai email né prende decisioni di consegna da solo.
Riferimento API e metodi
NewClient(Config) restituisce (*Client, error). Config accetta APIKey, Endpoint, AllowedOrigins, Timeout e PaidAnalysisConsent. Classify(ctx, ClassificationInput, consent) restituisce (*ClassificationResponse, error). I campi di Input sono Sender, Subject, Body e l'opzionale Model. Sender è da 1–320 rune, subject 1–998 rune e body al massimo 524,288 byte UTF-8. La risposta tipizzata contiene RequestID, Model, Result e Billing; Billing espone ChargedMillicents e Replayed. Result include Label, SpamProbability, Confidence, Reasons, FlaggedTerms e l'opzionale ContentAudit. Usa errors.As per ispezionare *Error in sicurezza; errori di configurazione e dell'API rimangono errori, non punteggi spam. Non esistono metodi per account, pagamenti, builder o di riscrittura.
Risultati, errori e limiti
Una chiamata effettua al massimo un tentativo HTTP a pagamento senza tentativi successivi. Gli errori espongono una categoria sicura, codice/request ID e stato limitati, mai credenziali, corpi o dettagli di rete. La durata del contesto, le dimensioni della richiesta e della risposta sono delimitate; le risposte malformate vengono rifiutate invece di essere convertite in punteggi. Il client non ha capacità di parsing MIME, rendering, gestione destinatari, allegati, code, builder, riscrittura o SMTP. Scegli il modello esplicitamente solo se necessario; altrimenti si applica il valore predefinito dell'account.
listmonk HTTP Messenger
0.1.0
Un pacchetto sorgente locale non pubblicato per Node.js 20+ destinato all'interfaccia Custom HTTP Messenger di listmonk 6.2.0. Questo servizio esterno gestisce la consegna SMTP a valle dopo la classificazione; non è un plugin in-process né un proxy preflight SMTP. La verifica è isolata e offline, non un'installazione di listmonk attiva o un test reale del provider SMTP.
Entrambi gli interruttori paid sono disattivati per impostazione predefinita. Il messenger accetta un corpo del messaggio completamente renderizzato, rifiuta gli allegati, controlla il prezzo aggiornato e richiede il risultato Inbox rigoroso: label inbox, spamProbability al massimo 0.12 e zero flaggedTermCount. Successivamente costruisce e invia lo stesso corpo ispezionato tramite la connessione SMTP configurata. Ricevute persistenti impediscono ripetizioni automatiche dopo esiti bloccati, falliti, in corso o incerti.
Scarica lo ZIP dei sorgenti non pubblicati di listmonk
1. Installa
Estrarre questo ZIP dei sorgenti del sito web non pubblicato sull'host dedicato del messenger. Consultare README.md e SECURITY.md, copiare l'ambiente di esempio ed eseguire il controllo sintattico dell'entry point del server prima della configurazione. L'artefatto scaricabile in allowlist esclude intenzionalmente la suite di test del repository. Non sono presenti pacchetti runtime di terze parti. Questa non è un'installazione marketplace di listmonk o in-process.
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. Configura in modo sicuro
Utilizzare un account dedicato non privilegiato e una directory di stato locale persistente con modalità 0700. Mantenere tutti e tre gli interruttori di sicurezza mostrati su false finché il prezzo e la limitazione del prezzo non atomico non vengono accettati. Memorizzare le credenziali SendRepute, l'autenticazione Basic Auth del messenger e l'SMTP a valle solo nei segreti del server. Terminare HTTPS presso un reverse proxy affidabile.
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. Usa deliberatamente
Esponi solo POST /v1/listmonk dietro HTTPS e Basic Auth dedicata. In Impostazioni (Settings) > Messengers di listmonk, aggiungi il suo URL come Custom HTTP Messenger, scegli zero tentativi e selezionalo solo per le campagne che devono essere ispezionate e consegnate. Non selezionare contemporaneamente listmonk SMTP: questo servizio esegue autonomamente l'invio SMTP a valle.
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.
Risultati, errori e limiti
Un duplicato già consegnato restituisce successo senza un'ulteriore classificazione o invio. Ogni ricevuta bloccata, fallita, in ispezione, in invio o incerta rifiuta un nuovo invio. Dopo un esito SMTP incerto, riconcilia manualmente i log del provider e il contesto di listmonk; non eliminare mai una ricevuta solo per forzare un nuovo tentativo. Il controllo del prezzo corrente è aggiornato ma non atomico perché la classificazione non accetta il campo expectedPriceMillicents.
Adattatore Mailcoach Self-Hosted
0.1.0
Un pacchetto Composer locale non pubblicato destinato a Mailcoach Self-Hosted v10 su Laravel 12. Il core licenziato spatie/laravel-mailcoach v10 non è disponibile in questo ambiente di lavoro, pertanto questo pacchetto non dichiara un test end-to-end di Mailcoach v10 installato. I test reali di Laravel 12 Mailer coprono l'evento MessageSending cancellabile documentato; il titolare della licenza deve verificare ogni esatto percorso di invio di Mailcoach prima della produzione.
Gli interruttori enabled, paid-consent e il riconoscimento del prezzo corrente sono tutti disattivati per impostazione predefinita. Una volta abilitato, l'hook si applica a ogni messaggio tramite quel mailer Laravel, non solo alle rotte denominate Mailcoach. Analizza le alternative Symfony Email già renderizzate e può annullare il trasporto. Il fail-closed è l'impostazione predefinita; consentire errori di analisi è una policy deliberata separata.
Scarica il file ZIP sorgente sperimentale di Mailcoach
1. Installa
Posiziona lo ZIP non pubblicato scaricato in una directory privata per gli artefatti di Composer accessibile all'applicazione Mailcoach con licenza. Registra il repository dell'artefatto locale, richiedi la linea 0.1, esegui il commit del lockfile e, opzionalmente, pubblica la configurazione. Questa non è un'installazione tramite Packagist. Un titolare di licenza deve eseguire la verifica rispetto all'esatta release di 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. Configura in modo sicuro
Inizialmente, mantieni disattivati tutti e tre gli interruttori. Memorizza la chiave API nei segreti del server e configura un limite di spesa lato account. L'attuale operazione classify non dispone di una protezione atomica expectedPriceMillicents, pertanto il terzo interruttore accetta esplicitamente i prezzi API correnti invece di promettere un preventivo bloccato. Configura la soglia e la policy di fallimento allow/block in modo indipendente.
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. Usa deliberatamente
Il rilevamento del pacchetto registra un listener Laravel MessageSending. Non esiste alcuna chiamata per singola campagna nel codice dell'applicazione: quando abilitato deliberatamente in un'installazione dedicata di Mailcoach, ispeziona ogni email Symfony inviata tramite quel mailer Laravel immediatamente prima del trasporto. In un'applicazione Laravel mista, viene coperta anche la posta dell'applicazione host.
Risultati, errori e limiti
L'adattatore invia il nome visualizzato del mittente, l'oggetto e ogni alternativa in memoria text/plain o text/html non vuota, escludendo destinatari, indirizzi, allegati, dati dell'envelope e raw MIME. I contenuti mancanti o non supportati, le risposte malformate e gli errori API bloccano per impostazione predefinita. I test principali offline esercitano la cancellazione reale del Laravel Mailer, ma le rotte per campagne, automazioni, transazionali e messaggi di test di Mailcoach con licenza rimangono non verificate.
Flusso di invio controllato da Brevo
0.1.0
Un pacchetto sorgente Node.js 20+ locale non pubblicato che implementa un'API di invio esplicita lato server attorno all'operazione transazionale Brevo POST /v3/smtp/email. Non intercetta invii dalla dashboard Brevo, campagne, automazioni, SMTP relay o chiamate tramite altri SDK. I test sono controllati e offline; non certificano un account Brevo live.
Il paidConsent è disattivato per impostazione predefinita. Sono accettati solo messaggi di testo fisso inline e HTML; i template remoti, i parametri, gli invii programmati, le versioni dei messaggi e i contenuti basati su URL vengono rifiutati. L'esatto snapshot immutabile ispezionato viene inviato a Brevo. Un registro sendKey durevole blocca i tentativi duplicati e ambigui, e gli esiti incerti del provider richiedono la riconciliazione dell'operatore.
Scarica il sorgente ZIP di Brevo non pubblicato
1. Installa
Estrarre lo ZIP dei sorgenti non pubblicato in un'applicazione server, consultare il relativo README e le note di sicurezza, ed eseguire il controllo sintattico di src/index.mjs. L'artefatto scaricabile in allowlist esclude intenzionalmente la suite di test del repository. Importare SendReputeBrevo da src/index.mjs; questa non è un'installazione tramite npm o marketplace di Brevo. È richiesto Node.js 20+ e non sono presenti dipendenze runtime.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-brevo.zip
unzip sendrepute-brevo.zip
cd sendrepute-brevo
node --check src/index.mjs
2. Configura in modo sicuro
Mantenere paidConsent impostato su false finché non vengono accettati i prezzi correnti e la limitazione del prezzo non atomico. Conservare entrambe le chiavi API nei segreti del server e utilizzare una directory ledger persistente privata su storage durevole a host singolo. Il valore expectedPriceMillicents deve corrispondere al valore massimo appena recuperato, ma l'addebito di classify non può ancora forzare atomicamente tale valore.
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. Usa deliberatamente
Chiamare send solo dal percorso del server controllato che deve sia classificare che consegnare. Riutilizzare una sendKey stabile per ogni tentativo della stessa email prevista. Fornire contenuto inline fisso; non fornire template ID di Brevo, parametri mutabili, pianificazioni o versioni del messaggio. Gli invii effettuati altrove ignorano completamente questo wrapper.
await integration.send({
sendKey: durableBusinessEventId,
message: {
sender: { name: "Example Shop", email: "orders@example.com" },
to: [{ email: recipient }],
subject,
textContent,
htmlContent,
},
});
Risultati, errori e limiti
Un risultato Inbox entro la soglia consente una richiesta API transazionale Brevo per lo stesso snapshot immutabile. Il registro passa a delivery-unknown prima dell'invio del provider. Timeout, disconnessioni, successi malformati, crash e rifiuti del provider non vengono mai riprovati automaticamente; riconciliarli con i record Brevo prima di ogni decisione manuale.
Flusso di invio controllato per BigMailer
0.1.0
Un wrapper Node.js 24+ locale non pubblicato per chiamate API transazionali esplicite di BigMailer. Non si installa in BigMailer né intercetta gli invii dal dashboard o da API non correlate. Poiché BigMailer possiede contenuti delle campagne modificabili da remoto, il wrapper non può dimostrare che la campagna sia rimasta identica allo snapshot del render fornito dal chiamante tra la revisione e la consegna.
L'opzione ENABLED, il paid_consent e il remoteTemplateSnapshotLimitationAcknowledged sono disattivati per impostazione predefinita. Il chiamante deve fornire e calcolare l'hash di un snapshot completo del render, bloccare operativamente la campagna remota corrispondente e fornire una deliveryKey durevole. Il prezzo viene ricontrollato prima della classificazione, ma l'attuale API di classificazione non dispone di un campo atomico expectedPriceMillicents. Gli stati di consegna duplicati, bloccati, rifiutati e ambigui non vengono mai reinviati automaticamente.
Scarica lo ZIP sperimentale dei sorgenti di BigMailer
1. Installa
Estrarre questo file ZIP sorgente non pubblicato nell'applicazione server controllata Node.js 24+ e consultare README.md e SECURITY.md. Importare il wrapper e il file delivery store direttamente da src. Questa non è un'installazione tramite npm o marketplace di BigMailer e non ha dipendenze runtime di terze parti.
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. Configura in modo sicuro
Mantenere enabled, paidConsent e remoteTemplateSnapshotLimitationAcknowledged false fino alla revisione. Memorizzare le chiavi API e gli UUID di brand e campagna solo lato server. Posizionare FileDeliveryStore su uno storage privato durevole. Copiare i prezzi appena revisionati in expectedPricing, restando inteso che l'attuale API di classify non può bloccarli in modo atomico.
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. Usa deliberatamente
Per ogni invio API controllato, fornire una deliveryKey stabile, tutte le alternative visualizzate text/plain e text/html, l'esatto render snapshot e lo snapshotDigest(snapshot). Accettare la remote-template limitation solo quando un controllo operativo blocca la revisione della campagna BigMailer corrispondente a tale snapshot. La Dashboard e gli invii API non correlati ignorano questo wrapper.
await integration.send({
deliveryKey: durableBusinessEventId,
snapshot,
snapshotSha256: snapshotDigest(snapshot),
email: recipient,
variables,
});
Risultati, errori e limiti
Il file store riserva la delivery key prima della classificazione. Risultati di consegna duplicati, in conflitto, bloccati, rifiutati o ambigui non possono essere inviati nuovamente in automatico. L'endpoint di invio di BigMailer accetta merge data invece del corpo ispezionato, pertanto una classificazione riuscita non garantisce che il contenuto mutabile della campagna remota corrisponda ancora; utilizzare un altro provider quando è richiesto un accoppiamento esatto.
Privacy e operazioni a pagamento
L'analisi invia il nome visualizzato del mittente, l'oggetto e il corpo del messaggio a SendRepute. I destinatari e gli allegati non vengono trasmessi separatamente, ma il contenuto incluso nel corpo viene trasmesso. Mantieni segrete le credenziali e disabilita il logging delle richieste/corpo. Nessuna garanzia di posizionamento in posta in arrivo o di consegna.
La classificazione è a pagamento. Leggi i prezzi attuali e i limiti di spesa del tuo account prima di fornire il consenso. Una richiesta identica per account/contenuto/modello può riprodurre una ricevuta entro 24 ore; modifiche al contenuto o al modello possono comportare un nuovo addebito. Non dare per scontato che un nuovo tentativo sia gratuito. La riscrittura AI richiede un preventivo di addebito massimo per la ricevuta genitore, la modalità e i termini selezionati prima dell'invio a pagamento; interroga una ricevuta in corso e recupera i risultati completati con l'ID richiesta originale invece di avviare un'altra richiesta. La funzione Riscrivi Tutto può verificare una bozza finale renderizzata esatta senza un ulteriore addebito. La generazione di modelli AI e l'accesso nativo VIP hanno prezzi separati; l'elaborazione standard del builder è gratuita. Nessun risultato di analisi, riscrittura o builder garantisce la consegna, il posizionamento in posta in arrivo o la conformità.
La validazione offline non costituisce certificazione di ogni versione di framework, plugin o transport. Leggere le istruzioni di installazione e sicurezza incluse, mantenere disabilitata l'analisi a pagamento fino alla configurazione deliberata e testare la policy di errore scelta prima di abilitarla per email critiche.
Consulta i prezzi
Riferimento API cliente
Chiedi supporto per l'integrazione