Integraciones de flujo de trabajo de correo electrónico y SDK
Explore SendRepute APIs y las integraciones para el análisis de correos electrónicos, reescrituras por IA de pago independiente y herramientas de diseño. Los endpoints centrales de análisis, reescritura y constructor no envían correos; las Campaigns de entrega habilitadas deliberadamente y ciertos adaptadores de proveedores pueden realizar envíos utilizando su proveedor configurado. Ningún resultado garantiza la ubicación en la bandeja de entrada.
El paquete de Node.js está disponible en npm. Otras integraciones se pueden descargar aquí o instalar desde un repositorio público verificado de GitHub. Elija una integración, siga su guía y revise los permisos, los precios actuales y los ajustes de errores antes de activarla.
Mantenga su flujo de trabajo de correo electrónico actual. Estos ejemplos centrales de la API solo analizan, reescriben o crean contenido; nunca envían correos electrónicos. Por separado, las entregas de Campañas habilitadas deliberadamente y ciertos adaptadores de proveedores pueden realizar envíos a través de su proveedor configurado. Elija una herramienta por su instalación, configuración, ejemplos y límites operativos. Los ejemplos no se ejecutan en esta página; revise las operaciones de pago y las acciones de envío por separado.
Plugin de WordPress
0.2.0
Requiere WordPress 5.7+, PHP 7.4+ y OpenSSL. Suba el ZIP a través de Plugins > Añadir nuevo > Subir plugin, luego abra Ajustes > SendRepute. Configure el token de cada sitio y el consentimiento de análisis de pago por separado. La evidencia del ciclo de vida de instalación cubre WordPress 6.8.3 con WooCommerce 10.4.3; la evidencia de plugins SMTP independientes cubre WordPress 7.1.2 con WP Mail SMTP 4.9.0 y FluentSMTP 2.4.0.
Comprueba los mensajes a través de pre_wp_mail sin reemplazar el SMTP ni reescribir los mensajes. El modo consultivo permite la entrega; el modo de bloqueo aplica un umbral de probabilidad. La política de fallo de la API se configura por separado. Los plugins que omiten wp_mail no están cubiertos; los cambios de transporte posteriores no se analizan. El bloqueo no pone los mensajes en cola.
El análisis está desactivado por defecto. Configure un token de cliente con ámbito, ejecute la comprobación de conexión no pagada, revise los precios y otorgue el consentimiento explícito antes de activar el análisis de pago. Las acciones manuales de IA requieren una confirmación por separado.
Descargar ZIP de WordPress
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Ejecute estos comandos desde el directorio de WordPress con WP-CLI disponible, o suba el ZIP descargado a través de Plugins > Añadir nuevo > Subir plugin y actívelo. Abra Ajustes > SendRepute. Configure y active cada sitio por separado en multisite. Mantenga una combinación compatible de WordPress/PHP; una versión mínima no es una recomendación para ejecutar software al final de su vida útil.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Alternativa: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Configurar de forma segura
Cree un token de cliente del lado del servidor con los alcances classify, account:read y catalog:read, vencimiento y límites de gasto. Introdúzcalo en los ajustes o cargue SENDREPUTE_API_TOKEN desde el almacén de secretos de su servidor como se muestra. Los tokens almacenados utilizan cifrado autenticado con sales de WordPress y OpenSSL; vuelva a introducirlos tras una rotación de sales. Ejecute la comprobación de conexión no pagada, revise los precios de clasificación y, a continuación, habilite explícitamente el análisis automático. Establezca el modo de aviso/bloqueo, el spamProbabilityThreshold y la política independiente de 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. Usar deliberadamente
La función siguiente utiliza wp_mail normal y solo envía cuando su aplicación la llama. Con el análisis de pago habilitado, el plugin analiza en pre_wp_mail y luego permite o bloquea el transporte existente. Proporcione su propio destinatario autorizado; realice primero las pruebas contra un receptor de correo local que no sea de retransmisión. Un resultado falso significa que el llamador debe gestionar el envío rechazado: no se pone en cola.
// Call deliberately: this sends through your existing WordPress transport.
function sendrepute_reviewed_message($recipient) {
return wp_mail(
$recipient,
'Your requested account summary',
'Here is the account summary you requested.'
);
}
¿Qué más puede hacer?
Ajustes también proporciona acciones manuales de reescritura por AI y generación de plantillas con confirmación de pago por separado. La visualización de precios necesita vip:read; la reescritura necesita rewrite; la generación necesita ai:generate, y la generación VIP requiere una membresía VIP activa. Los resultados son texto escapado de solo lectura: nunca se aplican ni se envían automáticamente. Los tokens existentes no adquieren alcances de forma automática.
Resultados, fallos y límites
Advisory permite la entrega; el bloqueo compara la probabilidad de spam finita con su umbral. Los tiempos de espera y fallos de la API siguen la política de fallos separada, no una etiqueta de spam. Los bloqueos locales opacos (local-flock) suprimen análisis repetidos durante 24 horas; los resultados de red desconocidos no se reintentan automáticamente. Los envíos en sí no se deduplican. Las comprobaciones de actualización instaladas cubrieron un ZIP 0.1.0 rastreado actualizado a 0.2.0, el rechazo/guardado de nonce de administrador y la ruta de WooCommerce seleccionada. Una matriz separada de 40 escenarios cubrió ambos órdenes de carga de complementos con WP Mail SMTP y FluentSMTP, incluyendo To/Cc/Bcc, Reply-To, encabezados, archivos adjuntos, rechazo de SMTP y resultados de la política. Estas tuplas exactas no certifican otras versiones de CMS, complementos SMTP o proveedores. Los ganchos que omiten wp_mail y los cambios posteriores en el transporte permanecen fuera de la cobertura. La desactivación preserva la configuración; la desinstalación elimina las credenciales incluso al conservar configuraciones desactivadas. Elimine usted mismo un token de wp-config.
Adaptador de correo para WooCommerce
0.2.0
Incluido en el mismo archivo ZIP de SendRepute 0.2.0 que el complemento de WordPress; no existe un complemento o descarga de WooCommerce por separado. Requiere la línea base del complemento: WordPress 5.7+, PHP 7.4+ y OpenSSL. El adaptador fue revisado a nivel de código fuente frente a WooCommerce 10.4.3, no certificado para todas las versiones de WooCommerce o extensiones de correo.
El análisis de WooCommerce tiene su propio interruptor de administrador y selecciones exactas de tipos de correo integrados, todos desactivados por defecto. Los controles globales de análisis y consentimiento de pago también deben estar activos. Los tipos no seleccionados y los definidos por extensiones omiten el análisis. Cada tipo customer_* integrado seleccionado está protegido y es solo consultivo: puede ser analizado pero nunca se bloquea. El correo multipart seleccionado falla en la clasificación antes de cualquier solicitud de pago; el modo consultivo o de apertura por fallo preserva la entrega, mientras que el cierre por fallo bloquea solo el correo no protegido.
Descargar ZIP compartido para WordPress y WooCommerce
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Este es el mismo ZIP instalable utilizado en la guía de WordPress. Instálelo una sola vez; no instale un segundo complemento de WooCommerce. Active SendRepute, luego abra Ajustes > SendRepute. Mantenga WordPress, WooCommerce, PHP y el transporte de correo real compatibles y actualizados.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-wp.zip
wp plugin install ./sendrepute-wp.zip --activate
Alternativa: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-wordpress.git
cd sendrepute-wordpress
python3 package.py
2. Configurar de forma segura
Utilice un token de cliente de ámbito limitado desde los secretos del servidor o la configuración cifrada de WordPress. Primero configure la comprobación compartida de conexión no de pago, la revisión del precio actual, el consentimiento global de pago, el modo de riesgo, el umbral y la política de fallos. Luego, habilite por separado el análisis de WooCommerce y seleccione solo los tipos de correo electrónico integrados que haya revisado. Los tipos definidos por extensiones nunca se seleccionan automáticamente.
// 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. Usar deliberadamente
Continúe enviando a través de WooCommerce normalmente. El adaptador envuelve el callback ya elegido por WooCommerce y preserva sus argumentos originales y transporte; no proporciona un nuevo método send. Si otro filtro muta los argumentos del callback, si el correo ordinario se anida durante ese callback, o si un callback personalizado nunca llama a wp_mail, el análisis se omite conservadoramente en lugar de entrar en la ruta general de pago. Pruebe los tipos no críticos seleccionados con un sumidero de correo sin retransmisión.
Resultados, fallos y límites
El correo de una sola parte seleccionado sigue el aviso de WordPress compartido, el umbral y las políticas de fallo, excepto que cada tipo customer_* está protegido y es solo consultivo (advisory-only). El correo protegido de tipo customer_* siempre continúa después de un resultado de alto riesgo, fallo de API o contenido no compatible. WooCommerce construye alternativas multipart después de pre_wp_mail, por lo que el correo multipart seleccionado falla antes de cualquier solicitud pagada en lugar de ser clasificado parcialmente; solo el correo no protegido seleccionado puede ser rechazado por fallo de cierre (fail-closed). El contexto de la retrollamada se elimina después del éxito, fallo y envíos anidados.
Backend de correo para Drupal
0.1.0
Requiere Drupal 10.3+ u 11.x y PHP 8.1+. Instale el ZIP como un módulo, otorgue administer sendrepute solo a administradores de confianza, configure un nombre de visualización del remitente sin dirección delimitado y seleccione rutas de correo exactas de module/key. La versión 0.1.0 admite únicamente el php_mail del núcleo de Drupal; es un backend de Mail, no un proveedor ni un transporte de reemplazo. La evidencia en sitios instalados cubre versiones exactas de Drupal 10.6.17 y 11.4.7 con PHP 8.4.10.
El consentimiento de pago y cada ruta están desactivados por defecto. Cada ruta exacta utiliza el delegado fijo de php_mail del núcleo, modo consultivo o de bloqueo, una política independiente de preservar o bloquear ante fallos, el umbral y la selección deliberada de correos críticos. El correo de cuenta y seguridad sigue siendo entregable a menos que esa ruta exacta permita explícitamente el bloqueo crítico. La misma instancia de php_mail formatea y envía un cuerpo final escalar; las salidas multipart y con adjuntos no son compatibles.
Descargar ZIP para Drupal
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Ejecute desde la raíz del proyecto Drupal, o cargue el ZIP con el instalador de módulos de Drupal. El archivo contiene una raíz de módulo sendrepute adecuada para modules/contrib. Actívelo, otorgue administrar sendrepute solo a administradores de confianza y abra Configuración > Sistema > SendRepute.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-drupal.zip
unzip sendrepute-drupal.zip -d modules/contrib
drush en sendrepute -y
Alternativa: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-drupal.git
cd sendrepute-drupal
2. Configurar de forma segura
Almacene un SENDREPUTE_API_TOKEN con alcance classify únicamente en el entorno del proceso web/PHP. Nunca se acepta mediante el formulario ni se exporta en la configuración de Drupal. En el formulario, ingrese un nombre de visualización del remitente requerido de máximo 320 bytes sin dirección, corchetes angulares o controles. Añada una línea de siete campos por cada ruta exacta como se muestra; el delegado debe ser php_mail. Elija modo advisory/block, política de preserve/block ante fallos, threshold y crítico yes/no. Comience con advisory, preserve y 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. Usar deliberadamente
Siga llamando al gestor de correo normal de Drupal. Para una ruta con suscripción activa, sendrepute_mail llama al format() del php_mail del núcleo, analiza ese cuerpo escalar final, aplica la política y luego llama al mail() de la misma instancia almacenada de php_mail. Otros IDs de delegado son rechazados. No utiliza hook_mail_alter y no sobrescribe el mensaje.
Resultados, fallos y límites
Un éxito validado bloquea solo en o por encima del umbral configurado en modo de bloqueo. El resultado de clasificación anidado completo y la respuesta de facturación se validan antes de que spamProbability pueda afectar la entrega. Los fallos de API, autenticación, saldo, límite de velocidad, malformación, multiparte, indicador de adjunto y tamaño siguen la política de fallo de ruta independiente, excepto que el correo crítico protegido continúa. La matriz instalada 10.6.17/11.4.7 cubrió la instalación y el reemplazo de ZIP in situ mientras estaba habilitado, el inicio de sesión de administrador real, el rechazo/guardado de Form API CSRF, el descubrimiento de complementos, la suscripción a rutas, la clasificación sintética, la preservación de correos críticos y el php_mail principal a través de un sumidero local. Las comprobaciones de fuente base también cubren archivos inmutables 10.3.0 y 11.0.0; ningún resultado certifica cada parche posterior o remitente contribuido. Se envían el nombre para mostrar configurado, el asunto no vacío y el cuerpo enmarcado por longitud; se excluyen las direcciones, destinatarios, encabezados, parámetros y archivos adjuntos. El asunto está limitado a 998 bytes y el cuerpo a 256 KiB. Hay un intento HTTPS verificado, sin redirecciones, reintentos ni cola.
Módulo de correo para PrestaShop
0.1.1
La versión 0.1.1 admite exactamente PrestaShop 9.0.0, 9.0.1, 9.0.2 y 9.0.3 con PHP 8.1–8.4. Suba el ZIP en Módulos > Gestor de módulos, luego configure la clasificación de correo de SendRepute. Las cuatro versiones oficiales preconstruidas de la rama classic superaron la instalación aislada, la configuración de administrador autenticado y las comprobaciones de actualización por ZIP; sus implementaciones de Mail::send() sin modificar también superaron la matriz de correo real fuera de línea. PrestaShop 8, 9.1+ y parches posteriores de 9.0 no listados no son compatibles.
El módulo, el consentimiento de pago/contenido, y la selección exacta de la plantilla están desactivados por defecto. Analiza el asunto final renderizado y cada cuerpo visualizado compatible sin reconstruir el mensaje de Symfony. Un mensaje que contenga tanto text/plain como text/html se envía en una única solicitud de clasificación acotada: la alternativa plana se vuelve inerte, el HTML original se preserva, y el servicio analiza cada alternativa tipada de forma independiente sin concatenación. El resultado utiliza el riesgo más alto con las auditorías de contenido completas, produce una clasificación pagada y nunca devuelve una puntuación de seguridad parcial. El modo consultivo nunca interrumpe el envío. El bloqueo por umbral y el cierre por fallo lanzan una excepción que implementa tanto la ExceptionInterface de Symfony Mailer como la ModuleErrorInterface de PrestaShop; en cada versión compatible, la prueba instalada observó que Mail::send() devuelve false sin entrega SMTP. La política de fallos es independiente del umbral de riesgo.
Descargar ZIP para PrestaShop
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Descargue el ZIP 0.1.1, luego use Módulos > Gestor de módulos > Subir un módulo y selecciónelo. Abra Configurar para la clasificación de correo de SendRepute. No fuerce la instalación fuera del rango exacto de PrestaShop 9.0.0–9.0.3: el comportamiento de cancelación y firma depende de las rutas auditadas de Mail::send().
curl -fLO https://www.sendrepute.com/downloads/sendrepute-prestashop.zip
Alternativa: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-prestashop.git
cd sendrepute-prestashop
2. Configurar de forma segura
Establezca SENDREPUTE_API_BASE al origen HTTPS de producción de SendRepute canónico suministrado para este módulo y SENDREPUTE_API_TOKEN a un token de servidor de ámbito en el entorno PHP-FPM/servidor. La base debe ser un origen HTTPS de DNS público sin rutas; se rechazan literales, credenciales, redirecciones y respuestas de DNS privado. Ejecute la comprobación de conexión de cuenta/precio no pagada, luego habilite explícitamente el módulo, el consentimiento de contenido/pago y los nombres exactos de las plantillas. Elija asesoría/bloqueo, el umbral y la política de fallos abierta/cerrada de forma independiente.
export SENDREPUTE_API_BASE="replace-with-the-canonical-sendrepute-https-origin"
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
3. Usar deliberadamente
Continúe utilizando el flujo normal de Mail::send de PrestaShop. El hook inicial solo recuerda una plantilla exacta con consentimiento (opted-in). El hook final lee el asunto, el cuerpo de texto y el cuerpo HTML de Symfony Email ya renderizados sin cambiar destinatarios, encabezados, adjuntos o el transporte. Para cuerpos duales, envía texto plano inerte y el HTML original como alternativas tipadas en una sola solicitud; la normalización independiente del servicio evita que un fragmento consuma a otro mientras retiene los destinos visibles de enlaces e imágenes HTML para la auditoría. Un cuerpo único de texto plano se mantiene en la ruta estrecha de texto inerte, y un cuerpo único HTML se mantiene en la ruta estrecha de extracción de DOM. La clasificación se completa antes de que PrestaShop cree un mensaje separado firmado con DKIM. La matriz de versiones soportadas verificó la estructura multipart emitida además del hash del cuerpo DKIM y la firma RSA después de la clasificación. La ruta de firma fijada de PrestaShop omite Bcc de los encabezados firmados preparados y pierde ese destinatario oculto de SMTP; por lo tanto, la evidencia de firma válida no establece compatibilidad de entrega con Bcc. No combine DKIM y Bcc en esta ruta soportada. Las fuentes de visualización no soportadas, la semántica activa, el HTML ambiguo en quoted-printable o base64, y el contenido agregado excedido siguen la política de fallos configurada antes del pago. Deje las plantillas críticas sin seleccionar a menos que se aprueben deliberadamente.
Resultados, fallos y límites
El clasificador acepta un cuerpo text/plain, un cuerpo text/html o ambos como alternativas visualizadas analizadas independientemente. El texto literal, las entidades, el contenido oculto y de estilo en una alternativa aceptada no pueden consumir ni ocultar una alternativa posterior; el HTML ambiguo en quoted-printable o base64 se rechaza antes del pago en su lugar. Cualquier alternativa aceptada puede determinar el resultado de mayor riesgo, mientras que las auditorías de contenido cubren cada alternativa; la clasificación se cobra una sola vez después de que la entrada acotada completa es aceptada. El cuerpo heredado requerido duplica exactamente la alternativa plana inerte para un mensaje dual, y ese duplicado más ambas alternativas tipadas comparten el presupuesto exacto de solicitud de 524288-byte. Los destinatarios, adjuntos y recursos incrustados se excluyen, y el mensaje de transporte original previo a la firma se preserva. El fixture de correo real verifica por separado la integridad de MIME/firma y los destinatarios SMTP reales: las firmas DKIM permanecen válidas después de la clasificación, pero la ruta firmada upstream auditada no preserva los destinatarios Bcc. Una clasificación validada almacena un resumen de asesoría reciente limitado. El modo de bloqueo lanza una excepción solo en el umbral o por encima de este; la excepción de interfaz dual sobrevive al despacho del hook y produce false antes del transporte en las cuatro versiones instaladas. El contenido no soportado, los errores de API y de validación siguen la política abierta/cerrada independientemente. Un intento HTTPS utiliza DNS público fijado, TLS verificado, tiempos de espera finitos, un límite de respuesta de 256 KiB, sin redirecciones y sin reintentos. El bloqueo depende de la captura de excepciones auditada de Mail::send() de PrestaShop, no del valor de retorno del hook final.
Adaptador de Symfony Mailer
0.1.1
Requiere PHP 8.1+ y está dirigido únicamente a Symfony Mailer 6.4 o 7.4; las versiones exactas verificadas son 6.4.46 y 7.4.19. No se garantiza compatibilidad con Symfony 8.1 ni con líneas no probadas. Instale el archivo ZIP fuente local a través de un repositorio de ruta en Composer; este paquete no está publicado en Packagist.
El bundle y el consentimiento de pago están desactivados por defecto, y solo los mensajes con el encabezado de inclusión configurado exactamente son elegibles. La política de puntuación consultiva o de bloqueo es independiente de la política de fallos de permitir o bloquear. La clasificación se ejecuta en el MessageEvent oficial previo al envío; el rechazo utiliza MessageEvent::reject(). Los eventos de clonación en cola se omiten para que el evento de transporte del worker sea el único punto de clasificación de pago.
Descargar ZIP fuente de Symfony
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Extraiga el archivo ZIP descargado en un directorio de paquetes retenido, registre ese directorio como un repositorio de ruta de Composer, requiera el paquete exacto 0.1.1 y registre SendRepute\Symfony\SendReputeBundle si Flex no lo hace. El archivo fuente es local y no está publicado.
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: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-symfony.git
cd sendrepute-symfony
2. Configurar de forma segura
Resuelva SENDREPUTE_API_TOKEN a partir de secretos del servidor. Mantenga enabled y paid_analysis_consent en false mientras revisa los precios actuales. El modo, el umbral y la política de fallos son independientes. El punto final está fijado a HTTPS verificado con plazos delimitados, sin redirecciones ni reintentos, y un límite de respuesta de 1 MiB.
send_repute:
enabled: false
paid_analysis_consent: false
api_token: '%env(SENDREPUTE_API_TOKEN)%'
mode: advisory
failure_policy: allow
spam_probability_threshold: 0.8
3. Usar deliberadamente
Agregue el encabezado de inclusión exacto solo a objetos Email revisados y no críticos, luego continúe a través del Mailer normal. El mensaje, el sobre, el transporte y el encabezado no se reescriben. Para la entrega de Messenger, configure el paquete en workers: los eventos de clonación del productor no se clasifican intencionadamente.
$email->getHeaders()->addTextHeader('X-SendRepute-Classify', 'yes');
$mailer->send($email);
Resultados, fallos y límites
Se admite exactamente un cuerpo de texto o HTML en memoria. Las alternativas mixtas, DataParts textuales, flujos o rutas, llaves CSS, marcado, sintaxis quoted-printable, encabezados base64 o base64 de cuerpo completo fallan antes del pago y siguen la política de fallos; el contenido ordinario sin llaves no cambia. Se validan todos los campos de respuesta anidados requeridos y las ramas de auditoría opcionales, y se rechazan las propiedades desconocidas. Advisory nunca bloquea por puntuación; el bloqueo rechaza en el umbral a través del evento de transporte real.
Adaptador de Rails Action Mailer
0.1.0
Requiere Ruby 3.2+ y está verificado estrictamente con Action Mailer 7.1.6 y Mail 2.9.1 reales; la ruta de callback también fue observada en Action Mailer 7.2.3.2. Esto no constituye una certificación de cada lanzamiento permitido de Rails 7.x. Instale el archivo ZIP fuente local a través de Bundler; no se declara publicación en RubyGems.
Ambas puertas de pago globales están desactivadas por defecto, y cada acción del mailer debe llamar a sendrepute_paid_preflight! explícitamente. El comportamiento de puntuación asesora/bloqueo y el comportamiento de fallo de preservar/bloquear son independientes. Las rutas de restablecimiento de contraseña, MFA, inicio de sesión, verificación, facturación y seguridad deben permanecer sin seleccionar. Cada mensaje multipart y contenido ambiguo de CSS, quoted-printable o con apariencia de Content-Transfer-Encoding: base64 se rechaza antes del pago; un cuerpo de texto decodificado o HTML aceptado se analiza sin cambiar el mensaje original ni el transporte.
Descargar ZIP fuente de Rails
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Extraiga el ZIP exactamente en vendor/sendrepute-rails, agregue la entrada de ruta local al Gemfile, ejecute Bundler en su entorno controlado e incluya SendRepute::Rails::Mailer en ApplicationMailer. Esta no es una instalación de RubyGems.
# Download sendrepute-rails.zip, then extract it into vendor/sendrepute-rails.
gem "sendrepute-rails", path: "vendor/sendrepute-rails"
Alternativa: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-rails.git
cd sendrepute-rails
2. Configurar de forma segura
Mantenga enabled y paid_consent en false hasta que se revisen los precios y rutas actuales. Lea el token de las credenciales de Rails u otro secreto del servidor. Configure advisory/block, preserve/block y el umbral de forma independiente; las devoluciones de llamada on_result y on_error no deben registrar el contenido del mensaje, los datos de autorización ni las respuestas completas.
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. Usar deliberadamente
Llame a sendrepute_paid_preflight! solo dentro de cada acción de mailer no crítica seleccionada deliberadamente. Las acciones normales omiten la clasificación. El gancho pagado utiliza la ruta before_deliver de Action Mailer; no se proporciona inclusión automática global y el adaptador no reescribe el Mail::Message.
class ApplicationMailer < ActionMailer::Base
include SendRepute::Rails::Mailer
end
def newsletter
sendrepute_paid_preflight!
mail(to: params[:to], subject: "News")
end
Resultados, fallos y límites
Se admite un cuerpo de texto decodificado text/plain o text/html. Cada entrada de normalizador multiparte o ambigua falla antes del pago y sigue la política de fallos. Una respuesta anidada tipada completa puede bloquear solo en modo de bloqueo al alcanzar o superar el umbral; el modo de asesoría preserva cada puntuación. Los callbacks de resultado y error reciben datos seguros inmutables, y las excepciones de callback o throw(:abort) se capturan localmente para que no puedan terminar la asesoría ni preservar la entrega. El endpoint fijo rechaza redirecciones y reintentos y utiliza un plazo total limitado. Pruebas reales de Action Mailer 7.1.6 superadas: 19 ejecuciones y 59 aserciones; no ocurrió ninguna solicitud de pago ni entrega real.
Adaptador de Spring JavaMailSender
0.1.1
Requiere Java 17+ y está dirigido a JavaMailSender de Spring Framework 6.2.x; la verificación de dependencias exacta utilizó Spring Framework 6.2.19. No hay una declaración de compatibilidad con Spring Boot 4 ni con versiones amplias del framework. Construya el archivo ZIP de fuentes local con Maven; no está publicado en Maven Central ni en otro registro.
El decorador, paidConsent, el modo asesor y los valores predeterminados de permitir en caso de fallo son explícitos. Solo sendWithSendRepute(...) realiza el análisis de pago previo al envío; cada sobrecarga ordinaria de send(...) omite la clasificación y delega sin cambios. Utilice send ordinario para correos críticos a menos que ese envío individual sea seleccionado deliberadamente. Las alternativas MIME mostradas compatibles se enmarcan juntas de forma inerte; el contenido no compatible, anidado, firmado, cifrado o ambiguo falla antes del pago.
Descargar ZIP fuente de Spring Java
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Extraiga el ZIP del código fuente 0.1.1, ejecute mvn verify e instálelo únicamente en su repositorio local de Maven controlado. La aplicación consumidora suministra su JavaMailSender existente y la implementación de correo en tiempo de ejecución. La verificación exacta de dependencias utilizó bytecode de Java 17, Spring Framework 6.2.19 y las versiones documentadas en el README incluido.
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: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-java.git
cd sendrepute-java
2. Configurar de forma segura
Construya SendReputeConfiguration a partir de un token del lado del servidor e interruptores explícitos. Mantenga enabled y paidAnalysisConsent como false hasta que se revisen los precios y las llamadas seleccionadas. La política de asesoramiento/bloqueo, el umbral (threshold) y la política de fallo permitir/bloquear son independientes. El endpoint está fijado a HTTPS verificado sin redirección ni reintentos.
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. Usar deliberadamente
Llame a sendWithSendRepute(...) únicamente para un SimpleMailMessage, MimeMessage o MimeMessagePreparator individual que deba incurrir en análisis. Se admiten sobrecargas simples y varargs. Cada sobrecarga normal de send(...) omite la clasificación. Los preparadores se renderizan una vez y el MIME preparado original se delega después de que la política lo permite.
// Paid classification is possible only on this explicit method.
reviewedSender.sendWithSendRepute(reviewedMessage);
// Every ordinary JavaMailSender send overload bypasses classification.
reviewedSender.send(criticalMessage);
Resultados, fallos y límites
Se analizan todas las partes de texto plano y HTML visualizadas compatibles; se excluyen destinatarios y archivos adjuntos. El recorrido está limitado a 16 niveles, 256 partes y 524,288 bytes UTF-8 visualizados. Los binarios en línea ignorados nunca se materializan; las fuentes visualizadas diferidas desconocidas o ilimitadas fallan antes de que se abra un flujo o se realice una solicitud de pago, y las lecturas de fuentes compatibles están limitadas. El enmarcado de entidades numéricas mantiene los fragmentos inertes a través del orden del normalizador del servidor verificado. Los lotes de varargs completos se preparan y normalizan antes de la primera solicitud de pago, y la inspección no genera cabeceras de Jakarta Mail. Se requiere una respuesta anidada recursivamente exacta.
Adaptador de correo para Magento Open Source
0.1.1
Soporta únicamente Magento Open Source 2.4.7-p5 y 2.4.7-p6 con las fuentes exactas e inmutables de mail-interface revisadas. Pasó las pruebas de integración tipadas fuera de línea, pero no se realizó una instalación completa de Magento; ninguna otra versión de Magento o Adobe Commerce está certificada. Instale el archivo ZIP local a través de un repositorio de rutas de Composer; no es un paquete de Adobe Marketplace.
El módulo, el consentimiento de pago y las listas de rutas están desactivados por defecto. Cada identificador de plantilla requiere dos aprobaciones exactas independientes; la criticidad nunca se infiere de su nombre. El plugin aroundSendMessage analiza en el límite final del transporte sin reconstruir el mensaje. La política de umbral de aviso/bloqueo y la política de fallo de preservar/bloquear son independientes; el bloqueo genera una MailException visible de Magento. Múltiples partes MIME mostradas y contenido ambiguo fallan antes del pago.
Descargar ZIP de fuentes para Magento
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Extraiga el ZIP en un directorio de paquetes retenido, registre su raíz SendRepute_MailAdapter como un repositorio de rutas de Composer, requiera la versión 0.1.1 y luego utilice el proceso normal de habilitación de módulos y actualización de configuración de Magento. No represente este archivo local como un paquete de 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: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-magento.git
cd sendrepute-magento
2. Configurar de forma segura
Establezca SENDREPUTE_API_TOKEN únicamente en el entorno del servidor PHP-FPM y CLI. En Tiendas > Configuración > Servicios > SendRepute, mantenga el módulo y el consentimiento de pago desactivados inicialmente. Añada cada identificador de plantilla exacto a ambas listas de aprobación de rutas independientes; los nombres, incluidos los nombres numéricos, nunca infieren criticidad. Configure el asesoramiento/bloqueo, el umbral (threshold) y el comportamiento de preservar/bloquear ante fallos por separado.
export SENDREPUTE_API_TOKEN="replace-with-a-scoped-server-token"
# Then configure Stores > Configuration > Services > SendRepute.
3. Usar deliberadamente
Continúe utilizando el flujo normal de plantillas y transporte de Magento. La correlación de rutas registra el identificador exacto y la tienda seleccionada a través de TransportBuilder, mientras que el complemento final aroundSendMessage lee las interfaces oficiales de correo electrónico tipado y MIME antes de llamar al mismo transporte. El estado del constructor se borra en finally, y las correlaciones de constructor/mensaje utilizan entradas de WeakMap con claves de objeto para que un transporte construido abandonado no pueda dejar una autorización de ID de objeto numérico reutilizable. El adaptador no proporciona un nuevo método send(...) ni muta el mensaje.
Resultados, fallos y límites
Solo se acepta una parte MIME visualizada compatible; los archivos adjuntos se preservan pero se excluyen del análisis. Múltiples partes visualizadas, codificaciones de transferencia o conjuntos de caracteres no compatibles, flujos, MIME anidado y texto de normalizador ambiguo fallan antes del pago. Una solicitud HTTPS verificada tiene plazos limitados y tamaño de respuesta acotado sin reintentos ni redireccionamientos. Un resultado anidado válido puede bloquearse en el umbral; el fail-block configurado lanza una MailException de Magento.
Adaptador .NET MailKit
0.1.0
Requiere .NET 8 y evidencia de dependencia exacta para MailKit/MimeKit 4.18.0. Es un envoltorio explícito alrededor de un IMailTransport propiedad de la aplicación, no es un gancho global, cliente SMTP o transporte de reemplazo. Compile o referencie el archivo ZIP de fuentes local; no se declara ninguna publicación en NuGet.
El adaptador y el consentimiento de pago están desactivados por defecto; el aviso y el envío preservado son valores predeterminados independientes. Las llamadas a AnalyzeAsync, AnalyzeThenSend o AnalyzeThenSendAsync son explícitas. El correo crítico de seguridad/cuenta necesita una categoría y consentimiento independientes por llamada. Cada alternativa plana/HTML mostrada compatible se enmarca de forma inerte en una solicitud delimitada; el contenido no compatible, anidado, firmado o cifrado falla antes del pago. El MimeMessage original y el token de cancelación llegan al transporte existente solo después de que la política lo permite.
Descargar ZIP de fuentes para .NET MailKit
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Extraiga el ZIP de origen y haga referencia a src/SendRepute.MailKit/SendRepute.MailKit.csproj desde el proyecto .NET 8 consumidor. La restauración obtiene MailKit/MimeKit 4.18.0. Este paquete de origen es local y no está publicado; no es una instalación de 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: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-dotnet.git
cd sendrepute-dotnet
2. Configurar de forma segura
Envuelva el IMailTransport existente propiedad de la aplicación con SendReputeMailAdapter. Lea el token de API desde la configuración del servidor y mantenga Enabled y PaidAnalysisConsent en false hasta que sean revisados. El umbral de aviso/bloqueo y los ajustes de fallo de preservar/bloquear son independientes. El endpoint, el suelo TLS, el comportamiento de un solo intento, los plazos y los límites de 1 MiB son fijos.
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. Usar deliberadamente
Invoque AnalyzeAsync solo para análisis, o AnalyzeThenSend y AnalyzeThenSendAsync para un comportamiento explícito previo al envío. No se intercepta ninguna ruta de correo ordinaria o global. Pase paidConsent y la categoría del mensaje en cada operación seleccionada; el correo crítico de seguridad/cuenta requiere la configuración de consentimiento crítico separada.
await adapter.AnalyzeThenSendAsync(message, new AnalysisConsent {
PaidAnalysisConsent = true,
Category = MessageCategory.Ordinary
}, cancellationToken);
Resultados, fallos y límites
La decodificación actual de MimeKit recopila cada alternativa admitida mostrada en text/plain y text/html en un marco inerte, excluyendo destinatarios y archivos adjuntos. El marco exterior que no es base64 y las entidades decodificadas tardíamente neutralizan las llaves CSS, el texto quoted-printable, los encabezados base64, el cuerpo completo en base64 y el marcado antes de la normalización del servicio. El contenido mostrado no compatible, anidado, firmado o cifrado falla antes del pago. Cada campo de respuesta requerido está tipificado; el flaggedTermCount opcional debe ser un entero no negativo y el contentAudit opcional se valida total y recursivamente contra el contrato público. El MimeMessage original exacto y el token de cancelación llegan al transporte suministrado solo cuando las políticas independientes de puntuación y fallo lo permiten.
Análisis manual de borradores en Zapier
0.2.0
Receta manual de Zapier para mostrar el análisis de pago de exactamente tres cadenas de borradores seleccionadas por el propietario. No es una aplicación de Zapier de SendRepute, un listado del mercado, un artefacto de importación, un adaptador previo al envío, un remitente, una ruta de permitir/bloquear o un clasificador de mensajes completos. Zapier Webhooks utiliza un proxy HTTPS delimitado operado por el propietario porque el token de SendRepute no debe ingresar al Zap.
Dos constantes en tiempo de compilación están en falso por defecto antes de HTTP. El Zap mapea el nombre de visualización del remitente, el asunto y el cuerpo únicamente, envía el JSON al diseño del proxy del propietario incluido, valida completamente la respuesta anidada y luego muestra los campos de aviso y facturación en un paso de revisión privado. No debe agregar un remitente, cumplimiento de Paths, Autoreplay o ruta de preservación de fallos; los pasos fallidos de Code o Webhook se detienen.
Descargar ZIP de recetas para Zapier y Make
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Descargue y extraiga el código fuente de la receta 0.2.0 compartida. Lea la guía de Zapier incluida y despliegue el proxy Node de bucle invertido incluido solo detrás de un proxy inverso HTTPS gestionado por el propietario. Este paquete no lo despliega. No existe una aplicación de Zapier de SendRepute ni un artefacto de Zap importable.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cd sendrepute-automation-recipes
Alternativa: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Configurar de forma segura
Mantenga el Zap desactivado. En el código fuente exacto de preflight, ENABLED y PAID_CONSENT permanecen ambos en falso hasta que se revise el uso de pago. El proxy del propietario almacena el SENDREPUTE_API_TOKEN; el Zap recibe solo una credencial revocable por separado de SENDREPUTE_PROXY_CREDENTIALS. Los editores y el historial de tareas pueden exponerla, así que restrínjala, rótela y revóquela. Configure límites de token-bucket y concurrencia por credencial, límites globales de conexión/concurrencia, un presupuesto diario de pago persistente establecido por el propietario, límites de gasto ascendentes restrictivos y controles coincidentes de tamaño/tasa/plazo en el terminador TLS. No habilite Autoreplay.
// In zapier/preflight.js; review charges before changing either literal.
const ENABLED = false;
const PAID_CONSENT = false;
3. Usar deliberadamente
Construya los pasos manualmente: disparador en borrador; mapeo del código preflight incluyendo solo el remitente, asunto y cuerpo; Webhooks POST con filas JSON al proxy del propietario; código de validación de respuesta; visualización de revisión privada. Nunca interpole JSON sin procesar manualmente. Muestre solo requestId, model, label, spamProbability y facturación; no añada una acción de correo ni una decisión de Paths.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Resultados, fallos y límites
La receta analiza solo las tres cadenas mapeadas; el MIME no mapeado, las alternativas HTML, los archivos adjuntos y el contenido final saliente permanecen sin analizar. El preflight conservador rechaza los disparadores conocidos del normalizador pero no garantiza la cobertura de todo el mensaje. Los límites de tasa, concurrencia y presupuesto diario del proxy rechazan antes del flujo ascendente, y la reserva del presupuesto persiste antes del intento de pago; ejecute un proceso de proxy por archivo de presupuesto. El proxy realiza un único intento acotado por HTTPS fijo. Cualquier respuesta exacta no 200 o incompleta lanza un error y se detiene; no hay resultados de tipo preserve, Resume o sustitutos.
Análisis manual de borradores en Make
0.2.0
Instrucciones de escenario de Make manuales para mostrar el análisis de pago de exactamente tres cadenas de borradores seleccionadas. No es un blueprint, una aplicación de SendRepute aprobada, un remitente de correo, una ruta de aplicación ni una declaración sobre MIME no mapeado, HTML, archivos adjuntos o el eventual contenido saliente. El token de portador pertenece únicamente al llavero seguro de Make HTTP.
Los booleanos persistentes enabled y paidConsent tienen el valor predeterminado false y un filtro AND se detiene antes de HTTP. El JSON es producido por el módulo JSON de Make y enviado una sola vez por el módulo HTTP con redirecciones y reintentos desactivados. Un filtro de respuesta es solo una protección de visualización, no una validación completa o permiso para enviar. Los fallos de HTTP utilizan Break, nunca Resume ni sustituyen la salida.
Descargar ZIP de recetas de Zapier y Make
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Descargue y extraiga el código fuente compartido de la receta 0.2.0, luego siga la guía de Make incluida para construir manualmente los módulos nativos actuales. No se garantiza ningún blueprint, aplicación de marketplace o formato de importación. Mantenga desactivada la programación de escenarios mientras realiza pruebas contra un endpoint simulado.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-automation-recipes.zip
unzip sendrepute-automation-recipes.zip
cat sendrepute-automation-recipes/make/README.md
Alternativa: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-automation.git
cd sendrepute-automation
2. Configurar de forma segura
Cree variables persistentes de tipo booleano en Tools con enabled=false y paidConsent=false, seguidas de un filtro AND que requiera que ambos sean true. Utilice JSON > Create JSON exactamente para el remitente, asunto y cuerpo. Almacene el token portador de SendRepute únicamente en el llavero seguro de la aplicación HTTP; los escenarios exportados no deben contener ninguna credencial.
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. Usar deliberadamente
Configure un HTTP POST a la URL fija de classify. Seleccione el tipo de Body Raw y el control de content-type application/json sin añadir un encabezado de texto libre conflictivo, luego mapee la salida serializada desde JSON > Create JSON. Active la respuesta analizada, desactive las redirecciones, establezca un timeout de 10 segundos y no añada ningún repetidor ni reintento automático. Requiera el límite de respuesta de 1 MiB del módulo; si no está disponible, use en su lugar un proxy delimitado controlado por el propietario. Añada únicamente una visualización de revisión privada después del Minimal display guard—nunca un remitente o un enrutador de permitir/bloquear.
{
"sender": "Mapped draft sender display name",
"subject": "Mapped draft subject",
"body": "Mapped draft body"
}
Resultados, fallos y límites
Solo las cadenas mapeadas son analizadas; la normalización no es idéntica a un correo electrónico original o saliente. El filtro de respuesta verifica solo el estado y la presencia del resultado principal/facturación y no es, explícitamente, una validación completa de esquema o cumplimiento. Los errores HTTP utilizan Break para que las acciones posteriores no se ejecuten; nunca utilice Resume, salidas fabricadas o una ruta de preservación ante fallos.
Node.js SDK
0.1.1
SDK solo para servidor para Node.js 18.17+. Instale @sendrepute/node desde npm o utilice el tarball descargable. El adaptador opcional de Nodemailer preserva su transporte existente. Establezca una clave de API con alcance y una URL base de API explícita en su entorno de servidor, nunca en código del navegador.
Registre createSendReputePlugin en la etapa de flujo solo después de revisar los precios y habilitar deliberadamente el consentimiento de análisis de pago. El modo asesor informa de los hallazgos sin bloquear la entrega. El modo de bloqueo aplica spamProbabilityThreshold; onApiFailure elige allow o block, mientras que un rechazo por cambio de precio siempre bloquea la entrega. La clasificación es una operación de API de pago.
Descargar tarball de Node.js
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
Ver paquete npm verificado
1. Instalar
El paquete npm verificado es @sendrepute/node versión 0.1.1; fije las instalaciones del registro a @sendrepute/node@0.1.1. El tarball del sitio web y el repositorio público fijado proporcionan el código fuente y la compilación de la versión 0.1.1. Nodemailer es opcional y solo se necesita para el adaptador de transporte. El SDK soporta solicitudes de API de cliente tipadas para account, catalog, classification, AI y builders. Utilícelo en un servidor Node.js, nunca en un bundle de navegador.
npm install @sendrepute/node nodemailer
Alternativa: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
npm install @sendrepute/node@0.1.1
npm install nodemailer
2. Configurar de forma segura
Inyecte SENDREPUTE_API_KEY desde el almacén de secretos de su servidor y establezca la URL base explícita a continuación para la API de cliente alojada. No pegue secretos en comandos, archivos fuente o registros. Otorgue solo los alcances que sus operaciones requieran. La configuración utiliza un transporte de renderizado local, no SMTP; maxRetries se establece en cero aquí para que los intentos de pago sean deliberados.
export SENDREPUTE_API_BASE_URL=https://www.sendrepute.com/api
Configuración de Nodemailer
Este ejemplo configura un transporte de renderizado local y no llama a sendMail. El envío a través del plugin configurado realiza un análisis de pago. Sustituya el transporte local por su transporte SMTP existente solo cuando esté listo.
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. Usar deliberadamente
Utilice el cliente de la configuración anterior. Lea la cuenta y los precios actuales antes de mostrar una acción de consentimiento. Invoque classifyAfterConsent solo desde una acción de servidor autenticada tras la confirmación; devuelve la respuesta tipada de clasificación y facturación. El envío a través del plugin Nodemailer configurado también es una acción de clasificación de pago. El adaptador requiere paidAnalysisConsent: true y rechaza cualquier otro valor antes del registro; configúrelo solo después de la autorización.
// 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", {}),
]);
}
Constructores VIP estándar y nativos
El constructor estándar gratuito importa, valida, compila y exporta MJML como HTML, MJML o un ZIP de ambos. El constructor VIP nativo independiente utiliza su propio formato de documento, no MJML: sus operaciones de importación, validación, compilación y exportación requieren una membresía activa y un derecho de acceso abierto en propiedad, y su ZIP contiene tres variantes de HTML CSS. La generación opcional por IA se paga por separado, produciendo un diseño editable en MJML estándar o VIP nativo; muestre el precio vigente actual y pase el expectedPriceMillicents confirmado, nunca un precio predefinido. Las respuestas ZIP contienen archiveBase64, no un campo html: decodeExportBytes devuelve los bytes para que su aplicación los guarde. Estos puntos de conexión de procesamiento no recuperan activos, no conservan diseños ni envían correos electrónicos.
import { decodeExportBytes } from "@sendrepute/node";
async function exportStandardZip(mjml) {
const exported = await client.request("customerStandardBuilderExport", {
body: { mjml, format: "zip", filename: "newsletter.zip" },
});
return decodeExportBytes(exported);
}
async function generateNativeAfterConsent(prompt, expectedPriceMillicents, confirmed) {
if (confirmed !== true) throw new Error("Paid consent required");
return client.request("customerCreateVipEmailTemplate", {
body: { prompt, expectedPriceMillicents },
});
}
¿Qué más puede hacer?
Los IDs de operación generados cubren lecturas de cuenta y precios, clasificación y ediciones manuales, reescritura de AI/generación de plantillas, planes/estado/compras VIP, plantillas nativas/derechos de acceso e importación/exportación estándar/nativa sin estado. Consulte los ejemplos de código y la referencia de la API del cliente para cada tipo de solicitud, alcance requerido y precio actual. Las lecturas del catálogo no compran acceso. Las nuevas capacidades de pago requieren tokens con alcances deliberados y confirmación explícita en la interfaz de usuario.
Resultados, fallos y límites
SendReputeError expone status, code y requestId; conserve únicamente esos metadatos operativos seguros. Nunca registre cuerpos, prompts, encabezados o respuestas completas. AbortSignal cancela el trabajo; timeoutMs se aplica por intento. Los reintentos limitados son conscientes de la operación y la protección de recibos tiene tiempo limitado, no es facturación exacta ilimitada. El modo Advisory de Nodemailer informa sin bloquear; el bloqueo utiliza spamProbabilityThreshold y onApiFailure de forma independiente. Conserve y pruebe su transporte real por separado.
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;
}
}
Referencia de la API y los métodos
SendReputeClient requiere apiKey y baseUrl; el parámetro opcional timeoutMs tiene un valor predeterminado de 30000 (máximo 300000), maxRetries tiene un valor predeterminado de 2 (rango 0–10) y fetch acepta una implementación de servidor compatible. request(operationId, input, { signal }) devuelve la respuesta tipada de la operación; input contiene su cuerpo, campos de ruta y/o consulta. Una configuración inválida lanza TypeError; los fallos de la API utilizan SendReputeError con status, code, requestId y retryAfterMs. decodeExportBytes convierte una exportación ZIP a Uint8Array y rechaza entradas que no sean ZIP o tengan un base64 inválido. OperationInput, OperationResponse y los tipos de esquema generados se exportan para usuarios de TypeScript.
Alternativa: envolver un transporte de Nodemailer de bajo nivel
createSendReputeTransport(existingTransport, options) envuelve un objeto de transporte existente con métodos send, y opcionalmente close y verify; no es un transportador sendMail. Elija este o createSendReputePlugin, no ambos, para evitar un doble análisis. Ambos aceptan client y policy más model, sender string/resolver, signal y onDiagnostic opcionales. Los callbacks de diagnóstico no pueden cambiar la entrega. Los códigos de SendReputeNodemailerError distinguen entre policy/message no válidos, contenido no soportado, bloqueos por spam y bloqueos por API-failure. El paquete npm 0.1.1 publicado y la descarga 0.1.1 del sitio web combinan todas las alternativas text/plain y text/html en memoria mostradas en una única solicitud de clasificación acotada; en modo de bloqueo rechazan las alternativas mostradas no soportadas. Los mensajes Raw, streams, paths y URLs siguen sin estar soportados.
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);
},
});
}
Las 49 operaciones de la API del cliente
Despliegue una operación para ver su tipo de entrada exacto del SDK, tipo de retorno, alcance y estados HTTP documentados. El enlace al esquema abre sus parámetros completos, campos de respuesta y ejemplos en la referencia de la API del cliente. Estos wrappers utilizan el cliente configurado anteriormente; se requiere confirmación y nada se ejecuta automáticamente. Las operaciones de lectura no autorizan compras. Las mutaciones, los pagos, el cierre de acceso y la IA de pago requieren la acción deliberada correspondiente en la cuenta.
Cotizar un análisis de información agregada de la campaña
POST /v1/campaign-insights/quote
Alcance requerido: ai:generate
Entrada: { body: CustomerCampaignInsightsQuoteInput; }
Retornos: CustomerCampaignInsightsQuote
Estados HTTP documentados: 200, 400, 401, 403, 429, 503
Parámetros, esquemas y ejemplos 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.
Analizar métricas agregadas de entrega de campaña con IA
POST /v1/campaign-insights/analyze
Alcance requerido: ai:generate
Entrada: { body: CustomerCampaignInsightsAnalyzeInput; }
Retornos: CustomerCampaignInsightsAnalysis
Estados HTTP documentados: 200, 400, 401, 402, 403, 409, 413, 429, 502, 503
Parámetros, esquemas y ejemplos 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 });
}
Listar modelos de clasificación de la API del cliente
GET /v1/models
Alcance requerido: models:read
Entrada: Record<string, never>
Retornos: CustomerApiModelsResponse
Estados HTTP documentados: 200, 401, 403, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Obtener límites y uso de la API del cliente
GET /v1/usage
Alcance requerido: usage:read
Entrada: Record<string, never>
Retornos: CustomerApiUsageResponse
Estados HTTP documentados: 200, 401, 403, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Clasificar un correo electrónico del cliente
POST /v1/classify
Alcance requerido: classify
Entrada: { body: CustomerClassificationInput; }
Retornos: CustomerClassificationResponse
Estados HTTP documentados: 200, 400, 401, 402, 403, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Obtener la cuenta actual y el saldo
GET /v1/account
Alcance requerido: account:read
Entrada: Record<string, never>
Retornos: Account
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Obtener el enlace de referido y la actividad de recompensas de la cuenta actual
GET /v1/account/referrals
Alcance requerido: account:read
Entrada: { query?: { page?: number; pageSize?: number; }; }
Retornos: ReferralDashboard
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Listar el libro de créditos de la cuenta actual
GET /v1/account/ledger
Alcance requerido: billing:read
Entrada: { query?: { kind?: "usage" | "payments"; limit?: number; offset?: number; }; }
Retornos: Array<CreditLedgerEntry>
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Listar las facturas de Bitcoin de la cuenta actual
GET /v1/payments/invoices
Alcance requerido: billing:read
Entrada: { query?: { limit?: number; offset?: number; }; }
Retornos: Array<BitcoinInvoice>
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Crear una factura de depósito en Bitcoin denominada en USD
POST /v1/payments/invoices
Alcance requerido: billing:write
Entrada: { body: InvoiceInput; }
Retornos: BitcoinInvoice
Estados HTTP documentados: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Ocultar una factura de Bitcoin no pagada
DELETE /v1/payments/invoices/{invoiceId}
Alcance requerido: billing:write
Entrada: { path: { invoiceId: string; }; }
Retornos: undefined
Estados HTTP documentados: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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
Alcance requerido: billing:read
Entrada: Record<string, never>
Retornos: Array<PaymentMethod>
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Obtener la oferta de bonificación por depósito en Bitcoin activa actualmente
GET /v1/payments/deposit-offer
Alcance requerido: billing:read
Entrada: Record<string, never>
Retornos: DepositBonusOffer | null
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Actualizar las confirmaciones de las facturas de la cuenta actual
POST /v1/payments/refresh
Alcance requerido: billing:write
Entrada: Record<string, never>
Retornos: Array<BitcoinInvoice>
Estados HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Obtener los precios públicos actuales de análisis y edición
GET /v1/pricing
Alcance requerido: catalog:read
Entrada: Record<string, never>
Retornos: PricingSettings
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Obtener la cotización VIP pública actual y la comparación de precios
GET /v1/vip/plans
Alcance requerido: catalog:read
Entrada: Record<string, never>
Retornos: VipPlanQuote
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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
Alcance requerido: vip:read
Entrada: Record<string, never>
Retornos: VipState
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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
Alcance requerido: vip:purchase
Entrada: { body: CustomerVipPurchaseInput; }
Retornos: VipPurchaseResult
Estados HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Cotizar una edición y volver a verificar contra una clasificación guardada
POST /v1/rewrite/quote
Alcance requerido: rewrite
Entrada: { body: EditQuoteInput; }
Retornos: EditQuote
Estados HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Cotizar una edición y volver a verificar contra una clasificación guardada
POST /v1/classify/edit/quote
Alcance requerido: classify
Entrada: { body: EditQuoteInput; }
Retornos: EditQuote
Estados HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Clasificar un correo electrónico usando el nombre del remitente, el asunto y el cuerpo
POST /v1/classify/edit
Alcance requerido: classify
Entrada: { body: CustomerManualEditInput; }
Retornos: CustomerManualEditResult
Estados HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Solicitar una reescritura de términos marcados mediante IA con pago adicional y reclasificar el resultado
POST /v1/rewrite
Alcance requerido: rewrite
Entrada: { body: CustomerAiRewriteInput; }
Retornos: AiRewriteResult
Estados HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Parámetros, esquemas y ejemplos 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 });
}
Verificar un borrador final renderizado exacto contra un recibo de Rewrite All pagado de su propiedad sin un débito adicional
POST /v1/rewrite/finalize
Alcance requerido: rewrite
Entrada: { body: { requestId: string; sender: string; subject: string; body: string; }; }
Retornos: { requestId: string; input: RewrittenClassificationInput; classification: ClassificationResult; }
Estados HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Recuperar un recibo de reescritura de IA pagado y completado de su propiedad
GET /v1/rewrite/result/{requestId}
Alcance requerido: rewrite
Entrada: { path: { requestId: string; }; }
Retornos: AiRewriteResult
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Presupuestar el precio máximo autorizado de una reescritura de IA pagada por separado
POST /v1/rewrite/ai-quote
Alcance requerido: rewrite
Entrada: { body: AiRewriteQuoteInput; }
Retornos: AiRewriteQuote
Estados HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Generar un diseño de correo electrónico MJML estándar y editable con IA al precio de cuenta confirmado
POST /v1/email-builder/ai-template
Alcance requerido: ai:generate
Entrada: { body: CustomerAiEmailTemplateInput; }
Retornos: AiEmailTemplateResult
Estados HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Parámetros, esquemas y ejemplos 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 });
}
Generar un diseño de correo electrónico VIP nativo y editable con IA al precio de miembro confirmado
POST /v1/vip/email-template
Alcance requerido: ai:generate
Entrada: { body: CustomerVipEmailTemplateInput; }
Retornos: CustomerVipEmailTemplateResult
Estados HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 502, 503
Parámetros, esquemas y ejemplos 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 });
}
Abrir una sesión estándar del editor de diseño de correo electrónico de forma gratuita
POST /v1/email-builder/access
Alcance requerido: builder:write
Entrada: { body: CustomerEmailBuilderAccessInput; }
Retornos: EmailBuilderAccess
Estados HTTP documentados: 200, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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}
Alcance requerido: builder:read
Entrada: { query?: { designId?: string; }; path: { accessId: string; }; }
Retornos: EmailBuilderActiveAccess
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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}
Alcance requerido: builder:write
Entrada: { path: { accessId: string; }; }
Retornos: undefined
Estados HTTP documentados: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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
Alcance requerido: vip:builder
Entrada: { body: CustomerVipBuilderAccessInput; }
Retornos: VipBuilderAccess
Estados HTTP documentados: 201, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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}
Alcance requerido: builder:read
Entrada: { path: { accessId: string; }; }
Retornos: VipBuilderAccess
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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}
Alcance requerido: vip:builder
Entrada: { path: { accessId: string; }; }
Retornos: undefined
Estados HTTP documentados: 204, 400, 401, 402, 403, 404, 409, 413, 429, 503
Parámetros, esquemas y ejemplos 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}
Alcance requerido: authenticated original credential
Entrada: { path: { recoveryId: string; }; }
Retornos: { 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; }; }
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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
Alcance requerido: authenticated credential
Entrada: Record<string, never>
Retornos: { accountId: string; credentialId: string; }
Estados HTTP documentados: 200, 401, 403, 429, 503
Parámetros, esquemas y ejemplos 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
Alcance requerido: original ai:generate or vip:builder service scope
Entrada: { body: { action: "resolve"; reason: string; }; path: { recoveryId: string; }; }
Retornos: { 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; }; }
Estados HTTP documentados: 200, 400, 401, 403, 404, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Importar y compilar un diseño MJML estándar sin guardar ni enviar
POST /v1/email-builder/import
Alcance requerido: builder:write
Entrada: { body: CustomerStandardBuilderInput; }
Retornos: CustomerStandardBuilderImportResult
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Validar y compilar un diseño MJML estándar sin guardar ni enviar
POST /v1/email-builder/validate
Alcance requerido: builder:write
Entrada: { body: CustomerStandardBuilderInput; }
Retornos: CustomerStandardBuilderValidateResult
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Compilar un diseño MJML estándar a HTML sin guardar ni enviar
POST /v1/email-builder/compile
Alcance requerido: builder:write
Entrada: { body: CustomerStandardBuilderInput; }
Retornos: CustomerStandardBuilderCompileResult
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Exportar un diseño MJML estándar como HTML, MJML o ZIP sin enviar
POST /v1/email-builder/export
Alcance requerido: builder:write
Entrada: { body: CustomerStandardBuilderInput; }
Retornos: CustomerStandardBuilderExportResult
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Importar y compilar un diseño VIP nativo con membresía activa y acceso abierto en propiedad
POST /v1/vip/email-builder/import
Alcance requerido: vip:builder
Entrada: { body: CustomerNativeBuilderInput; }
Retornos: CustomerNativeBuilderImportResult
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Validar y compilar un diseño VIP nativo con membresía activa y acceso abierto en propiedad
POST /v1/vip/email-builder/validate
Alcance requerido: vip:builder
Entrada: { body: CustomerNativeBuilderInput; }
Retornos: CustomerNativeBuilderValidateResult
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Compilar un diseño VIP nativo a HTML con membresía activa y acceso abierto en propiedad
POST /v1/vip/email-builder/compile
Alcance requerido: vip:builder
Entrada: { body: CustomerNativeBuilderInput; }
Retornos: CustomerNativeBuilderCompileResult
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Exportar un diseño VIP nativo como HTML o un ZIP con tres variantes de HTML sin enviar
POST /v1/vip/email-builder/export
Alcance requerido: vip:builder
Entrada: { body: CustomerNativeBuilderInput; }
Retornos: CustomerNativeBuilderExportResult
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Iniciar una transferencia única de editor VIP nativo, ya sea estándar o con derechos
POST /v1/email-builder/hosted-handoffs
Alcance requerido: builder:write
Entrada: { body: CustomerHostedBuilderHandoffInput; }
Retornos: CustomerHostedBuilderHandoff
Estados HTTP documentados: 201, 400, 401, 403, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Listar plantillas del constructor VIP
GET /v1/vip/email-builder/templates
Alcance requerido: vip:read
Entrada: Record<string, never>
Retornos: CustomerVipTemplateCatalog
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Obtener plantilla de constructor VIP
GET /v1/vip/email-builder/templates/{templateId}
Alcance requerido: vip:read
Entrada: { path: { templateId: string; }; }
Retornos: CustomerVipTemplateDocument
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Listar plantillas de constructor estándar
GET /v1/email-builder/templates
Alcance requerido: catalog:read
Entrada: Record<string, never>
Retornos: CustomerStandardTemplateCatalog
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 });
}
Obtener plantilla de constructor estándar
GET /v1/email-builder/templates/{templateId}
Alcance requerido: catalog:read
Entrada: { path: { templateId: string; }; }
Retornos: CustomerStandardTemplateDetail
Estados HTTP documentados: 200, 400, 401, 403, 404, 413, 429, 503
Parámetros, esquemas y ejemplos 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 autoalojado
0.1.0
Requiere Node.js 20.19+ y una instalación de n8n auto-hospedada y parcheada que suministre n8n-workflow >=2.39.3 <3. No fuerce la instalación en un host antiguo incompatible. Instale el archivo tarball descargado en su directorio de nodos personalizados y reinicie n8n. Este nodo no publicado no está disponible a través de n8n Cloud o la instalación comunitaria de npm-name.
El consentimiento de pago está desactivado por defecto. Cada elemento con consentimiento realiza una solicitud de clasificación sin reintentos automáticos. Los resultados se agrupan bajo el espacio de nombres sendrepute. Utilice una puerta lógica IF en sendrepute.allowed antes del envío y verifique el estado de fallo por separado. Los modos consultivo y de bloqueo devuelven decisiones explícitas. El nodo en sí no envía correo.
Descargar tarball de n8n
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Ejecute en el host de n8n auto-hospedado, luego reinicie su servicio n8n utilizando su gestor de procesos normal. Confirme que SendRepute aparezca en el selector de nodos. Importe el archivo extraído package/examples/classify-email.workflow.json desde el editor de n8n. La instalación de nodos comunitarios por npm-name y n8n Cloud no son compatibles con este paquete no publicado.
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: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en 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. Configurar de forma segura
Cree una credencial de API de SendRepute con una clave de cliente con alcance classify en el almacenamiento de credenciales de n8n. Nunca la coloque en el JSON del flujo de trabajo ni en expresiones. El JSON a continuación muestra los parámetros del nodo, no un flujo de trabajo importable completo. Mapee el nombre de visualización del remitente, el asunto y el cuerpo; elija advisory/blocking, el umbral y la política de fallos open/closed. Revise los precios antes de cambiar paidConsent a true. Cada elemento con consentimiento realiza como máximo una solicitud.
{
"operation": "classify",
"paidConsent": false,
"sender": "={{ $json.sender }}",
"subject": "={{ $json.subject }}",
"body": "={{ $json.body }}",
"decisionMode": "blocking",
"threshold": 0.8,
"failurePolicy": "closed"
}
3. Usar deliberadamente
Coloque un nodo IF inmediatamente después de SendRepute y use esta condición booleana. Conecte solo la salida true a su nodo de correo electrónico existente; dirija false a revisión o detención. Inspeccione analysisStatus por separado incluso cuando allowed sea true. El flujo de trabajo incluido comienza con el consentimiento de pago desactivado y no contiene credenciales. SendRepute en sí mismo nunca envía correo.
{{ $json.sendrepute.allowed === true }}
Resultados, fallos y límites
Los resultados exitosos reemplazan el espacio de nombres sendrepute con analysisStatus, decision, allowed, recommendation, una puntuación validada y campos de facturación. Los fallos omiten las puntuaciones de spam y devuelven failureCategory/errorCode saneados. Los fallos cerrados bloquean; los fallos abiertos permiten pero marcan analysisStatus como fallido. Los éxitos de asesoría siempre permiten independientemente de recommendation. Con el consentimiento desactivado devuelve not_run. No existen reintentos, destinatarios, archivos adjuntos, reescrituras, selector de modelo o endpoints personalizados. La auditoría de dependencias del código fuente actualizado reportó cero hallazgos; este es un resultado puntual, no una certificación de seguridad. Mantenga el entorno de ejecución auto-hospedado parcheado y revise SECURITY.md antes de la instalación.
Integración con Laravel
0.1.0
Dirigido a PHP 8.2+ y Laravel 12–13. Instale el archivo ZIP utilizando un repositorio de artefactos local de Composer, o extráigalo y configure un repositorio de ruta de Composer como se describe en el archivo README incluido. No se declara ninguna publicación en Packagist.
El consentimiento de pago y el hook de correo están desactivados por defecto. Incluso cuando están habilitados, cada mensaje debe optar explícitamente por participar con X-SendRepute-Classify: yes. La cabecera se elimina antes de la entrega. Los modos de asesoramiento y bloqueo tienen políticas de fallo independientes; los restablecimientos de contraseña y el correo transaccional permanecen intactos a menos que se opte por participar deliberadamente.
Descargar ZIP de Laravel
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Ejecute dentro de su aplicación Laravel. Estos comandos extraen la descarga y registran un repositorio de ruta de Composer; esta no es una instalación de Packagist. El descubrimiento de paquetes registra el proveedor y vendor:publish crea config/sendrepute.php. Mantenga el directorio del paquete extraído disponible para Composer. Un repositorio de artefactos es otra opción documentada en el 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: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en 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. Configurar de forma segura
Almacene SENDREPUTE_API_KEY en los secretos del servidor. La URL base termina en /api; el cliente añade /v1/classify. Se requiere una coincidencia exacta de host de confianza y HTTPS verificado. Ambos interruptores mostrados permanecen desactivados hasta que revise los precios y los establezca explícitamente en true. En config/sendrepute.php elija mail.mode, mail.spam_probability_threshold y mail.failure_policy de forma independiente. El valor predeterminado es advisory con allow en caso de fallo.
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. Usar deliberadamente
Añada el encabezado de suscripción exacto solo a las clases Mailable seleccionadas deliberadamente, nunca a un callback de correo global. Se necesitan tanto los interruptores globales como el encabezado por mensaje para el hook automático. El encabezado se elimina antes de la entrega. Mantenga los restablecimientos de contraseña y las notificaciones críticas fuera del bloqueo automático a menos que se prueben explícitamente. La clasificación manual puede, en su lugar, resolver el contrato Classifier y otorgar el consentimiento por llamada, como se muestra.
// 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,
);
}
Referencia de la API y los métodos
Resuelva la interfaz Classifier desde el contenedor de Laravel. classify(string sender, string subject, string body, ?string model = null, bool paidAnalysisConsent = false) devuelve ClassificationResult. Sus campos públicos son requestId, model, label, spamProbability, confidence, replayed y chargedMillicents. SendReputeException proporciona la categoría saneada, el estado HTTP, el código de la API y el ID de la solicitud. El hook automático es AnalyzeOutgoingMessage en MessageSending y su diagnóstico seguro es ClassificationOutcome. Esta integración solo admite clasificación, no administración de cuentas, pagos, constructores o reescritura por IA.
Resultados, fallos y límites
ClassificationResult contiene el resultado validado y los datos de facturación. El hook MessageSending devuelve false para cancelar un mensaje bloqueado; la cancelación no es un error de SMTP ni un evento MessageSent. ClassificationOutcome informa solo la acción, la puntuación y los metadatos de fallo sanitizados, nunca el contenido del mensaje. La política de fallos cubre entradas/respuestas malformadas, autenticación, saldo, límites de tasa y problemas de transporte. No se añaden reintentos ni colas. Se requiere un remitente con nombre y un cuerpo text/plain o text/html en memoria.
Preflight de borradores de Mautic
0.1.0
Dirigido a instalaciones de Mautic 5.x de un solo nodo web con PHP 8.1+ y ext-curl. No se admiten Mautic 4, Mautic 6 ni clústeres de múltiples nodos. Extraiga SendReputeBundle en su directorio de complementos, recargue los complementos y limpie la caché siguiendo el archivo README incluido. Configure la credencial y confirme explícitamente el modo de bloqueo local-flock en el entorno del servidor.
Análisis de asesoramiento de pago de un borrador guardado, iniciado únicamente por el administrador. La opción global de participación, las comprobaciones de acceso a entidades, la validación CSRF y una confirmación de un solo uso protegen cada solicitud. No envía, sobrescribe ni bloquea correos electrónicos y no tiene una ejecución en el momento del envío. Las sustituciones de destinatarios permanecen sin expandir; guarde primero los cambios del editor.
Descargar ZIP de Mautic
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Ejecute desde su raíz de Mautic con el mismo usuario de PHP y entorno que la aplicación web, o extraiga el ZIP mediante su proceso de despliegue antes de recargar los complementos. Requiere Mautic 5.x, PHP 8.1+, ext-curl y un único nodo web Linux/POSIX. Mautic 4/6 y los clústeres de múltiples nodos no son compatibles; no se reclama certificación de instalación parche por parche en vivo.
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: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
git clone https://github.com/sendrepute/sendrepute-mautic.git
cd sendrepute-mautic
python3 package.py
2. Configurar de forma segura
Cree el directorio de registro persistente mostrado fuera de la raíz web, propiedad del usuario PHP con modo 0700. No utilice /tmp, contenedores efímeros, enlaces simbólicos o almacenamiento en red incierto. Almacene SENDREPUTE_API_KEY en el lado del servidor. Confirme local-flock solo cuando un nodo web proporcione bloqueo de procesos compartidos. El análisis de pago global permanece desactivado en 0; establézcalo en 1 solo después de revisar los precios y límites. Ningún campo del navegador debe proporcionar la credencial o el endpoint.
SENDREPUTE_MAUTIC_PAID_ANALYSIS_ENABLED=0
SENDREPUTE_MAUTIC_ATOMIC_LOCK_MODE=local-flock
SENDREPUTE_MAUTIC_LEDGER_DIR=/var/lib/mautic/sendrepute-ledger
3. Usar deliberadamente
Guarde primero los cambios del editor. Como administrador real de Mautic con acceso a ese correo electrónico, abra el borrador guardado y elija SendRepute preflight. Revise la confirmación y acepte explícitamente la operación de pago. La solicitud necesita validación CSRF y una intención de un solo uso de diez minutos vinculada al contenido guardado. El bloqueo persistente y un registro sin contenido evitan el gasto duplicado concurrente en el nodo único compatible.
Resultados, fallos y límites
Muestra la probabilidad validada, la etiqueta, la confianza y el importe facturado real o el recibo. Los fallos no muestran una decisión de spam y no se reintentan automáticamente. Solo se analizan el nombre del remitente, el asunto y el cuerpo guardados; las sustituciones de contactos permanecen sin expandir. El plugin no sobrescribe borradores, no envía correos, no bloquea campañas ni aplica políticas de tiempo de envío. Una revisión de borrador guardado no puede certificar el mensaje final renderizado por el destinatario.
Cliente de Python y backend de Django
0.1.0
Requiere Python 3.9+. Extraiga el ZIP de origen e instale su directorio con pip. El cliente de servidor genérico utiliza la biblioteca estándar; Django es una dependencia opcional para el backend de correo electrónico explícito. Este paquete no está publicado en PyPI.
El consentimiento de pago está desactivado por defecto. El wrapper de Django conserva los objetos originales de transporte y mensaje. Analiza una cadena delimitada que combina el cuerpo principal y las alternativas integradas text/plain y text/html, no los archivos adjuntos. El modo de bloqueo rechaza el contenido mostrado no compatible o de tamaño excesivo. Los fallos de autenticación bloquean por defecto incluso con una política de permiso; elija el comportamiento del correo crítico deliberadamente.
Descargar ZIP de origen de Python
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Utilice un entorno virtual. El cliente genérico solo usa la biblioteca estándar; el comando final añade la dependencia opcional de Django y es innecesario para el uso en Flask, FastAPI u otros servidores genéricos. El paquete se instala desde el directorio fuente descargado, no desde PyPI. Python 3.9+ es el mínimo para el paquete; elija versiones de Python/Django que sean compatibles entre sí.
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: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en 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. Configurar de forma segura
Inyecte SENDREPUTE_API_KEY mediante secretos del servidor. El cliente genérico usa por defecto el endpoint alojado canónico, HTTPS verificado, sin redirecciones ni reintentos. El consentimiento del cliente está desactivado por defecto; el ejemplo otorga consentimiento por llamada solo tras la comprobación confirmada. Las anulaciones de endpoint requieren una lista blanca de origen HTTPS explícita. El diccionario devuelto contiene el resultado validado y los datos de facturación, no una decisión de envío.
import os
from sendrepute import SendReputeClient, SendReputeError
client = SendReputeClient(api_key=os.environ["SENDREPUTE_API_KEY"])
def classify_after_consent(sender, subject, body, confirmed=False):
if confirmed is not True:
raise ValueError("Paid consent required")
try:
return client.classify(
sender=sender, subject=subject, body=body,
paid_analysis_consent=True,
)
except SendReputeError as error:
# Safe metadata only; do not log message content or response bodies.
print(error.code, error.status, error.request_id)
raise
Backend de correo electrónico de Django
Conserve su backend existente en SENDREPUTE_ORIGINAL_EMAIL_BACKEND y mantenga sus ajustes SMTP normales. El ejemplo mantiene el consentimiento de pago desactivado; establézcalo en True solo tras revisar los precios. El modo asesor permite análisis exitosos; el bloqueo compara con SENDREPUTE_SPAM_THRESHOLD. Elija la política de fallo independiente deliberadamente. Los errores de autenticación bloquean por defecto incluso bajo allow. El ejemplo sigue los valores por defecto del README y no es una recomendación para fallar en abierto para correo crítico.
# 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. Usar deliberadamente
Esta función envía solo cuando es llamada. Con el wrapper de Django configurado y el consentimiento de pago habilitado, el backend original recibe los objetos de mensaje originales sin cambios. El clasificador recibe una cadena delimitada que combina el cuerpo principal con las alternativas inline text/plain y text/html; los adjuntos y destinatarios no son entradas separadas. Renderice las plantillas antes de llamar. Use primero un backend de prueba local y luego su transporte real configurado deliberadamente.
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()
Referencia de la API y los métodos
El constructor público es SendReputeClient(api_key, endpoint, allowed_origins, timeout, paid_analysis_consent), con todos excepto api_key pasados por palabra clave. timeout debe ser mayor que cero y como máximo 30 segundos. classify requiere las palabras clave sender, subject y body; model y per-call paid_analysis_consent son opcionales. Sender tiene de 1 a 320 caracteres, subject de 1 a 998 y body de 1 a 524,288, con un límite de solicitud codificada independiente. El dict devuelto contiene requestId, model, result y billing; result incluye label, spamProbability, confidence, reasons y contentAudit opcional. billing contiene chargedMillicents y replayed. Los errores incluyen ConsentRequiredError, AuthenticationError, BalanceError, RateLimitError, TransportError e InvalidResponseError, todos bajo SendReputeError. Una configuración no válida puede generar ValueError. El backend de Django expone open(), close() y send_messages(email_messages), devolviendo el conteo de enviados del backend original; no añade métodos genéricos de API, constructor, reescritura o pago.
Resultados, fallos y límites
El bloqueo rechaza contenido mostrado no soportado o de tamaño excesivo en lugar de analizar solo un subconjunto más seguro. Los fallos de autenticación requieren una anulación explícita separada para permitirse. Otros errores siguen la política allow/block elegida; fail_silently controla si los fallos bloqueados se lanzan o se omiten. El wrapper no encola, no reintenta, no intercambia transportes, no inspecciona adjuntos ni renderiza plantillas. El cliente genérico lanza subclases saneadas de SendReputeError con code/status/request_id; no registre cuerpos de mensajes.
Cliente de clasificación de Go
0.1.0
Requiere Go 1.22+. El cliente que solo utiliza la biblioteca estándar admite la clasificación, no el transporte de correo electrónico. Elija el archivo ZIP de código fuente descargable con un reemplazo de módulo local, o la instalación del módulo público verificado que se muestra en la alternativa de código fuente.
Clasificación en el lado del servidor utilizando únicamente la biblioteca estándar, con consentimiento de pago explícito, solicitudes limitadas, HTTPS verificado, redirecciones rechazadas y sin reintentos. No envía correos electrónicos ni toma decisiones de envío/bloqueo. Su aplicación debe elegir deliberadamente los umbrales y el comportamiento ante fallos, especialmente para el correo transaccional crítico.
Descargar ZIP de origen de Go
Repositorio de código público
README completo y ejemplos
Notas de seguridad y limitaciones conocidas
1. Instalar
Extraiga el código fuente en el directorio de su aplicación Go existente y ejecute los comandos del módulo allí. El reemplazo local apunta al módulo descargado; mueva o ajuste esa ruta si la estructura de su proyecto difiere. Ejecute go mod init con su propio nombre de módulo primero solo cuando cree una aplicación nueva. Este cliente no requiere módulos de ejecución externos.
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: instalar desde el código fuente público
Utilice esta ruta de código fuente en lugar de las instrucciones de descarga del sitio web anteriores. El archivo README del repositorio explica los pasos restantes de activación y configuración; compilar solo un ZIP no instala un plugin. Para Python, el segundo comando añade soporte opcional para Django. Mantenga las credenciales en secretos del servidor y revise las notas de seguridad antes de habilitar funciones de pago. Solo Node está en npm; un repositorio público de GitHub no implica la publicación en WordPress.org, n8n Cloud, Packagist o PyPI.
go get github.com/sendrepute/sendrepute-go@bfd656f829618348232da506225a5d92587d48e2
2. Configurar de forma segura
Inyecte SENDREPUTE_API_KEY desde los secretos del servidor. La función mostrada no realiza ningún trabajo hasta que se llama con confirmed=true; esa llamada puede incurrir en una clasificación de pago. Establece un contexto de diez segundos y usa el endpoint HTTPS canónico. El consentimiento del cliente está desactivado por defecto; el argumento final true otorga consentimiento para esta solicitud específica. Una anulación de endpoint requiere una entrada AllowedOrigins explícita; se rechazan las redirecciones.
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. Usar deliberadamente
Llame a Analyze desde su aplicación autenticada solo después de revisar los precios y el consentimiento explícito. El umbral de 0.90 y el error de revisión son políticas de aplicación de ejemplo, no valores predeterminados del SDK. Decida si los errores significan posponer, permitir o fallar cerrado antes de conectar cualquier código de envío. El cliente devuelve un resultado tipado con Result.SpamProbability y campos de facturación; nunca envía correos ni toma decisiones de entrega por sí mismo.
Referencia de la API y los métodos
NewClient(Config) devuelve (*Client, error). Config acepta APIKey, Endpoint, AllowedOrigins, Timeout y PaidAnalysisConsent. Classify(ctx, ClassificationInput, consent) devuelve (*ClassificationResponse, error). Los campos de Input son Sender, Subject, Body y Model opcional. Sender es de 1 a 320 runas, subject de 1 a 998 runas y body como máximo 524,288 bytes UTF-8. La respuesta tipada contiene RequestID, Model, Result y Billing; Billing expone ChargedMillicents y Replayed. Result incluye Label, SpamProbability, Confidence, Reasons, FlaggedTerms y ContentAudit opcional. Use errors.As para inspeccionar *Error de forma segura; los fallos de configuración y de la API siguen siendo errores, no puntuaciones de spam. No existen métodos de cuenta, pago, constructor o reescritura.
Resultados, fallos y límites
Una invocación realiza como máximo un intento HTTP de pago sin reintentos. Los errores exponen una categoría segura, código/request ID y estado restringidos, nunca credenciales, cuerpos o detalles de red. La duración del contexto y los tamaños de solicitud y respuesta están delimitados; las respuestas malformadas se rechazan en lugar de convertirse en puntuaciones. El cliente no tiene capacidades de parseo MIME, renderizado, destinatarios, adjuntos, cola, constructor, reescritura o SMTP. Elija el modelo explícitamente solo si es necesario; de lo contrario, se aplica el predeterminado de la cuenta.
listmonk HTTP Messenger
0.1.0
Un paquete de código local no publicado para Node.js 20+ orientado a la interfaz Custom HTTP Messenger de listmonk 6.2.0. Este servicio externo asume la entrega SMTP posterior tras la clasificación; no es un complemento en proceso ni un proxy de pre-verificación SMTP. La verificación es aislada y fuera de línea, no es una instalación de listmonk desplegada ni una prueba real de proveedor SMTP.
Ambos interruptores de pago están desactivados por defecto. El mensajero acepta un cuerpo completamente renderizado, rechaza archivos adjuntos, verifica precios actualizados y requiere el resultado estricto de Inbox: etiqueta inbox, probabilidad de spam de 0.12 como máximo y cero términos marcados. Luego construye y envía ese mismo cuerpo inspeccionado a través de su conexión SMTP configurada. Los recibos duraderos evitan repeticiones automáticas tras resultados bloqueados, fallidos, en progreso o inciertos.
Descargar el ZIP de fuentes no publicadas de listmonk
1. Instalar
Extraiga el ZIP del código fuente del sitio web no publicado en el host de mensajería dedicado. Revise README.md y SECURITY.md, copie el entorno de ejemplo y realice una comprobación sintáctica del punto de entrada del servidor antes de la configuración. El artefacto descargable en la lista permitida excluye intencionalmente la suite de pruebas del repositorio. No hay paquetes de tiempo de ejecución de terceros. Esta no es una instalación de listmonk en el marketplace ni en proceso.
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. Configurar de forma segura
Use una cuenta dedicada sin privilegios y un directorio de estado local duradero con modo 0700. Mantenga los tres interruptores de seguridad mostrados en falso hasta que el precio y la limitación de precio no atómico sean aceptados. Almacene las credenciales de SendRepute, Basic Auth del messenger y SMTP downstream solo en secretos del servidor. Termine HTTPS en un proxy inverso de confianza.
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. Usar deliberadamente
Exponga únicamente POST /v1/listmonk tras HTTPS y una autenticación básica dedicada. En listmonk Settings > Messengers, añada su URL como un Custom HTTP Messenger, elija cero reintentos y selecciónelo solo para campañas que deban ser inspeccionadas y entregadas. No seleccione también el SMTP de listmonk: este servicio realiza el envío SMTP posterior por sí mismo.
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.
Resultados, fallos y límites
Un duplicado entregado devuelve éxito sin otra clasificación ni envío. Cada recibo bloqueado, fallido, inspeccionando, enviando o incierto rechaza otro envío. Después de un resultado SMTP incierto, concilie los registros del proveedor y el contexto de listmonk manualmente; nunca elimine un recibo simplemente para forzar un reintento. La comprobación de precios actual es reciente pero no atómica porque la clasificación no acepta ningún campo expectedPriceMillicents.
Adaptador para Mailcoach Self-Hosted
0.1.0
Un paquete de Composer local no publicado orientado a Mailcoach Self-Hosted v10 en Laravel 12. El núcleo licenciado spatie/laravel-mailcoach v10 no está disponible en este espacio de trabajo, por lo que este paquete no garantiza una prueba completa de Mailcoach v10 instalado. Las pruebas reales de Laravel 12 Mailer cubren el evento cancelable MessageSending documentado; el titular de la licencia debe verificar cada ruta de envío exacta de Mailcoach antes de pasar a producción.
Los interruptores de enabled, paid-consent y el reconocimiento de current-pricing están desactivados por defecto. Una vez activado, el hook se aplica a cada mensaje a través de ese mailer de Laravel, no solo a las rutas con nombre de Mailcoach. Analiza las alternativas de Symfony Email ya renderizadas y puede cancelar el transporte. El valor predeterminado es fail-closed; permitir fallos de análisis es una política deliberada independiente.
Descargar el ZIP de código fuente experimental de Mailcoach
1. Instalar
Coloque el archivo ZIP no publicado descargado en un directorio privado de artefactos de Composer accesible para la aplicación con licencia de Mailcoach. Registre ese repositorio de artefactos local, requiera la línea 0.1, consigne el archivo de bloqueo de consumo y, opcionalmente, publique la configuración. Esta no es una instalación de Packagist. Un titular de licencia debe realizar la verificación contra la versión exacta de Mailcoach Self-Hosted v10.
mkdir -p packages
curl -fL https://www.sendrepute.com/downloads/sendrepute-mailcoach.zip -o packages/sendrepute-mailcoach.zip
composer config repositories.sendrepute artifact packages
composer require sendrepute/mailcoach:^0.1
php artisan vendor:publish --tag=sendrepute-mailcoach-config
2. Configurar de forma segura
Mantenga los tres interruptores en falso inicialmente. Guarde la clave API en los secretos del servidor y configure un límite de gasto en la cuenta. La operación classify actual no tiene un resguardo atómico de expectedPriceMillicents, por lo que el tercer interruptor acepta explícitamente el precio actual de la API en lugar de prometer una cotización fija. Configure el umbral y la política de fallos de permitir/bloquear de forma independiente.
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. Usar deliberadamente
El descubrimiento del paquete registra un listener de Laravel MessageSending. No hay una llamada por campaña en el código de la aplicación: cuando se habilita deliberadamente en una instalación dedicada de Mailcoach, inspecciona cada Symfony Email enviado a través de ese mailer de Laravel inmediatamente antes del transporte. En una aplicación de Laravel mixta, el correo de la aplicación host también está cubierto.
Resultados, fallos y límites
El adaptador envía el nombre de visualización del remitente, el asunto y cada alternativa text/plain o text/html en memoria que no esté vacía, excluyendo destinatarios, direcciones, archivos adjuntos, datos del sobre y raw MIME. El contenido faltante o no compatible, las respuestas malformadas y los fallos de la API bloquean de forma predeterminada. Las pruebas del núcleo offline ejercitan la cancelación real de Laravel Mailer, pero las rutas de campaña, automatización, transaccionales y mensajes de prueba de Mailcoach con licencia siguen sin estar verificadas.
Flujo de envío controlado de Brevo
0.1.0
Un paquete fuente local de Node.js 20+ no publicado que implementa una API de envío explícita del lado del servidor en torno a la operación transaccional POST /v3/smtp/email de Brevo. No intercepta los envíos del panel de Brevo, campañas, automatizaciones, SMTP relay o llamadas a través de otros SDKs. Las pruebas son controladas y offline; no certifican una cuenta de Brevo activa.
El paid_consent está desactivado por defecto. Solo se aceptan mensajes de texto y HTML fijos en línea; las plantillas remotas, parámetros, envíos programados, versiones de mensajes y contenido respaldado por URL son rechazados. El snapshot exacto e inmutable inspeccionado se envía a Brevo. Un registro duradero de sendKey bloquea reintentos duplicados y ambiguos, y los resultados inciertos del proveedor requieren reconciliación por parte del operador.
Descargar ZIP fuente de Brevo no publicado
1. Instalar
Extraiga el ZIP del código fuente no publicado en una aplicación de servidor, revise su README y notas de seguridad, y realice una comprobación sintáctica de src/index.mjs. El artefacto descargable en la lista permitida excluye intencionalmente la suite de pruebas del repositorio. Importe SendReputeBrevo desde src/index.mjs; esta no es una instalación de npm ni del marketplace de Brevo. Se requiere Node.js 20+ y no hay dependencias de tiempo de ejecución.
curl -fLO https://www.sendrepute.com/downloads/sendrepute-brevo.zip
unzip sendrepute-brevo.zip
cd sendrepute-brevo
node --check src/index.mjs
2. Configurar de forma segura
Mantenga paidConsent en false hasta que se acepten los precios actuales y la limitación de precio no atómico. Mantenga ambas claves API en secretos del servidor y utilice un directorio de libro mayor persistente privado en almacenamiento duradero de un solo host. expectedPriceMillicents debe ser igual al máximo recién obtenido, pero el débito de classify aún no puede imponer ese valor de forma atómica.
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. Usar deliberadamente
Llame a send solo desde la ruta controlada del servidor que deba clasificar y entregar. Reutilice una sendKey estable para cada intento del mismo correo electrónico previsto. Proporcione contenido en línea fijo; no proporcione IDs de plantilla de Brevo, parámetros mutables, programación o versiones de mensaje. Los envíos realizados en otros lugares omiten este envoltorio por completo.
await integration.send({
sendKey: durableBusinessEventId,
message: {
sender: { name: "Example Shop", email: "orders@example.com" },
to: [{ email: recipient }],
subject,
textContent,
htmlContent,
},
});
Resultados, fallos y límites
Un resultado de Inbox dentro del umbral permite una solicitud de la API transaccional de Brevo para el mismo snapshot inmutable. El registro cambia a delivery-unknown antes del envío del proveedor. Los tiempos de espera, desconexiones, éxitos malformados, caídas y rechazos del proveedor nunca se reintentan automáticamente; concílielos con los registros de Brevo antes de cualquier decisión manual.
Flujo de envío controlado de BigMailer
0.1.0
Un envoltorio local no publicado de Node.js 24+ para llamadas explícitas a la API transaccional de BigMailer. No se instala en BigMailer ni intercepta los envíos del panel de control ni de APIs no relacionadas. Debido a que BigMailer es propietario del contenido de la campaña editable remotamente, el envoltorio no puede probar que la campaña se mantuvo igual al snapshot de renderizado proporcionado por el invocador entre la revisión y la entrega.
Los interruptores ENABLED, PAID_CONSENT y el reconocimiento de la limitación de plantillas remotas están desactivados por defecto. El invocador debe suministrar y generar el hash de un snapshot de renderizado completo, congelar operacionalmente la campaña remota coincidente y proporcionar una deliveryKey duradera. El precio se vuelve a verificar antes de la clasificación, pero la API de clasificación actual no tiene un campo atómico expected-price. Los estados de entrega duplicados, bloqueados, rechazados y ambiguos nunca se vuelven a enviar automáticamente.
Descargar el ZIP experimental del código fuente de BigMailer
1. Instalar
Extraiga este archivo ZIP de código no publicado en la aplicación de servidor controlada Node.js 24+ y revise README.md y SECURITY.md. Importe el envoltorio y el almacén de entrega de archivos directamente desde src. Esta no es una instalación de npm o del marketplace de BigMailer y no tiene dependencias de ejecución de terceros.
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. Configurar de forma segura
Mantenga enabled, paidConsent y remoteTemplateSnapshotLimitationAcknowledged en false hasta su revisión. Almacene las claves API, los UUID de marca y campaña únicamente en el lado del servidor. Ubique FileDeliveryStore en un almacenamiento privado duradero. Copie los precios recién revisados en expectedPricing, entendiendo que la API de clasificación actual no puede bloquearlos de forma atómica.
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. Usar deliberadamente
Para cada envío controlado por API, proporcione una deliveryKey estable, todas las alternativas text/plain y text/html mostradas, el render snapshot exacto y el snapshotDigest(snapshot). Reconozca la limitación de plantilla remota solo cuando un control operativo congele la revisión de la campaña de BigMailer que coincida con ese snapshot. El tablero y los envíos de API no relacionados omiten este envoltorio.
await integration.send({
deliveryKey: durableBusinessEventId,
snapshot,
snapshotSha256: snapshotDigest(snapshot),
email: recipient,
variables,
});
Resultados, fallos y límites
El almacén de archivos reserva la clave de entrega antes de la clasificación. Los resultados de envío duplicados, en conflicto, bloqueados, rechazados y ambiguos no pueden volver a enviarse automáticamente. El endpoint de envío de BigMailer acepta datos de combinación en lugar del cuerpo inspeccionado, por lo que una clasificación exitosa no es prueba de que el contenido mutable de la campaña remota todavía coincida; use otro proveedor cuando se requiera un acoplamiento exacto.
Privacidad y operaciones de pago
El análisis envía el nombre visible del remitente, el asunto y el cuerpo del mensaje a SendRepute. Los destinatarios y los adjuntos no se transmiten por separado, pero se transmite el contenido incluido en el cuerpo. Mantenga las credenciales en secreto y desactive el registro de solicitudes/cuerpo. Sin garantía de entrega o de llegada a la bandeja de entrada.
La clasificación es de pago. Lea los precios actuales y los límites de gasto de su cuenta antes de otorgar el consentimiento. Una solicitud idéntica de cuenta/contenido/modelo puede repetir un recibo en un plazo de 24 horas; el contenido o modelo modificado puede incurrir en un nuevo cargo. No asuma que un reintento es gratuito. La reescritura por IA requiere una cotización de cargo máximo para el recibo principal, el modo y los términos seleccionados antes del envío de pago; consulte un recibo en curso y recupere los resultados completados con el ID de la solicitud original en lugar de iniciar otra solicitud. Reescribir Todo puede verificar un borrador final renderizado exacto sin otro débito. La generación de plantillas por IA y el acceso VIP nativo se cobran por separado; el procesamiento estándar del constructor es gratuito. Ningún resultado de análisis, reescritura o del constructor garantiza la entrega, la ubicación en la bandeja de entrada o el cumplimiento normativo.
La validación fuera de línea no es una certificación de cada versión de framework, plugin o transporte. Lea las instrucciones de instalación y seguridad incluidas, mantenga desactivado el análisis de pago hasta que se configure deliberadamente y pruebe su política de fallos elegida antes de habilitarla para correo crítico.
Revisar precios
Referencia de la API para clientes
Pedir soporte de integración