Corsivo Mail
Email infrastructure for WordPress: multiple SMTP accounts, a durable delivery queue, Gutenberg templates, automations and an optional IMAP inbox.
Install
This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.
Install straight from GitHub with WP-CLI:
wp plugin install https://github.com/corsivo-suite/mail/archive/refs/heads/master.zipLa pagina amministrativa usa tre aree del workspace Corsivo: Operatività (Coda, Log invii, Invia test, Stato), Configurazione (Invio, Coda e conservazione, Account SMTP, Gruppi destinatari, Moduli, Esporta / Importa) e Aspetto (Stile, Modelli, Footer). Le sezioni di Invio e Coda condividono il form originale: il cambio di pannello conserva i campi e i valori, mentre la validazione apre il pannello che contiene il primo errore. L'avviso del browser protegge le modifiche non salvate. URL, azioni POST e accesso agli editor nativi restano invariati; la Posta in arrivo usa il contenitore ampio senza una seconda sidebar.
assets/admin-workspace.css è una copia locale del foundation admin-workspace/style.css di wp-admin-ui; adattamenti e navigazione sono in admin-workspace-layout.css e admin-workspace.js. Non esistono dipendenze runtime da altri plugin. La shell PHP riusa i bundle React esistenti senza ricompilazione. Verifica DOM: node tests/workspace-navigation.cjs <percorso-al-modulo-jsdom>.
Infrastruttura email della suite Corsivo: coda di invio durevole, account SMTP multipli con credenziali cifrate, template Gutenberg, log operativo e trasporto condiviso per gli altri plugin della famiglia.
Scopo
WordPress spedisce email in modo sincrono, senza retry, senza storia e senza garanzie: se il trasporto fallisce durante una richiesta, il messaggio è perso. Corsivo Mail esiste per dare alla suite un unico punto di uscita affidabile: gli invii espliciti della suite e le chiamate wp_mail che soddisfano la policy di accodamento passano da una coda durevole con lease e retry, vengono inviate da un worker fuori dalla richiesta HTTP e lasciano una traccia consultabile. Allegati, embed, coda disattivata e bypass runtime restano sincroni. I plugin della suite (Bookings, Members, Newsletter) non parlano con SMTP: accodano qui e osservano l'esito.
Il plugin copre volutamente uno scope ampio: trasporto e coda, template email editabili a blocchi, automazioni, un modulo IMAP opzionale per leggere le caselle e un modulo newsletter interno per gli utenti registrati. I confini con Corsivo Newsletter sono descritti più sotto.
Come funziona
Moduli
includes/settings/— account SMTP/IMAP, opzioni, cifratura (crypto.php), import/export, pagina adminincludes/smtp/— configurazione PHPMailer per-accountincludes/queue/— schema e verifica dello storage, coda, worker, endpoint cron, journalincludes/storage/— schema del logincludes/template/— CPT dei template, compilazione Gutenberg email-safe, merge tag, hook suwp_mailincludes/automation/— CPT automazioni, audience, invii manuali/bulk/programmati, eventi, email coreincludes/newsletter/— modulo consensi interno: preferenza utente, unsubscribe, gruppi, bloccoincludes/imap/— client TLS, sync, inbox e webmail adminincludes/integrations/— Corsivo Theme, Layouts, WPML, WooCommerceincludes/api.php,includes/functions.php— API pubbliche per gli altri plugin
Entità dati
Tre tabelle InnoDB, tutte nel namespace {prefix}corsivo_mail_:
corsivo_mail_queue— la coda. Colonne chiave:status(ciclo di vitapending,sending,transmitting,sent,failed,cancelled,delivery_unknown),locked_at/lock_token(lease),attempts/max_attempts,scheduled_at,idempotency_key(UNIQUE, hashata) conidempotency_fingerprint,source_type/source_id,source_guard_required,retain_until,message_type(transactional/marketing), payload leggibili (bodycome testo;headers,attachments,embedscome JSON),transport_started_at,error_code.corsivo_mail_log— journal append-only:event,queue_id,attempt, sorgente,account_id,actor_user_id,recipientpiùrecipient_hash,subject,status, errore redatto,metadatafiltrata su chiavi ammesse.corsivo_mail_messages— indice dei metadati IMAP (mittente, oggetto, data, uid, seen); i corpi non vengono persistiti. Installata solo con il modulo IMAP attivo.
Account SMTP/IMAP in un'option dedicata con password cifrate; impostazioni in corsivo_mail_settings.
Ciclo di vita di un invio
- Accodamento.
wp_mailviene intercettato supre_wp_mail: se la coda è attiva il messaggio diventa una rigapendingcon payload plain leggibili e la chiamata ritornatrue; short-circuit già impostati da altri plugin vengono rispettati. Messaggi con allegati o embed passano sincroni. Il filtrowp_mailapplica il wrapping nel layout HTML (disattivabile). I plugin della suite accodano invece via API con chiave idempotente. - Claim. Il worker (cron ogni minuto) reclama le righe scadenzate con un singolo
UPDATEatomico:pendingdiventasending,lock_tokenUUID,attemptsincrementato. Nessun'altra istanza può prendere la stessa riga. - Guardie. Prima del trasporto: fence della sorgente (
corsivo_mail_queue_source_guard_{source_type}deve autorizzare le righe con guard obbligatoria), consenso marketing rivalutato al momento dell'invio permessage_type = marketing(un solo destinatario, altrimenti soppressione). - Trasporto. La riga passa a
transmitting(transport_started_atvalorizzato, fence sucancel_requested), poiwp_mailparte con l'account SMTP della riga via PHPMailer. - Esito. Solo un esito confermato dal trasporto chiude la riga come
sent(payload azzerati). Un fallimento segnalato viene ritentato con backoff esponenziale e jitter fino amax_attempts, poifailed. Un esito non verificabile dopo l'avvio del trasporto — eccezione, worker morto a metà — termina comedelivery_unknown: mai retry cieco di un invio che potrebbe essere partito.sentsignifica "il trasporto ha accettato", non "la casella ha consegnato". - Terminale. Ogni chiusura (
sent,failed,cancelled,delivery_unknown) emettecorsivo_mail_queue_terminalcon l'identità della sorgente, così Bookings e Members riconciliano il proprio stato.
Il recupero delle righe stantie gira a ogni ciclo: sending scadute tornano pending (o failed con worker_died a tentativi esauriti), transmitting scadute diventano delivery_unknown, le richieste di cancellazione della sorgente vengono onorate.
Storage e installazione
Lo schema è verificato fisicamente: engine InnoDB, colonne, indici e inventario del namespace devono corrispondere esattamente al codice corrente. L'installazione è fresh-only a due fasi (intent, creazione verificata, marker plain finale) sotto lock di database e accetta soltanto il formato corrente. Uno schema completo e fisicamente esatto viene riattestato anche se già popolato; uno schema incoerente o dati inattesi bloccano il runtime fail-closed con errore persistito e notice admin, senza toccare i dati esistenti.
La coda ha anche verifiche di integrità di dominio: payload attivi leggibili e strutturalmente validi, ciclo di vita coerente, policy delle sorgenti garantite rispettata.
Cron
corsivo_mail_process_queue— ogni minuto: automazioni programmate (priorità 5) e poi la coda.corsivo_mail_cleanup_queue— giornaliero: retention di coda e log; le sorgenti possono alzare la propria viacorsivo_mail_queue_source_retention_days,retain_untilè sempre rispettato.- Endpoint esterno
/?corsivo_mail_cron={chiave}(o headerX-Corsivo-Mail-Key, oAuthorization: Bearer): esegue schedule e coda, risponde 503 a storage non disponibile. Chiave rigenerabile dalle impostazioni.
Punti rilevanti
- Coda durevole con lease. Claim atomico, lock token per ogni transizione, requeue delle righe abbandonate, backoff esponenziale con jitter. Nessuna email viene processata da due worker contemporaneamente, nessuna resta bloccata per sempre.
- Idempotenza. La chiave idempotente (hashata, UNIQUE) è accompagnata da una fingerprint canonica del payload: il replay della stessa richiesta restituisce la riga esistente, una chiave riusata con payload diverso è un errore esplicito. Il vincolo è del database, non del codice chiamante.
- Stati onesti.
delivery_unknownesiste perché "non so se è partita" è diverso sia dasentsia dafailed: dopo l'avvio del trasporto un esito non confermato non viene mai ritentato alla cieca né spacciato per consegnato. - Cifratura con chiave propria. AES-256-GCM in envelope
cmenc:v3(versione, algoritmo,key_id, nonce, tag, ciphertext). La master key è letta daCORSIVO_MAIL_ENCRYPTION_KEYoppure generata una sola volta e persistita incorsivo_mail_encryption_master_key(non autoload,INSERT IGNOREper essere atomica tra worker concorrenti); da lìhash_hkdfderiva la chiave di payload. Non dipende dai salt WordPress: ruotarli non rende illeggibile nulla. L'AAD lega plugin, blog, versione,key_ide tipo di credenziale, quindi una password SMTP non può essere spostata nel campo IMAP. Cifra esclusivamente le credenziali SMTP/IMAP; i payload della coda restano testo e JSON leggibili. I payload vengono azzerati alla chiusura della riga (sent,cancelled,delivery_unknown); restano leggibili sulle righefailedper permettere il retry manuale, fino alla retention. - Log senza segreti. Il log conserva destinatario e oggetto ma mai body, header, allegati o credenziali; gli errori sono redatti (password/token e query string rimossi dalle URL). Accanto al destinatario c'è
recipient_hash, SHA-256 stabile dell'indirizzo normalizzato: non dipende da HMAC o salt WordPress e serve per correlare le righe e per gli strumenti privacy di WordPress (exporter ed eraser coprono log e coda). - Fail-closed. Senza storage verificabile il runtime non si carica: quando Corsivo Mail governa il trasporto, gli invii vengono bloccati invece di uscire non tracciati; worker ed endpoint cron rispondono unavailable. Il kill switch
disable_sendingsopprime ogni invio con traccia a log. - Sorgenti garantite. Le email di Bookings e Members (
corsivo-bookings-payment-request,corsivo-bookings-stay-reminder,corsivo-members-expiry,corsivo-members-renewal) esigono guard attiva eretain_untildi almeno 8 giorni; l'accodamento senza policy corretta viene rifiutato. Le sorgenti dispongono di fence durevole (cancel_requested) e cancellazione verificata. - Confini con Corsivo Newsletter. Sovrapposizione dichiarata: Mail include un modulo newsletter interno (consenso in user_meta per utenti registrati, blocco iscrizione, unsubscribe HMAC con one-click) che copre solo il caso "utenti del sito". Corsivo Newsletter possiede l'audience esterna con double opt-in, i provider e le campagne. Quando Newsletter è attivo il modulo interno parte disabilitato per mantenere una sola fonte di verità e il consenso marketing viene delegato allo stato
confirmeddell'iscritto esterno, riverificato dal worker prima di ogni trasporto. - IMAP difensivo. TLS con verifica del peer, limite sulla dimensione delle risposte, HTML remoto sanitizzato e servito con CSP sandbox in documenti isolati. La webmail è solo per amministratori.
- Superficie amministrativa chiusa. CPT di template e automazioni con capability
manage_options, route REST amministrative autenticate.
Integrazioni con la suite
API per le sorgenti (Bookings, Members, chiunque registri email):
corsivo_mail_enqueue_registered($provider_id, $to, $context, $idempotency_key, $source);
corsivo_mail_fence_queued($queue_id, $source_type, $source_id);
corsivo_mail_cancel_queued($queue_id, $source_type, $source_id, $error_code);
corsivo_mail_queue_status($queue_id, $source_type, $source_id);
corsivo_mail_deliver($core_email_id, $to, $context, $headers);
corsivo_mail_core_email_status($core_email_id);
corsivo_mail_send($post_id, $to, $context);
- Bookings / Members → coda. Accodano email registrate con idempotenza e policy di retention; l'action
corsivo_mail_queue_terminalnotifica l'esito, il filtrocorsivo_mail_queue_source_guard_{source_type}è il veto della sorgente al momento dell'invio. - Email core registrabili. Il filtro
corsivo_mail_core_emailsregistra email con template a blocchi editabile: il core WordPress (reset password, nuovo utente) è già coperto; Corsivo Newsletter vi registracorsivo_newsletter_confirme la consegna concorsivo_mail_deliver. - Newsletter → audience. Corsivo Newsletter pubblica gli iscritti confermati come audience delle automazioni via
corsivo_mail_audiences,corsivo_mail_resolve_recipients,corsivo_mail_recipient_count, con merge tagunsubscribe_url. - Estensione. Eventi (
corsivo_mail_events), merge tag (corsivo_mail_merge_tags;{{meta:chiave}}solo per chiavi ammesse viacorsivo_mail_user_meta_keys), rendering (corsivo_mail_base_styles,corsivo_mail_color_palette,corsivo_mail_font_sizes,corsivo_mail_spacing_scale,corsivo_mail_document_head,corsivo_mail_starter_templates), trasporto (corsivo_mail_smtp_presets,corsivo_mail_smtp_timeout,corsivo_mail_imap_max_response_bytes,corsivo_mail_editor_recipient_limit). - Integrazioni opzionali. WooCommerce (le email native restano a WooCommerce: né wrapping né coda), WPML (risoluzione di automazioni e layout nella lingua del destinatario), Corsivo Theme (palette e font ereditati quando abilitato e rilevato), Corsivo Layouts (starter template via filtro).
Test
Con WordPress caricato (WP-CLI):
wp eval-file wp-content/plugins/corsivo-mail/tests/database-integrity.php
wp eval-file wp-content/plugins/corsivo-mail/tests/queue-storage.php
wp eval-file wp-content/plugins/corsivo-mail/tests/security-queue.php
wp eval-file wp-content/plugins/corsivo-mail/tests/transport-contract.php
wp eval-file wp-content/plugins/corsivo-mail/tests/footer-layout.php
wp eval-file wp-content/plugins/corsivo-mail/tests/queue-lifecycle-integrity.php
database-integrity— engine InnoDB e colonne reali delle tre tabelle.queue-storage— macchina a stati dello storage: installazione, recovery, condizioni di blocco.security-queue— autorizzazioni REST e CPT, payload coda plain, roundtrip e tamper delle credenziali cifrate, sanitizzazione HTML IMAP, soppressione marketing multi-destinatario e consenso esterno.
Esistono anche admin-render.php (rendering di tutti i tab admin) e transfer-roundtrip.php (import/export), sempre via wp eval-file.
Eseguire le suite database su un'installazione di test isolata: creano fixture, alterano temporaneamente opzioni e schemi e verificano anche la pulizia della coda. queue-lifecycle-integrity verifica completamenti tardivi, fence pendenti e retention minima delle sorgenti protette.
Standalone, senza WordPress:
php wp-content/plugins/corsivo-mail/tests/crypto-early-boot.php
php wp-content/plugins/corsivo-mail/tests/storage-plain-early-boot.php
php wp-content/plugins/corsivo-mail/tests/schema-current-static.php
php wp-content/plugins/corsivo-mail/tests/admin-navigation.php
php wp-content/plugins/corsivo-mail/tests/storage-defaults.php
php wp-content/plugins/corsivo-mail/tests/queue-input-contract.php
php wp-content/plugins/corsivo-mail/tests/smtp-account-isolation.php
php wp-content/plugins/corsivo-mail/tests/marketing-recipient-contract.php
php wp-content/plugins/corsivo-mail/tests/imap-protocol.php
php wp-content/plugins/corsivo-mail/tests/template-content-contract.php
I primi due dimostrano che cifratura delle credenziali e verifica dello stato storage funzionano early-boot (fail-closed quando non c'è né costante né database, nessun caricamento di pluggable.php); schema-current-static.php impedisce la reintroduzione di installer lazy, del versioning di schema e di qualunque ritorno dei salt WordPress dentro crypto.php; admin-navigation.php verifica il gate developer della sola voce Impostazioni e la landing operativa su Email.
Le altre regressioni coprono i default MySQL/MariaDB, il roundtrip dei payload wp_mail, l'isolamento degli account SMTP, il consenso marketing senza copie, i protocolli IMAP/MIME e il rendering di oggetti e liste. Usano fixture locali senza connessioni a server di posta.
Configurazione
- Navigazione amministrativa. Il menu principale
Email(posizione 31) apreMessaggi, per gli invii manuali e automatici; seguono Posta in arrivo (modulo opzionale), Modelli, Footer e Impostazioni. Il menuImpostazionirimane visibile solo agli utenti conmanage_corsivo_developer_tools; la pagina diretta continua a richiederemanage_options. Tutte le voci appartengono a Mail e funzionano senza altri plugin Corsivo. - Account. SMTP multipli con preset (Gmail, Aruba, OVH, Microsoft 365, Brevo, SendGrid, ecc.), mittente e account predefinito; credenziali cifrate al salvataggio, mai riproposte in chiaro. IMAP opzionale per account.
- Coda.
use_queue, batch size (default 20), retry massimi (3), pausa tra invii, minuti di lock (10), retention coda (30 giorni) e log (90). - Trasporto.
wrap_wp_mailper il wrapping del layout,disable_sendingcome kill switch globale. - Moduli. IMAP e preferenze newsletter interne attivabili dal tab Moduli, insieme alle integrazioni Corsivo Theme, WPML e WooCommerce; chiavi meta utente ammesse come merge tag.
- Cron esterno. URL con chiave dedicata, rigenerabile dalle impostazioni, per siti senza traffico regolare.
- Chiave di cifratura. Facoltativa: senza di essa la master key viene generata al primo uso e salvata a database.
define('CORSIVO_MAIL_ENCRYPTION_KEY', 'inserisci-almeno-32-byte-casuali');
Definirla tiene la chiave fuori dal database, così un dump non basta a leggere le credenziali. Una volta scelta va mantenuta stabile e inclusa nei backup: cambiarla o rimuoverla rende illeggibili le credenziali salvate, che vanno reinserite. Ruotare i salt WordPress invece non ha alcun effetto.
- Requisiti. WordPress 6.6+, PHP 8.1+, OpenSSL con AES-256-GCM.
L'editor Gutenberg, la Posta in arrivo e i tab React Account/Gruppi vengono compilati rispettivamente da admin-editor, inbox-app e settings-app, incorporando il package privato @corsivo-suite/wp-admin-ui. In ciascuna directory npm install seguito da npm run check rigenera gli asset, verifica i controlli e valida il wiring PHP. Se una build è incompleta, WordPress carica lo script classico e il relativo CSS in assets senza interrompere l'interfaccia.
Bootstrap, entry point e lifecycle
corsivo-mail.php carica per primi soltanto i componenti necessari a leggere configurazione e stato dello storage: cifratura/account/opzioni, schema della coda e del log/IMAP, primitive della coda, worker ed endpoint cron. Questa parte early-boot può quindi verificare lo storage e, se Corsivo Mail governa il trasporto globale, bloccare wp_mail senza dipendere dal runtime applicativo. Il filtro conserva qualunque short-circuit già deciso da un componente precedente.
load_runtime() include il resto soltanto dopo required_storage_ready(): sicurezza e admin, SMTP e journal, template e blocchi, automazioni, newsletter interna, IMAP, integrazioni e API pubblica. L'ordine evita che CPT, route o worker diventino parzialmente disponibili quando le tabelle richieste non sono verificabili.
L'attivazione installa lo storage fresh-only, registra CPT e cron e verifica subito il risultato; la disattivazione elimina le pianificazioni e i flag di verifica, senza cancellare coda, log, template o account. uninstall.php è il solo percorso che elimina tabelle, opzioni, meta, cron e contenuti di servizio del plugin. Non esiste un installer lazy nel traffico ordinario.
Gli entry point sono: intercettazione pre_wp_mail; funzioni PHP pubbliche in includes/api.php; route REST amministrative per configurazione, template, automazioni e inbox; hook cron interno ed endpoint cron autenticato; schermate WordPress; blocco newsletter e componenti dell'editor; integrazione PHPMailer e, quando abilitato, sincronizzazione IMAP.
Mappa completa dei file
| File | Responsabilità |
|---|---|
.gitignore |
Esclusioni locali e artefatti non distribuibili. |
.gitattributes |
Terminatori LF per JavaScript e CSS, inclusi i checkout Windows. |
.distignore |
Allowlist negativa del pacchetto distribuibile, inclusa l'esclusione dei sorgenti e delle dipendenze di build. |
corsivo-mail.php |
Bootstrap early/runtime, readiness, attivazione/disattivazione e protezione fail-closed di wp_mail. |
includes/api.php |
API pubblica durevole per enqueue, fence, cancel, status e consegna di email registrate. |
includes/functions.php |
Helper applicativi condivisi per template, invio e risoluzione dei contenuti. |
includes/security.php |
Capability, nonce, sanitizzazione, header e policy di sicurezza delle superfici admin/REST. |
includes/settings/crypto.php |
Envelope AES-GCM stabile per le sole credenziali SMTP/IMAP. |
includes/settings/accounts.php |
Modello, validazione e persistenza degli account di trasporto e ricezione. |
includes/settings/options.php |
Schema, default, normalizzazione e lettura delle opzioni del plugin. |
includes/settings/page.php |
Pagina impostazioni, tab, diagnostica, salvataggi protetti e asset admin. |
includes/settings/transfer.php |
Export/import controllato della configurazione e roundtrip dei dati trasferibili. |
includes/smtp/phpmailer.php |
Selezione account e configurazione di PHPMailer per il trasporto SMTP. |
includes/queue/schema.php |
Blueprint, installazione fresh-only e verifica fisica della coda. |
includes/queue/queue.php |
Inserimento idempotente, lettura, stati, fence, cancellazione e retention delle righe. |
includes/queue/worker.php |
Claim con lease, guardie sorgente/marketing, trasporto, retry e stati terminali. |
includes/queue/cron-endpoint.php |
Pianificazione, endpoint autenticato e coordinamento dell'esecuzione esterna. |
includes/queue/log.php |
Scrittura degli eventi operativi della coda nel journal. |
includes/storage/contract.php |
Contratto comune per schema, marker plain, verifica e readiness degli storage. |
includes/storage/log.php |
Blueprint, installazione e accesso alla tabella append-only del log. |
includes/template/cpt.php |
Registrazione e autorizzazioni del CPT dei template email. |
includes/template/merge-tags.php |
Catalogo, parsing e risoluzione sicura dei merge tag. |
includes/template/compiler.php |
Compilazione del contenuto Gutenberg in markup email-safe. |
includes/template/render.php |
Composizione documento, stili, layout e rendering finale. |
includes/template/wp-mail-hook.php |
Wrapping e accodamento delle chiamate WordPress a wp_mail. |
includes/blocks/content-slot.php |
Blocco dinamico per inserire contenuti/slot nei template. |
includes/blocks/editor.php |
Registrazione blocchi, restrizioni e configurazione dell'editor email. |
includes/automation/cpt.php |
CPT, meta e capability delle automazioni. |
includes/automation/payload.php |
Canonicalizzazione e validazione del payload di un'automazione. |
includes/automation/core-emails.php |
Registro delle email core e loro associazione ai template editabili. |
includes/automation/audience.php |
Contratto delle audience, conteggio e risoluzione dei destinatari. |
includes/automation/send.php |
Preparazione e accodamento degli invii di automazione. |
includes/automation/bulk.php |
Azioni massive e batch amministrativi sugli invii. |
includes/automation/admin-columns.php |
Colonne, stato e azioni rapide nella lista delle automazioni. |
includes/automation/events.php |
Registro degli eventi che possono attivare automazioni. |
includes/automation/meta-rest.php |
Esposizione e validazione REST dei metadati dell'automazione. |
includes/automation/schedule.php |
Calcolo delle occorrenze e pianificazione degli invii programmati. |
includes/automation/runtime.php |
Dispatch degli eventi e coordinamento runtime delle automazioni attive. |
includes/automation/preview.php |
Anteprima protetta con destinatario e contesto controllati. |
includes/automation/seed.php |
Creazione esplicita dei template/automazioni iniziali previsti dal plugin. |
includes/newsletter/subscription.php |
Preferenza marketing per utenti registrati e controllo del consenso. |
includes/newsletter/unsubscribe.php |
URL one-click, verifica del token e revoca del consenso. |
includes/newsletter/groups.php |
Modello e assegnazione dei gruppi newsletter interni. |
includes/newsletter/groups-page.php |
UI amministrativa dei gruppi. |
includes/newsletter/block.php |
Registrazione e callback del blocco di iscrizione. |
includes/imap/schema.php |
Blueprint e verifica della tabella indice dei messaggi IMAP. |
includes/imap/client.php |
Client IMAP TLS, parsing delle risposte e limiti di trasporto. |
includes/imap/sync.php |
Sincronizzazione UID/metadati e aggiornamento dello stato locale. |
includes/imap/inbox.php |
Query e azioni dell'inbox amministrativa. |
includes/imap/page.php |
Registrazione e rendering della webmail in admin. |
includes/imap/test.php |
Diagnostica protetta della connessione IMAP. |
includes/integrations/layout-selector.php |
Collegamento ai layout/starter template disponibili nella suite. |
includes/integrations/corsivo-theme.php |
Import di palette, font e token da Corsivo Theme quando abilitato. |
includes/integrations/wpml.php |
Risoluzione lingua e traduzioni con WPML. |
includes/integrations/woocommerce.php |
Esclusione e coordinamento delle email possedute da WooCommerce. |
assets/editor.css |
Stili dell'editor dei template e delle automazioni. |
assets/editor.js |
Comportamento comune dell'editor Gutenberg email. |
assets/email-editor.js |
Controlli specifici del documento/template email. |
admin-editor/package.json |
Pipeline wp-scripts e dipendenza privata da Corsivo Admin UI. |
admin-editor/src/index.js |
Entry compilata che monta i controlli condivisi e registra l'editor esistente. |
admin-editor/build/ |
Bundle JavaScript e CSS LTR/RTL distribuiti con il plugin. |
inbox-app/ |
Pipeline e bundle LTR/RTL della webmail con dipendenza privata da Corsivo Admin UI. |
assets/inbox.js |
Interazioni della webmail, dialog accessibile, protezioni dalle race e fallback classico. |
assets/inbox.css |
Layout scoped della Posta in arrivo e fallback RTL tramite proprietà logiche. |
settings-app/ |
Pipeline e bundle LTR/RTL dei tab Account e Gruppi con Repeater, ConfirmDialog e FieldFeedback. |
assets/settings.js |
Progressive enhancement classico dei tab Account e Gruppi quando la build non è disponibile. |
assets/settings.css |
Layout scoped condiviso dalle isole React e dai fallback server-rendered. |
assets/newsletter-editor.js |
UI editor del blocco newsletter. |
assets/newsletter.js |
Submit e feedback frontend del blocco di iscrizione. |
tests/admin-navigation.php |
Gate standalone della voce Impostazioni e landing del menu principale su Messaggi. |
tests/admin-render.php |
Smoke del rendering delle schermate amministrative. |
tests/editor-assets.php |
Gate statico del bundle editor e assenza di import privati a runtime. |
tests/editor-enqueue-smoke.php |
Smoke del wiring build/fallback, dipendenze, configurazione e RTL. |
tests/inbox-assets.php |
Gate statico del bundle e degli stili della Posta in arrivo. |
tests/inbox-enqueue-smoke.php |
Smoke del wiring compilato della Posta in arrivo. |
tests/inbox-fallback-smoke.php |
Smoke del fallback classico quando la build della Posta in arrivo è incompleta. |
tests/inbox-contract.php |
Contratto statico di route, race guard, conferma asincrona e sandbox degli allegati. |
tests/settings-ui-assets.php |
Gate statico del bundle e degli stili dei tab Account e Gruppi. |
tests/settings-ui-enqueue-smoke.php |
Smoke del wiring compilato, configurazione localizzata e RTL delle impostazioni. |
tests/settings-ui-fallback-smoke.php |
Smoke del fallback server-rendered quando la build delle impostazioni è incompleta. |
tests/settings-ui-post-contract.php |
Roundtrip POST di Account e Gruppi, credenziali vuote e guardia rimozione account. |
tests/crypto-early-boot.php |
Contratto early-boot della cifratura e indipendenza dai salt WordPress. |
tests/database-integrity.php |
Verifica dello schema reale in un WordPress caricato. |
tests/footer-layout.php |
Verifica che il footer dei wrapper segua l'impostazione flottante o a tutta larghezza anche negli invii intercettati da wp_mail. |
tests/queue-storage.php |
Macchina a stati, installazione, recovery e blocchi dello storage coda. |
tests/schema-current-static.php |
Guard statiche sul contratto current-only e sull'indipendenza dai salt. |
tests/security-queue.php |
Autorizzazioni, payload, consenso, sanitizzazione e guardie della coda. |
tests/storage-plain-early-boot.php |
Readiness del marker plain e comportamento fail-closed early-boot. |
tests/transfer-roundtrip.php |
Roundtrip di export/import delle impostazioni. |
tests/transport-contract.php |
Contratto worker/PHPMailer e classificazione verificata degli esiti. |
tests/storage-defaults.php |
Distinzione tra default letterali, espressioni e NULL nei metadati MySQL/MariaDB. |
tests/queue-input-contract.php |
Normalizzazione dei payload wp_mail e policy di retention all'accodamento. |
tests/queue-lifecycle-integrity.php |
Completamenti tardivi, cancellazioni pendenti e cleanup delle sorgenti protette su database. |
tests/smtp-account-isolation.php |
Isolamento delle connessioni persistenti, delle credenziali e dello stato TLS tra account. |
tests/marketing-recipient-contract.php |
Controlli del destinatario marketing e divieto di copie Cc/Bcc. |
tests/imap-protocol.php |
Parsing FETCH/MIME, limiti del protocollo, UIDVALIDITY e backlog incrementale. |
tests/template-content-contract.php |
Oggetti email come testo e liste Gutenberg annidate. |
uninstall.php |
Rimozione multisite-safe di tabelle, opzioni, cron e contenuti posseduti. |
changelog.txt |
Storico delle release e delle modifiche contrattuali. |
corsivo-mail-0.23.1.zip |
Artefatto di release della versione indicata, non caricato dal runtime. |
LICENSE |
Testo della licenza GPL-2.0-or-later. |
README.md |
Specifica operativa e mappa del plugin. |
Contratti di rendering e consegna
I merge tag vengono espansi una sola volta nel template. Il corpo ricevuto da wp_mail resta contenuto e non viene interpretato come template. Gli oggetti email usano sostituzioni testuali; i valori HTML ordinari rimangono escaped. Un'integrazione può indicare esplicitamente campi HTML nel contesto con _html_keys, per esempio ['fields_html']: questi valori passano attraverso wp_kses_post prima dell'inserimento.
Se PHPMailer conferma la consegna ad almeno un destinatario e restituisce un errore per gli altri, la coda passa a delivery_unknown senza reinvio automatico. Il dettaglio segnala la consegna parziale. Quando tutti i destinatari sono rifiutati rimane disponibile il normale retry.
Una ricorrenza mensile impostata al 29, 30 o 31 viene eseguita l'ultimo giorno disponibile nei mesi più corti. I worker HTTP firmati partono su wp_loaded, dopo la registrazione di blocchi, post type e integrazioni. tests/audit-regressions.php verifica questi contratti senza WordPress avviato, database o rete.
La sincronizzazione IMAP incrementale importa i nuovi UID in ordine, senza saltare i messaggi che superano il batch. Lettura, allegati e cancellazione richiedono la stessa UIDVALIDITY nella lista del browser, nella cache e sul server; una casella ricreata richiede una nuova sincronizzazione prima di operare sui messaggi. php tests/imap-identity.php verifica backlog e identità dei messaggi senza connessioni esterne.
Il parser IMAP legge UID, flag e data esclusivamente dai metadati FETCH esterni al contenuto ricevuto. php tests/imap-fetch-parser.php verifica risposte con metadati prima o dopo il literal, notifiche intermedie e header contenenti falsi metadati.