Construire un système d'archivage d'emails : Stocker le corps de l'email
·
4 mars 2019

Points Clés
Objectif : Ce post décrit la première phase de la construction d'un système d'archivage d'e-mails utilisant SparkPost, Amazon S3, et MySQL. Il explique comment dupliquer, capturer et stocker les e-mails pour un accès à long terme et la conformité.
Idée principale : Le système stocke automatiquement le corps brut de l'e-mail (format rfc822) dans S3 et journalise les métadonnées (sujet, expéditeur, horodatage, etc.) dans MySQL pour une recherche rapide et une récupération.
Éléments essentiels couverts :
Créer des doublons pour l'archivage : Utilisez la Archive feature de SparkPost pour envoyer des copies identiques des e-mails sortants à une adresse d'archive désignée, garantissant que le corps et les liens de suivi restent identiques.
Association de données via UID : Intégrez un identifiant unique (UID) à la fois dans le corps de l'e-mail et dans les métadonnées X-MSYS-API pour lier les messages originaux et archivés.
Traitement entrant : Configurez un domaine entrant et un webhook dans SparkPost pour recevoir les charges utiles JSON des e-mails archivés via un collecteur d'application.
Stockage des e-mails dans S3 : Téléchargez le corps rfc822 analysé dans un bucket S3, en utilisant des règles de cycle de vie (par exemple, transition vers Glacier après un an) pour réduire les coûts de stockage.
Journalisation des métadonnées dans MySQL : Enregistrez des champs clés tels que RCPT_TO, FROM, SUBJECT, et le nom de fichier S3 pour l'indexation des recherches et la récupération future.
Considérations de performance : L'efficacité du code et la journalisation minimale garantissent que le collecteur peut gérer des centaines de demandes par minute avec une latence minimale.
Vue d'ensemble : Cette fondation soutient des améliorations futures—comme le stockage des journaux d'événements, les alertes d'échec et la visualisation de l'interface utilisateur—posant les bases d'une solution d'archivage d'e-mails évolutive et auditable.
Points forts des Q&A
Quel est l'objectif de ce projet ?
Créer un système d'archivage d'emails automatisé qui stocke les corps des messages dans Amazon S3 tout en conservant des métadonnées consultables dans une base de données MySQL.
Pourquoi utiliser la fonctionnalité Archive de SparkPost ?
Il vous permet de générer des copies exactes des e-mails sortants, en préservant leur structure et les données de suivi pour la conformité et la révision.
Comment chaque email archivé est-il lié à son message d'origine ?
Un UID unique est intégré à la fois dans le corps de l'email et les métadonnées, permettant un référencement croisé précis entre les copies originales et archivées.
Pourquoi utiliser S3 pour le stockage ?
S3 offre des options de stockage évolutives et de gestion du cycle de vie (comme Glacier), ce qui le rend rentable pour la conservation à long terme des e-mails.
Que stocke la base de données MySQL ?
Il stocke des champs de métadonnées consultables - comme la ligne d'objet, l'expéditeur, les horodatages et le nom de fichier S3 - permettant une requête et une récupération efficaces.
Quels sont les prochaines étapes de développement ?
Ajout du suivi des événements de journalisation, du rapport d'erreurs automatisé, d'un collecteur simplifié et d'une interface utilisateur pour visualiser ou renvoyer des e-mails archivés.
Dans ce blog, je vais décrire le processus que j'ai suivi pour stocker le corps de l'e-mail sur S3 (Service de Stockage Simple d'Amazon) et les données auxiliaires dans une table MySQL pour un référencement croisé facile. En fin de compte, c'est le point de départ pour la base de code qui inclura une application permettant une recherche facile des e-mails archivés, puis l'affichage de ces e-mails avec les données d'événements (journal). Le code de ce projet peut être trouvé dans le repository GitHub suivant : https://github.com/jeff-goldstein/PHPArchivePlatform.
Bien que je vais utiliser S3 et MySQL dans ce projet, ces technologies ne sont en aucun cas les seules qui peuvent être utilisées pour construire une plateforme d'archivage, mais étant donné leur omniprésence, je pensais qu'elles étaient un bon choix pour ce projet. Dans un système à grande échelle et à haut volume, j'utiliserais une base de données plus performante que MySQL, mais pour ce projet d'exemple, MySQL est parfait. Pour les organisations envisageant PostgreSQL comme choix de base de données d'archivage, la mise en œuvre de procédures de sauvegarde et de restauration adéquates est essentielle pour maintenir l'intégrité des données dans les systèmes de production.
J'ai détaillé ci-dessous les étapes que j'ai prises dans cette première phase du projet :
Création de l'e-mail en double pour l'archivage
Utiliser les fonctionnalités d'Archiving et Inbound Relay de SparkPost pour envoyer une copie de l'e-mail original à SparkPost pour traitement dans une structure JSON, puis envoyée à un collecteur de webhook (application)
Démanteler la structure JSON pour obtenir les composants nécessaires
Envoyer le corps de l'e-mail à S3 pour stockage
Enregistrer une entrée dans MySQL pour chaque e-mail pour le référencement croisé
Créer un Duplicate de l'Email
Obtention de la version Archive
Pour obtenir une copie d'un email pour archivage, vous devez suivre les étapes suivantes :
Créer un sous-domaine vers lequel vous enverrez tous les e-mails (en double) d'archive
Définissez les enregistrements DNS appropriés pour que tous les e-mails envoyés à ce sous-domaine soient dirigés vers SparkPost
Créer un domaine entrant dans SparkPost
Créer un webhook entrant dans SparkPost
Créer une application (collecteur) pour recevoir le flux de données du webhook SparkPost
Les deux liens suivants peuvent être utilisés pour vous guider tout au long de ce processus :
Documentation technique SparkPost : Enabling Inbound Email Relaying & Relay Webhooks
De plus, le blog que j'ai écrit l'année dernière, Archiving Emails: A How-To Guide for Tracking Sent Mail vous guidera dans la création de la transmission entrante avec SparkPost
* Note : depuis octobre 2018, la fonctionnalité Archive ne fonctionne que lorsqu'on envoie des e-mails en utilisant une connexion SMTP à SparkPost, l'API RESTful ne prend pas en charge cette fonctionnalité. Cela ne pose probablement pas de problème car la plupart des e-mails qui nécessitent ce niveau de contrôle d'audit ont tendance à être des e-mails personnalisés qui sont entièrement construits par une application backend avant que l'envoi de l'e-mail ne soit nécessaire.
Obtention de l'email en double dans une structure JSON
Stockage de l'email dupliqué dans S3
Stockage des Meta Data dans MySQL
Nous avons récupéré toutes les données nécessaires à une étape précédente, donc l'étape du stockage est facile. Dans cette première phase, j'ai choisi de construire une table avec les champs suivants:
Champs de Métadonnées MySQL
Champ | Objectif |
Date/heure (auto) | Horodatage lorsque l'entrée a été enregistrée |
Adresse RCPT_TO | Adresse email cible pour le message archivé |
Horodatage de l'en-tête DATE | Heure d'envoi d'origine de l'email |
En-tête SUBJECT | Ligne de sujet pour l'indexation et la recherche |
En-tête FROM | Identifiant de l'expéditeur pour la recherche |
Répertoire S3 | Chemin du répertoire à l'intérieur du seau S3 |
Nom de fichier S3 | Fichier .eml unique stocké dans S3 |
La fonction appelée, MySQLLog, dans le fichier d'application upload.php, passe par les étapes nécessaires pour ouvrir le lien vers MySQL, injecter la nouvelle ligne, tester les résultats et fermer le lien. J'ajoute une autre étape par précaution, qui est de consigner ces données dans un fichier texte. Devrais-je faire beaucoup plus de journalisation pour les erreurs ? Oui. Mais je veux garder ce code léger pour lui permettre de fonctionner extrêmement rapidement. Parfois, ce code sera appelé des centaines de fois par minute et doit être aussi efficace que possible. Dans les futures mises à jour, j'ajouterai du code auxiliaire qui traitera les échecs et enverra par email ces échecs à un administrateur pour surveillance.
En résumé
Donc, en quelques étapes assez faciles, nous avons pu parcourir la première phase de la création d'un système d'archivage des e-mails robuste qui conserve le duplicata de l'email dans S3 et croise les données dans une table MySQL. Cela nous fournira une base pour le reste du projet qui sera abordé dans plusieurs publications futures.
Dans les futures révisions de ce projet, je m'attends à :
Stocker tous les événements de journal de l'email original
Envoyer les erreurs de stockage à un administrateur lorsqu'un échec de téléchargement ou d'enregistrement se produit
Minimiser la complexité du collecteur.
Ajouter une interface utilisateur pour visualiser toutes les données
Prendre en charge la possibilité de renvoyer l'email
En attendant, j'espère que ce projet a été intéressant et utile pour vous ; bon envoi.



