Costruire un sistema di archiviazione delle email: le sfide e ovviamente la soluzione - Parte 1

Jeff Goldstein

4 feb 2019

Email

1 min read

Costruire un sistema di archiviazione delle email: le sfide e ovviamente la soluzione - Parte 1

Punti Chiave

    • L'archiviazione delle email è sempre più essenziale per ambienti normativi, di conformità e di auditing.

    • SparkPost non memorizza i corpi delle email, ma la sua funzione di archiviazione consente ai mittenti di ricevere messaggi duplicati che rispecchiano i link di tracciamento e il contenuto.

    • I corpi delle email possono essere archiviati in Amazon S3, mentre i metadati degli eventi dei messaggi possono essere archiviati in MySQL per interrogazioni e riferimenti incrociati.

    • Gli eventi dei messaggi di SparkPost forniscono registri di attività dettagliati (rimbalzi, consegne, clic, aperture, disiscrizioni, reclami e altro).

    • Copie di archiviazione vengono generate solo quando si invia tramite SMTP.

    • Gli eventi dei messaggi per email originali, archiviate, CC e BCC condividono un transmission_id comune.

    • Il Relay Email Inbound può acquisire messaggi archiviati ma non include il transmission_id, creando una sfida di collegamento dei dati.

    • Incorporare un identificatore unico nascosto (UID) nel corpo del messaggio colma questa lacuna e collega il contenuto in entrata ai registri in uscita.

    • Combinare email archiviate + eventi dei messaggi consente di creare un sistema di archiviazione ricercabile e auditabile.

    • Il progetto a lungo termine include rilasci di codice per archiviare email in S3 e registrare i dati degli eventi in MySQL.

    • La versione finale dell'applicazione permetterà una ricerca, una visualizzazione e una riconciliazione facili del contenuto delle email con tutta la storia degli eventi correlati.

    • Ideale per settori con elevati requisiti di conformità che necessitano di una visibilità completa su ogni messaggio inviato.

Punti salienti del Q&A

  • Perché costruire un sistema di archiviazione delle email autonomo?

    Le industrie regolamentate richiedono spesso lo stoccaggio a lungo termine sia del corpo dell'email che di tutti i log degli eventi associati. SparkPost non memorizza i corpi dei messaggi, quindi costruire un sistema personalizzato garantisce conformità, audit e visibilità.

  • Come si ottiene una copia esatta dell'email originale inviata?

    La funzione Archivia di SparkPost invia una copia di ogni email in uscita agli indirizzi di archiviazione designati, preservando tutti i link codificati e i comportamenti di tracciamento.

  • Perché non puoi catturare il corpo dell'email prima di inviarlo?

    La cattura pre-invio non include le modifiche di SparkPost (tracciamento delle aperture, tracciamento dei clic, codifica dei collegamenti). L'utilizzo delle copie di Archivio garantisce che la tua versione salvata corrisponda esattamente a ciò che i destinatari ricevono.

  • SparkPost archivia automaticamente le email?

    No. SparkPost non memorizza i corpi dei messaggi. Le copie di archivio devono essere richieste specificando gli indirizzi di archivio durante l'iniezione SMTP.

  • Cosa è conservato dove in questo sistema di archiviazione?

    • Corpo dell'email → Amazon S3

    • Log degli eventi dei messaggi → MySQL
      Questa separazione supporta la ricerca veloce, query strutturate e un'archiviazione degli oggetti economica.

  • Per quanto tempo SparkPost conserva i dati sugli eventi?

    SparkPost memorizza gli eventi dei messaggi per 10 giorni. Dopo di che, i dati devono essere incorporati tramite webhook o interrogati e memorizzati altrove.

  • Quali eventi di messaggio sono disponibili?

    SparkPost attualmente espone 14 eventi, tra cui consegne, rimbalzi, clic, aperture, rifiuti, problemi di politica, segnalazioni di spam, cancellazioni e altro ancora.

  • Quali identificatori collegano tutti gli eventi?

    Tutti i messaggi in uscita (originale, archivio, CC, BCC) condividono lo stesso transmission_id. L'email originale e l'email di archivio condividono anche lo stesso message_id.

  • Perché il processamento in entrata è una sfida?

    Il Relay Email Inbound di SparkPost converte le email in entrata in JSON, ma questo JSON non include transmission_id. Senza dati aggiuntivi, la copia in entrata non può essere collegata alla sua cronologia del log in uscita.

  • Come si collegano le email di archivio in entrata agli eventi dei messaggi in uscita?

    Incorpora un identificatore unico (UID) nascosto nel corpo dell'email e passa lo stesso UID nei metadati. Questo UID diventa il riferimento condiviso tra i record in entrata e in uscita.

  • In che modo il Relay Email Inbound aiuta ad automatizzare l'archiviazione?

    Riceve le email di archivio inviate al tuo dominio di archiviazione, le analizza in JSON strutturato e le invia alla tua applicazione tramite webhook, consentendo l'estrazione e la memorizzazione automatizzata.

  • Qual è la visione a lungo termine del progetto?

    Un'applicazione completa che:

    • Archivia le email in S3

    • Memorizza tutti i log degli eventi in MySQL

    • Permette agli utenti di cercare le email

    • Visualizza l'email originale e ogni evento associato in un'interfaccia unica

Circa un anno fa, ho scritto un blog su come recuperare copie delle email per archiviazione e visualizzazione, ma non ho affrontato il reale stoccaggio dell'email o dei dati correlati, e recentemente ho scritto un blog sullo stoccaggio di tutti i dati degli eventi (cioè quando l'email è stata inviata, aperture, clic, rimbalzi, disiscrizioni, ecc.) su un'email per scopi di auditing, ma ho scelto di non creare alcun codice di supporto.

Con l'aumento dell'uso delle email in ambienti normativi, ho deciso che era ora di avviare un nuovo progetto che unisse tutto questo con dei campioni di codice su come memorizzare il corpo dell'email e tutti i suoi dati associati. Nel prossimo anno, continuerò a sviluppare questo progetto con l'obiettivo di creare un'applicazione funzionante per l'archiviazione e la visualizzazione delle email archiviate e di tutte le informazioni di log prodotte da SparkPost. SparkPost non dispone di un sistema che archivia il corpo delle email, ma rende relativamente semplice la costruzione di una piattaforma di archiviazione.

In questa serie di blog, descriverò il processo che ho seguito per memorizzare il corpo dell’email su S3 (Simple Store Service di Amazon) e tutti i dati di log pertinenti in MySQL per un facile riferimento incrociato. Per i sistemi di archiviazione di produzione che richiedono strategie di backup di database robuste, considera di implementare un processo di backup e ripristino PostgreSQL completo per garantire che i tuoi dati di archiviazione siano protetti correttamente. In definitiva, questo è il punto di partenza per costruire un'applicazione che consentirà una facile ricerca delle email archiviate, per poi visualizzare quelle email insieme ai dati degli eventi (log). Il codice per questo progetto può essere trovato nel seguente repository GitHub: PHPArchivePlatform su GitHub

Questa prima voce della serie di blog descriverà la sfida e delineerà un'architettura per la soluzione. Il resto dei blog dettagliarà porzioni della soluzione insieme a campioni di codice.

Il primo passo nel mio processo è stato scoprire come ottenere una copia dell’email inviata al destinatario originale. Per ottenere una copia del corpo dell'email, è necessario:


Opzioni di cattura del corpo dell'email

Metodo

Chi crea la copia

Riflette le modifiche di tracciamento

Amico dell'automazione

Utilizzato in questa soluzione

Cattura prima dell'invio

Applicazione

❌ No

✅ Sì

Il server email memorizza la copia

Server di posta

✅ Sì

❌ Limitato

Funzione di archiviazione di SparkPost

SparkPost

✅ Sì

✅ Sì


  1. Catturare il corpo dell'email prima di inviare l'email

  2. Far memorizzare una copia dal server email

  3. Far creare la copia dal server email per memorizzarla

Se il server email sta aggiungendo elementi come il tracciamento dei link o il tracciamento delle aperture, non puoi utilizzare il punto #1 perché non rifletterà le modifiche del tracciamento delle aperture/clic.

Questo significa che o il server deve memorizzare l'email o in qualche modo offrirti una copia di quell'email per la memorizzazione. Poiché SparkPost non ha un meccanismo di archiviazione per i corpi delle email ma ha un modo per creare una copia dell'email, faremo in modo che SparkPost ci invii una copia dell'email da memorizzare su S3.

Questo viene fatto utilizzando la funzione di archiviazione di SparkPost. La funzione di archiviazione di SparkPost dà al mittente la possibilità di dire a SparkPost di inviare una copia duplicata dell'email a uno o più indirizzi email e di utilizzare gli stessi link di tracciamento e apertura dell'originale. La documentazione di SparkPost definisce la loro funzione di archiviazione nel seguente modo:

I destinatari nell'elenco di archiviazione riceveranno un replica esatta del messaggio che è stato inviato all'indirizzo RCPT TO. In particolare, eventuali link codificati destinati al destinatario RCPT TO saranno identici nei messaggi di archiviazione

Le uniche differenze rispetto all'email RCPT TO sono che alcune delle intestazioni saranno diverse poiché l'indirizzo di destinazione per l'email di archiviazione è diverso, ma il corpo dell'email sarà una replica esatta!

Se desideri una spiegazione più approfondita, ecco un link alla documentazione di SparkPost sulla creazione di copie duplicate (o di archiviazione) di un'email.

Come nota a margine, SparkPost consente effettivamente di inviare email a indirizzi cc, bcc e di archiviazione. Per questa soluzione, ci concentriamo sugli indirizzi di archiviazione.

* Avviso * Le email archiviate possono ESSERE create SOLO quando si iniettano email in SparkPost tramite SMTP!

Ora che sappiamo come ottenere una copia dell'email originale, dobbiamo guardare i dati di log che vengono prodotti e alcune delle sottigliezze all'interno di quel dato. SparkPost tiene traccia di tutto ciò che accade sui propri server e ti offre tali informazioni sotto forma di eventi di messaggio. Quegli eventi sono memorizzati su SparkPost per 10 giorni e possono essere recuperati dal server tramite un'API RESTful chiamata eventi di messaggio, o puoi fare in modo che SparkPost invii quegli eventi a qualsiasi numero di applicazioni di raccolta che desideri. Il meccanismo di invio avviene tramite webhook ed è eseguito in tempo reale.

Attualmente, ci sono 14 eventi diversi che possono accadere a un'email.  Ecco un elenco degli eventi attuali:

  • Rimbalzo

  • ClickDelay

  • Consegna

  • Errore di generazione

  • Reiezione di generazione

  • Prima apertura

  • Unsubscribe link di InjectionLink

  • Disiscrizione dalla lista

  • Apertura

  • Fuori banda

  • Politica di Reiezione Reclamo di Spam


* Segui questo link per una guida di riferimento aggiornata per una descrizione di ciascun evento insieme ai dati condivisi per ciascun evento.

Ogni evento ha numerosi campi che corrispondono al tipo di evento. Alcuni campi come il transmission_id si trovano in ogni evento, ma altri campi potrebbero essere più specifici per l'evento; ad esempio, solo gli eventi di apertura e clic hanno informazioni geotag.


Identificatori utilizzati nel sistema di archiviazione

Identificatore

Dove ha origine

Condiviso tra

Scopo

Limitazione

transmission_id

Uscita SparkPost

Originale, archiviazione, cc, bcc

Correla tutti gli eventi di messaggio

Non disponibile nel relay in entrata

message_id

Uscita SparkPost

Originale + archiviazione

Identifica messaggi individuali

Diverso per cc/bcc

UID Nascosto

Iniettato dal mittente

Uscente + in entrata

Collega il corpo email archiviato agli eventi

Deve essere implementato su misura


Un'entry di evento di messaggio molto importante per questo progetto è il transmission_id. Tutte le voci degli eventi di messaggio per l'email originale, l'email archiviata e eventuali indirizzi cc e bcc condivideranno lo stesso transmission_id.

Esiste anche una voce comune chiamata message_id che avrà lo stesso id per ogni entry dell'email originale e dell'email archiviata. Qualsiasi indirizzo cc o bcc avrà il proprio id per l'entry message_id .

Finora sembra fantastico e francamente piuttosto facile, ma ora arriva la parte impegnativa. Ricorda, per ottenere l'email di archiviazione, facciamo in modo che SparkPost invii una copia duplicata dell'email originale a un altro indirizzo email che corrisponde a qualche casella di posta a cui hai accesso. Ma per automatizzare questa soluzione e memorizzare il corpo dell'email, utilizzerò un’altra funzione di SparkPost chiamata Relaying Email in Entrata. Ciò che fa, è prendere tutte le email inviate a un dominio specifico e processarle. Processandole, l'email viene smontata e viene creata una struttura JSON che viene quindi consegnata a un'applicazione tramite un webhook. Vedi l'Appendice A per un campione JSON.

Se guardi attentamente, noterai che la struttura JSON del relay in entrata è priva di un campo molto importante; il transmission_id. Mentre tutte le email in uscita hanno il transmission_id con la stessa entry che lega tutti i dati dell'email originale, archiviazione, cc e indirizzi bcc; SparkPost non ha modo di sapere che l'email catturata dal processo in entrata è collegata a qualsiasi email in uscita. Il processo in entrata sa semplicemente che è stata inviata un'email a un dominio specifico e di analizzare l'email. Questo è tutto. Tratterà qualsiasi email inviata a quel dominio allo stesso modo, sia essa una risposta da un cliente che l'email di archiviazione inviata da SparkPost.

Quindi, il trucco è: come si incolla il dato in uscita al processo in entrata che ha appena acquisito la versione archiviata dell'email? Quello che ho deciso di fare è nascondere un id unico nel corpo dell'email. Come questo venga fatto è a tua discrezione, ma io ho semplicemente creato un campo di input con il tag nascosto attivato.

<input name="ArchiveCode" type="hidden" value="<<UID>>">

Ho anche aggiunto quel campo nel blocco dei metadati dell'intestazione X-MSYS-API che viene passato a SparkPost durante l'iniezione. Questo UID nascosto finirà per essere la colla dell'intero processo, ed è un componente principale del progetto che sarà discusso in modo approfondito nei prossimi post del blog.

Ora che abbiamo l'UID che unirà questo progetto e comprendiamo perché sia necessario, posso iniziare a costruire la visione dell'intero progetto e dei corrispondenti post del blog.

  1. Catturare e memorizzare l'email di archiviazione insieme a un'entry di database per ricerca indicizzazione

  2. Catturare tutti i dati dell'evento del messaggio

  3. Creare un'applicazione per visualizzare l’email e tutti i dati corrispondenti

Qui c'è un diagramma semplice del progetto:

build an email archiving system - diagram


Il primo drop di codice coprirà il processo di archiviazione e la memorizzazione dell'email su S3, mentre il secondo drop di codice coprirà la memorizzazione di tutti i dati di log provenienti dagli eventi di messaggio in MySQL. Puoi aspettarti i primi due drop di codice e post del blog nei primi mesi del 2019.  Se hai domande o suggerimenti, non esitare a farceli sapere.

Buon invio.
– Jeff


Appendice A:

JSON file example - email archiving system

Circa un anno fa, ho scritto un blog su come recuperare copie delle email per archiviazione e visualizzazione, ma non ho affrontato il reale stoccaggio dell'email o dei dati correlati, e recentemente ho scritto un blog sullo stoccaggio di tutti i dati degli eventi (cioè quando l'email è stata inviata, aperture, clic, rimbalzi, disiscrizioni, ecc.) su un'email per scopi di auditing, ma ho scelto di non creare alcun codice di supporto.

Con l'aumento dell'uso delle email in ambienti normativi, ho deciso che era ora di avviare un nuovo progetto che unisse tutto questo con dei campioni di codice su come memorizzare il corpo dell'email e tutti i suoi dati associati. Nel prossimo anno, continuerò a sviluppare questo progetto con l'obiettivo di creare un'applicazione funzionante per l'archiviazione e la visualizzazione delle email archiviate e di tutte le informazioni di log prodotte da SparkPost. SparkPost non dispone di un sistema che archivia il corpo delle email, ma rende relativamente semplice la costruzione di una piattaforma di archiviazione.

In questa serie di blog, descriverò il processo che ho seguito per memorizzare il corpo dell’email su S3 (Simple Store Service di Amazon) e tutti i dati di log pertinenti in MySQL per un facile riferimento incrociato. Per i sistemi di archiviazione di produzione che richiedono strategie di backup di database robuste, considera di implementare un processo di backup e ripristino PostgreSQL completo per garantire che i tuoi dati di archiviazione siano protetti correttamente. In definitiva, questo è il punto di partenza per costruire un'applicazione che consentirà una facile ricerca delle email archiviate, per poi visualizzare quelle email insieme ai dati degli eventi (log). Il codice per questo progetto può essere trovato nel seguente repository GitHub: PHPArchivePlatform su GitHub

Questa prima voce della serie di blog descriverà la sfida e delineerà un'architettura per la soluzione. Il resto dei blog dettagliarà porzioni della soluzione insieme a campioni di codice.

Il primo passo nel mio processo è stato scoprire come ottenere una copia dell’email inviata al destinatario originale. Per ottenere una copia del corpo dell'email, è necessario:


Opzioni di cattura del corpo dell'email

Metodo

Chi crea la copia

Riflette le modifiche di tracciamento

Amico dell'automazione

Utilizzato in questa soluzione

Cattura prima dell'invio

Applicazione

❌ No

✅ Sì

Il server email memorizza la copia

Server di posta

✅ Sì

❌ Limitato

Funzione di archiviazione di SparkPost

SparkPost

✅ Sì

✅ Sì


  1. Catturare il corpo dell'email prima di inviare l'email

  2. Far memorizzare una copia dal server email

  3. Far creare la copia dal server email per memorizzarla

Se il server email sta aggiungendo elementi come il tracciamento dei link o il tracciamento delle aperture, non puoi utilizzare il punto #1 perché non rifletterà le modifiche del tracciamento delle aperture/clic.

Questo significa che o il server deve memorizzare l'email o in qualche modo offrirti una copia di quell'email per la memorizzazione. Poiché SparkPost non ha un meccanismo di archiviazione per i corpi delle email ma ha un modo per creare una copia dell'email, faremo in modo che SparkPost ci invii una copia dell'email da memorizzare su S3.

Questo viene fatto utilizzando la funzione di archiviazione di SparkPost. La funzione di archiviazione di SparkPost dà al mittente la possibilità di dire a SparkPost di inviare una copia duplicata dell'email a uno o più indirizzi email e di utilizzare gli stessi link di tracciamento e apertura dell'originale. La documentazione di SparkPost definisce la loro funzione di archiviazione nel seguente modo:

I destinatari nell'elenco di archiviazione riceveranno un replica esatta del messaggio che è stato inviato all'indirizzo RCPT TO. In particolare, eventuali link codificati destinati al destinatario RCPT TO saranno identici nei messaggi di archiviazione

Le uniche differenze rispetto all'email RCPT TO sono che alcune delle intestazioni saranno diverse poiché l'indirizzo di destinazione per l'email di archiviazione è diverso, ma il corpo dell'email sarà una replica esatta!

Se desideri una spiegazione più approfondita, ecco un link alla documentazione di SparkPost sulla creazione di copie duplicate (o di archiviazione) di un'email.

Come nota a margine, SparkPost consente effettivamente di inviare email a indirizzi cc, bcc e di archiviazione. Per questa soluzione, ci concentriamo sugli indirizzi di archiviazione.

* Avviso * Le email archiviate possono ESSERE create SOLO quando si iniettano email in SparkPost tramite SMTP!

Ora che sappiamo come ottenere una copia dell'email originale, dobbiamo guardare i dati di log che vengono prodotti e alcune delle sottigliezze all'interno di quel dato. SparkPost tiene traccia di tutto ciò che accade sui propri server e ti offre tali informazioni sotto forma di eventi di messaggio. Quegli eventi sono memorizzati su SparkPost per 10 giorni e possono essere recuperati dal server tramite un'API RESTful chiamata eventi di messaggio, o puoi fare in modo che SparkPost invii quegli eventi a qualsiasi numero di applicazioni di raccolta che desideri. Il meccanismo di invio avviene tramite webhook ed è eseguito in tempo reale.

Attualmente, ci sono 14 eventi diversi che possono accadere a un'email.  Ecco un elenco degli eventi attuali:

  • Rimbalzo

  • ClickDelay

  • Consegna

  • Errore di generazione

  • Reiezione di generazione

  • Prima apertura

  • Unsubscribe link di InjectionLink

  • Disiscrizione dalla lista

  • Apertura

  • Fuori banda

  • Politica di Reiezione Reclamo di Spam


* Segui questo link per una guida di riferimento aggiornata per una descrizione di ciascun evento insieme ai dati condivisi per ciascun evento.

Ogni evento ha numerosi campi che corrispondono al tipo di evento. Alcuni campi come il transmission_id si trovano in ogni evento, ma altri campi potrebbero essere più specifici per l'evento; ad esempio, solo gli eventi di apertura e clic hanno informazioni geotag.


Identificatori utilizzati nel sistema di archiviazione

Identificatore

Dove ha origine

Condiviso tra

Scopo

Limitazione

transmission_id

Uscita SparkPost

Originale, archiviazione, cc, bcc

Correla tutti gli eventi di messaggio

Non disponibile nel relay in entrata

message_id

Uscita SparkPost

Originale + archiviazione

Identifica messaggi individuali

Diverso per cc/bcc

UID Nascosto

Iniettato dal mittente

Uscente + in entrata

Collega il corpo email archiviato agli eventi

Deve essere implementato su misura


Un'entry di evento di messaggio molto importante per questo progetto è il transmission_id. Tutte le voci degli eventi di messaggio per l'email originale, l'email archiviata e eventuali indirizzi cc e bcc condivideranno lo stesso transmission_id.

Esiste anche una voce comune chiamata message_id che avrà lo stesso id per ogni entry dell'email originale e dell'email archiviata. Qualsiasi indirizzo cc o bcc avrà il proprio id per l'entry message_id .

Finora sembra fantastico e francamente piuttosto facile, ma ora arriva la parte impegnativa. Ricorda, per ottenere l'email di archiviazione, facciamo in modo che SparkPost invii una copia duplicata dell'email originale a un altro indirizzo email che corrisponde a qualche casella di posta a cui hai accesso. Ma per automatizzare questa soluzione e memorizzare il corpo dell'email, utilizzerò un’altra funzione di SparkPost chiamata Relaying Email in Entrata. Ciò che fa, è prendere tutte le email inviate a un dominio specifico e processarle. Processandole, l'email viene smontata e viene creata una struttura JSON che viene quindi consegnata a un'applicazione tramite un webhook. Vedi l'Appendice A per un campione JSON.

Se guardi attentamente, noterai che la struttura JSON del relay in entrata è priva di un campo molto importante; il transmission_id. Mentre tutte le email in uscita hanno il transmission_id con la stessa entry che lega tutti i dati dell'email originale, archiviazione, cc e indirizzi bcc; SparkPost non ha modo di sapere che l'email catturata dal processo in entrata è collegata a qualsiasi email in uscita. Il processo in entrata sa semplicemente che è stata inviata un'email a un dominio specifico e di analizzare l'email. Questo è tutto. Tratterà qualsiasi email inviata a quel dominio allo stesso modo, sia essa una risposta da un cliente che l'email di archiviazione inviata da SparkPost.

Quindi, il trucco è: come si incolla il dato in uscita al processo in entrata che ha appena acquisito la versione archiviata dell'email? Quello che ho deciso di fare è nascondere un id unico nel corpo dell'email. Come questo venga fatto è a tua discrezione, ma io ho semplicemente creato un campo di input con il tag nascosto attivato.

<input name="ArchiveCode" type="hidden" value="<<UID>>">

Ho anche aggiunto quel campo nel blocco dei metadati dell'intestazione X-MSYS-API che viene passato a SparkPost durante l'iniezione. Questo UID nascosto finirà per essere la colla dell'intero processo, ed è un componente principale del progetto che sarà discusso in modo approfondito nei prossimi post del blog.

Ora che abbiamo l'UID che unirà questo progetto e comprendiamo perché sia necessario, posso iniziare a costruire la visione dell'intero progetto e dei corrispondenti post del blog.

  1. Catturare e memorizzare l'email di archiviazione insieme a un'entry di database per ricerca indicizzazione

  2. Catturare tutti i dati dell'evento del messaggio

  3. Creare un'applicazione per visualizzare l’email e tutti i dati corrispondenti

Qui c'è un diagramma semplice del progetto:

build an email archiving system - diagram


Il primo drop di codice coprirà il processo di archiviazione e la memorizzazione dell'email su S3, mentre il secondo drop di codice coprirà la memorizzazione di tutti i dati di log provenienti dagli eventi di messaggio in MySQL. Puoi aspettarti i primi due drop di codice e post del blog nei primi mesi del 2019.  Se hai domande o suggerimenti, non esitare a farceli sapere.

Buon invio.
– Jeff


Appendice A:

JSON file example - email archiving system

Circa un anno fa, ho scritto un blog su come recuperare copie delle email per archiviazione e visualizzazione, ma non ho affrontato il reale stoccaggio dell'email o dei dati correlati, e recentemente ho scritto un blog sullo stoccaggio di tutti i dati degli eventi (cioè quando l'email è stata inviata, aperture, clic, rimbalzi, disiscrizioni, ecc.) su un'email per scopi di auditing, ma ho scelto di non creare alcun codice di supporto.

Con l'aumento dell'uso delle email in ambienti normativi, ho deciso che era ora di avviare un nuovo progetto che unisse tutto questo con dei campioni di codice su come memorizzare il corpo dell'email e tutti i suoi dati associati. Nel prossimo anno, continuerò a sviluppare questo progetto con l'obiettivo di creare un'applicazione funzionante per l'archiviazione e la visualizzazione delle email archiviate e di tutte le informazioni di log prodotte da SparkPost. SparkPost non dispone di un sistema che archivia il corpo delle email, ma rende relativamente semplice la costruzione di una piattaforma di archiviazione.

In questa serie di blog, descriverò il processo che ho seguito per memorizzare il corpo dell’email su S3 (Simple Store Service di Amazon) e tutti i dati di log pertinenti in MySQL per un facile riferimento incrociato. Per i sistemi di archiviazione di produzione che richiedono strategie di backup di database robuste, considera di implementare un processo di backup e ripristino PostgreSQL completo per garantire che i tuoi dati di archiviazione siano protetti correttamente. In definitiva, questo è il punto di partenza per costruire un'applicazione che consentirà una facile ricerca delle email archiviate, per poi visualizzare quelle email insieme ai dati degli eventi (log). Il codice per questo progetto può essere trovato nel seguente repository GitHub: PHPArchivePlatform su GitHub

Questa prima voce della serie di blog descriverà la sfida e delineerà un'architettura per la soluzione. Il resto dei blog dettagliarà porzioni della soluzione insieme a campioni di codice.

Il primo passo nel mio processo è stato scoprire come ottenere una copia dell’email inviata al destinatario originale. Per ottenere una copia del corpo dell'email, è necessario:


Opzioni di cattura del corpo dell'email

Metodo

Chi crea la copia

Riflette le modifiche di tracciamento

Amico dell'automazione

Utilizzato in questa soluzione

Cattura prima dell'invio

Applicazione

❌ No

✅ Sì

Il server email memorizza la copia

Server di posta

✅ Sì

❌ Limitato

Funzione di archiviazione di SparkPost

SparkPost

✅ Sì

✅ Sì


  1. Catturare il corpo dell'email prima di inviare l'email

  2. Far memorizzare una copia dal server email

  3. Far creare la copia dal server email per memorizzarla

Se il server email sta aggiungendo elementi come il tracciamento dei link o il tracciamento delle aperture, non puoi utilizzare il punto #1 perché non rifletterà le modifiche del tracciamento delle aperture/clic.

Questo significa che o il server deve memorizzare l'email o in qualche modo offrirti una copia di quell'email per la memorizzazione. Poiché SparkPost non ha un meccanismo di archiviazione per i corpi delle email ma ha un modo per creare una copia dell'email, faremo in modo che SparkPost ci invii una copia dell'email da memorizzare su S3.

Questo viene fatto utilizzando la funzione di archiviazione di SparkPost. La funzione di archiviazione di SparkPost dà al mittente la possibilità di dire a SparkPost di inviare una copia duplicata dell'email a uno o più indirizzi email e di utilizzare gli stessi link di tracciamento e apertura dell'originale. La documentazione di SparkPost definisce la loro funzione di archiviazione nel seguente modo:

I destinatari nell'elenco di archiviazione riceveranno un replica esatta del messaggio che è stato inviato all'indirizzo RCPT TO. In particolare, eventuali link codificati destinati al destinatario RCPT TO saranno identici nei messaggi di archiviazione

Le uniche differenze rispetto all'email RCPT TO sono che alcune delle intestazioni saranno diverse poiché l'indirizzo di destinazione per l'email di archiviazione è diverso, ma il corpo dell'email sarà una replica esatta!

Se desideri una spiegazione più approfondita, ecco un link alla documentazione di SparkPost sulla creazione di copie duplicate (o di archiviazione) di un'email.

Come nota a margine, SparkPost consente effettivamente di inviare email a indirizzi cc, bcc e di archiviazione. Per questa soluzione, ci concentriamo sugli indirizzi di archiviazione.

* Avviso * Le email archiviate possono ESSERE create SOLO quando si iniettano email in SparkPost tramite SMTP!

Ora che sappiamo come ottenere una copia dell'email originale, dobbiamo guardare i dati di log che vengono prodotti e alcune delle sottigliezze all'interno di quel dato. SparkPost tiene traccia di tutto ciò che accade sui propri server e ti offre tali informazioni sotto forma di eventi di messaggio. Quegli eventi sono memorizzati su SparkPost per 10 giorni e possono essere recuperati dal server tramite un'API RESTful chiamata eventi di messaggio, o puoi fare in modo che SparkPost invii quegli eventi a qualsiasi numero di applicazioni di raccolta che desideri. Il meccanismo di invio avviene tramite webhook ed è eseguito in tempo reale.

Attualmente, ci sono 14 eventi diversi che possono accadere a un'email.  Ecco un elenco degli eventi attuali:

  • Rimbalzo

  • ClickDelay

  • Consegna

  • Errore di generazione

  • Reiezione di generazione

  • Prima apertura

  • Unsubscribe link di InjectionLink

  • Disiscrizione dalla lista

  • Apertura

  • Fuori banda

  • Politica di Reiezione Reclamo di Spam


* Segui questo link per una guida di riferimento aggiornata per una descrizione di ciascun evento insieme ai dati condivisi per ciascun evento.

Ogni evento ha numerosi campi che corrispondono al tipo di evento. Alcuni campi come il transmission_id si trovano in ogni evento, ma altri campi potrebbero essere più specifici per l'evento; ad esempio, solo gli eventi di apertura e clic hanno informazioni geotag.


Identificatori utilizzati nel sistema di archiviazione

Identificatore

Dove ha origine

Condiviso tra

Scopo

Limitazione

transmission_id

Uscita SparkPost

Originale, archiviazione, cc, bcc

Correla tutti gli eventi di messaggio

Non disponibile nel relay in entrata

message_id

Uscita SparkPost

Originale + archiviazione

Identifica messaggi individuali

Diverso per cc/bcc

UID Nascosto

Iniettato dal mittente

Uscente + in entrata

Collega il corpo email archiviato agli eventi

Deve essere implementato su misura


Un'entry di evento di messaggio molto importante per questo progetto è il transmission_id. Tutte le voci degli eventi di messaggio per l'email originale, l'email archiviata e eventuali indirizzi cc e bcc condivideranno lo stesso transmission_id.

Esiste anche una voce comune chiamata message_id che avrà lo stesso id per ogni entry dell'email originale e dell'email archiviata. Qualsiasi indirizzo cc o bcc avrà il proprio id per l'entry message_id .

Finora sembra fantastico e francamente piuttosto facile, ma ora arriva la parte impegnativa. Ricorda, per ottenere l'email di archiviazione, facciamo in modo che SparkPost invii una copia duplicata dell'email originale a un altro indirizzo email che corrisponde a qualche casella di posta a cui hai accesso. Ma per automatizzare questa soluzione e memorizzare il corpo dell'email, utilizzerò un’altra funzione di SparkPost chiamata Relaying Email in Entrata. Ciò che fa, è prendere tutte le email inviate a un dominio specifico e processarle. Processandole, l'email viene smontata e viene creata una struttura JSON che viene quindi consegnata a un'applicazione tramite un webhook. Vedi l'Appendice A per un campione JSON.

Se guardi attentamente, noterai che la struttura JSON del relay in entrata è priva di un campo molto importante; il transmission_id. Mentre tutte le email in uscita hanno il transmission_id con la stessa entry che lega tutti i dati dell'email originale, archiviazione, cc e indirizzi bcc; SparkPost non ha modo di sapere che l'email catturata dal processo in entrata è collegata a qualsiasi email in uscita. Il processo in entrata sa semplicemente che è stata inviata un'email a un dominio specifico e di analizzare l'email. Questo è tutto. Tratterà qualsiasi email inviata a quel dominio allo stesso modo, sia essa una risposta da un cliente che l'email di archiviazione inviata da SparkPost.

Quindi, il trucco è: come si incolla il dato in uscita al processo in entrata che ha appena acquisito la versione archiviata dell'email? Quello che ho deciso di fare è nascondere un id unico nel corpo dell'email. Come questo venga fatto è a tua discrezione, ma io ho semplicemente creato un campo di input con il tag nascosto attivato.

<input name="ArchiveCode" type="hidden" value="<<UID>>">

Ho anche aggiunto quel campo nel blocco dei metadati dell'intestazione X-MSYS-API che viene passato a SparkPost durante l'iniezione. Questo UID nascosto finirà per essere la colla dell'intero processo, ed è un componente principale del progetto che sarà discusso in modo approfondito nei prossimi post del blog.

Ora che abbiamo l'UID che unirà questo progetto e comprendiamo perché sia necessario, posso iniziare a costruire la visione dell'intero progetto e dei corrispondenti post del blog.

  1. Catturare e memorizzare l'email di archiviazione insieme a un'entry di database per ricerca indicizzazione

  2. Catturare tutti i dati dell'evento del messaggio

  3. Creare un'applicazione per visualizzare l’email e tutti i dati corrispondenti

Qui c'è un diagramma semplice del progetto:

build an email archiving system - diagram


Il primo drop di codice coprirà il processo di archiviazione e la memorizzazione dell'email su S3, mentre il secondo drop di codice coprirà la memorizzazione di tutti i dati di log provenienti dagli eventi di messaggio in MySQL. Puoi aspettarti i primi due drop di codice e post del blog nei primi mesi del 2019.  Se hai domande o suggerimenti, non esitare a farceli sapere.

Buon invio.
– Jeff


Appendice A:

JSON file example - email archiving system

Altre notizie

Leggi di più da questa categoria

A person is standing at a desk while typing on a laptop.

La piattaforma completa nativa dell'IA che si espande con la tua azienda.

© 2025 Uccello

A person is standing at a desk while typing on a laptop.

La piattaforma completa nativa dell'IA che si espande con la tua azienda.

© 2025 Uccello