Bauen eines E-Mail-Archivierungssystems: Speicherung des E-Mail-Inhalts
·
04.03.2019

Wichtige Erkenntnisse
Zweck: Dieser Beitrag beschreibt die erste Phase des Aufbaus eines E-Mail-Archivierungssystems unter Verwendung von SparkPost, Amazon S3 und MySQL. Es wird erklärt, wie E-Mails dupliziert, erfasst und für langfristigen Zugriff und Compliance gespeichert werden können.
Kernidee: Das System speichert automatisch den rohen E-Mail-Körper (rfc822-Format) in S3 und protokolliert Metadaten (Betreff, Absender, Zeitstempel usw.) in MySQL, um schnelles Suchen und Abrufen zu ermöglichen.
Abgedeckte Grundlagen:
Erstellen von Duplikaten zur Archivierung: Verwenden Sie die Archive feature von SparkPost, um identische Kopien ausgehender E-Mails an eine festgelegte Archivadresse zu senden und so sicherzustellen, dass der Körper und die Tracking-Links identisch bleiben.
Datenbindung über UID: Betten Sie eine eindeutige Kennung (UID) sowohl in den E-Mail-Körper als auch in die X-MSYS-API-Metadaten ein, um die Original- und Archivnachrichten zu verknüpfen.
Eingangsverarbeitung: Konfigurieren Sie eine eingehende Domain und einen Webhook in SparkPost, um die archivierten E-Mail-JSON-Nutzdaten über einen Anwendungskollektor zu empfangen.
Speichern von E-Mails in S3: Laden Sie den analysierten rfc822-Körper in einen S3-Bucket hoch und verwenden Sie Lebenszyklusregeln (z.B. Übergang zu Glacier nach einem Jahr), um die Speicherkosten zu senken.
Protokollierung von Metadaten in MySQL: Speichern Sie Schlüsselbereiche wie RCPT_TO, FROM, SUBJECT und den S3-Dateinamen für die Suchindizierung und zukünftiges Abrufen.
Leistungsüberlegungen: Code-Effizienz und minimales Logging stellen sicher, dass der Kollektor Hunderte von Anfragen pro Minute mit minimaler Latenz verarbeiten kann.
Gesamtbild: Diese Grundlage unterstützt zukünftige Erweiterungen—wie Protokollereignisspeicherung, Fehlermeldungen und UI-Visualisierung—und legt den Grundstein für eine skalierbare, prüfbare E-Mail-Archivlösung.
Q&A Highlights
Was ist das Ziel dieses Projekts?
Um ein automatisiertes E-Mail-Archivierungssystem zu erstellen, das Nachrichteninhalte in Amazon S3 speichert und gleichzeitig durchsuchbare Metadaten in einer MySQL-Datenbank beibehält.
Warum die Archive-Funktion von SparkPost verwenden?
Es ermöglicht Ihnen, exakte Duplikate von ausgehenden E-Mails zu erstellen, wobei deren Struktur und Tracking-Daten für Compliance und Überprüfung erhalten bleiben.
Wie ist jede archivierte E-Mail mit ihrer ursprünglichen Nachricht verknüpft?
Eine eindeutige UID ist sowohl in den E-Mail-Text als auch in die Metadaten eingebettet, wodurch eine genaue Querverweisung zwischen den Original- und den archivierten Kopien ermöglicht wird.
Warum S3 für die Speicherung verwenden?
S3 bietet skalierbare Speicher- und Lebenszyklusmanagementoptionen (wie Glacier), was es für die langfristige E-Mail-Aufbewahrung kosteneffektiv macht.
Was speichert die MySQL-Datenbank?
Es speichert durchsuchbare Metadatenfelder—wie Betreffzeile, Absender, Zeitstempel und den S3-Dateinamen—und ermöglicht eine effiziente Abfrage und Abruf.
Was sind die nächsten Entwicklungsschritte?
Log-Ereignisverfolgung, automatisierte Fehlerberichterstattung, einen vereinfachten Collector und eine Benutzeroberfläche zum Anzeigen oder erneuten Senden archivierter E-Mails hinzufügen.
In diesem Blog werde ich den Prozess beschreiben, den ich durchlaufen habe, um den Körper der E-Mail in S3 (Amazons Simple Store Service) und ergänzende Daten in eine MySQL-Tabelle zur einfachen Querverweisspeicherung zu speichern. Letztendlich ist dies der Ausgangspunkt für die Codebasis, die eine Anwendung umfassen wird, die das einfache Durchsuchen archivierter E-Mails und das anschließende Anzeigen dieser E-Mails zusammen mit den Ereignisdaten (Protokolldaten) ermöglicht. Der Code für dieses Projekt ist im folgenden GitHub-Repository zu finden: https://github.com/jeff-goldstein/PHPArchivePlatform.
Obwohl ich in diesem Projekt S3 und MySQL verwenden werde, sind dies keineswegs die einzigen Technologien, die zum Aufbau einer Archivierungsplattform verwendet werden können, aber angesichts ihrer Allgegenwart dachte ich, dass sie eine gute Wahl für dieses Projekt wären. In einem vollskaligen Hochleistungssystem würde ich eine leistungsfähigere Datenbank als MySQL verwenden, aber für dieses Musterprojekt ist MySQL perfekt. Für Organisationen, die PostgreSQL als ihre Archivierungsdatenbankwahl in Betracht ziehen, ist die Implementierung von ordnungsgemäßen Backup- und Wiederherstellungsverfahren entscheidend für die Aufrechterhaltung der Datenintegrität in Produktionssystemen.
Ich habe unten die Schritte im ersten Abschnitt des Projekts detailliert aufgelistet:
Erstellen der doppelten E-Mail zur Archivierung
Verwenden Sie SparkPosts Archiving- und Inbound-Relay-Funktionen, um eine Kopie der ursprünglichen E-Mail zurück zu SparkPost zu senden, um sie in eine JSON-Struktur zu verarbeiten, die dann an einen Webhook-Collector (Anwendung) gesendet wird
Zerlegen Sie die JSON-Struktur, um die notwendigen Komponenten zu erhalten
Senden Sie den Körper der E-Mail zur Speicherung an S3
Protokollieren Sie einen Eintrag in MySQL für jede E-Mail zur Querverweisspeicherung
Erstellen eines Duplicate der Email
Erhalten der Archive Version
Um eine Kopie einer E-Mail für das Archiv zu erhalten, müssen Sie die folgenden Schritte unternehmen:
Erstellen Sie eine Subdomain, an die Sie alle Archiv-E-Mails (Duplikat) senden werden
Setzen Sie die entsprechenden DNS-Einträge, damit alle E-Mails an diese Subdomain an SparkPost gesendet werden
Erstellen Sie eine eingehende Domain in SparkPost
Erstellen Sie einen eingehenden Webhook in SparkPost
Erstellen Sie eine Anwendung (Sammler), um den SparkPost-Webhook-Datenstrom zu empfangen
Die folgenden zwei Links können genutzt werden, um Ihnen durch diesen Prozess zu helfen:
SparkPost technische Dokumentation: Enabling Inbound Email Relaying & Relay Webhooks
Außerdem wird der Blog, den ich letztes Jahr schrieb, Archiving Emails: A How-To Guide for Tracking Sent Mail, Sie durch die Erstellung des eingehenden Relays in SparkPost führen
* Hinweis: Stand Oktober 2018 funktioniert die Archivfunktion nur beim Senden von E-Mails über eine SMTP-Verbindung zu SparkPost, die RESTful-API unterstützt diese Funktion nicht. Das ist wahrscheinlich kein Problem, da die meisten E-Mails, die dieses Maß an Audit-Kontrolle benötigen, personalisierte E-Mails sind, die vollständig von einer Backend-Anwendung erstellt wurden, bevor die E-Mail-Zustellung erforderlich ist.
Erhalten der doppelten E-Mail in einer JSON-Struktur
Das Duplikat der E-Mail in S3 speichern
Speichern der Meta-Daten in MySQL
Wir haben alle notwendigen Daten in einem vorherigen Schritt erfasst, daher ist der Schritt der Speicherung einfach. In dieser ersten Phase habe ich mich entschieden, eine Tabelle mit den folgenden Feldern zu erstellen:
MySQL-Metadatenfelder
Feld | Zweck |
Datum/Uhrzeit (automatisch) | Zeitstempel, wann der Eintrag protokolliert wurde |
RCPT_TO-Adresse | Ziel-E-Mail-Adresse für die archivierte Nachricht |
DATUM-Header-Zeitstempel | Ursprüngliche Sendezeit der E-Mail |
BETREFF-Header | Betreffzeile für Indizierung und Suche |
VON-Header | Absenderkennzeichnung für Nachschlagezwecke |
S3-Verzeichnis | Verzeichnispfad innerhalb des S3-Buckets |
S3-Dateiname | Einzigartige .eml-Datei, die in S3 gespeichert ist |
Die Funktion namens MySQLLog innerhalb der upload.php-Anwendungsdatei durchläuft die notwendigen Schritte, um die Verbindung zu MySQL zu öffnen, die neue Zeile einzufügen, die Ergebnisse zu testen und die Verbindung zu schließen. Ich füge einen weiteren Schritt hinzu, um diese Daten aus Vorsichtsgründen in einer Textdatei zu protokollieren. Sollte ich viel mehr Protokollierung für Fehler machen? Ja. Aber ich möchte diesen Code schlank halten, um eine extrem schnelle Ausführung zu ermöglichen. Dieser Code wird manchmal hunderte Male pro Minute aufgerufen und muss so effizient wie möglich sein. In zukünftigen Updates werde ich zusätzlichen Code hinzufügen, der Fehler verarbeitet und diese an einen Administrator zur Überwachung per E-Mail versendet.
Abschließend
So konnten wir in ein paar ziemlich einfachen Schritten die erste Phase des Aufbaus eines robusten E-Mail-Archivierungssystems durchlaufen, das die E-Mail-Doppel in S3 hält und Daten in einer MySQL-Tabelle abgleicht. Dies wird uns eine Grundlage für den Rest des Projekts geben, das in mehreren zukünftigen Beiträgen angegangen wird.
In zukünftigen Überarbeitungen dieses Projekts würde ich erwarten:
Alle Protokollereignisse der Original-E-Mail speichern
Speicherfehler an einen Administrator senden, wenn ein Hochladen oder Protokollieren fehlschlägt
Die Komplexität des Sammlers minimieren.
Eine Benutzeroberfläche zum Anzeigen aller Daten hinzufügen
Die Möglichkeit unterstützen, die E-Mail erneut zu senden
Inzwischen hoffe ich, dass dieses Projekt für Sie interessant und hilfreich war; viel Spaß beim Versenden.



