Bauen eines E-Mail-Archivierungssystems: Speicherung des E-Mail-Inhalts
Vogel
04.03.2019
1 min read

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
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
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
In SparkPost ist der beste Weg, eine E-Mail zu archivieren, eine identische Kopie der E-Mail zu erstellen, die speziell für Archivierungszwecke entworfen wurde. Dies wird durch die Verwendung der Archive-Funktion von SparkPost erreicht. Die Archivfunktion von SparkPost gibt dem Absender die Möglichkeit, eine Kopie der E-Mail an eine oder mehrere E-Mail-Adressen zu senden. Diese Kopie verwendet die gleichen Tracking- und Öffnungslinks wie das Original. Die SparkPost-Dokumentation definiert die Archivfunktion folgendermaßen:
Empfänger in der Archivliste erhalten eine exakte Kopie der Nachricht, die an die RCPT TO-Adresse gesendet wurde. Insbesondere werden alle kodierten Links, die für den RCPT TO-Empfänger bestimmt sind, in den Archivnachrichten identisch sein.
Der einzige Unterschied zwischen dieser Archivkopie und der ursprünglichen RCPT TO-E-Mail besteht darin, dass einige der Header unterschiedlich sein werden, da die Zieladresse für die Archivierungsmail anders ist, aber der E-Mail-Body wird eine exakte Kopie sein!
Wenn Sie eine tiefere Erklärung wünschen, finden Sie hier einen Link zur SparkPost-Dokumentation zum Erstellen von Duplikaten (oder Archive-) Kopien einer E-Mail. Beispiel X-MSYS-API-Header für dieses Projekt werden später in diesem Blog gezeigt.
Es gibt einen Vorbehalt zu diesem Ansatz; während alle Ereignisinformationen in der ursprünglichen E-Mail sowohl durch eine transmission_id als auch eine message_id verknüpft sind, gibt es keine Informationen im eingehenden Relayereignis (dem Mechanismus zum Erhalten und Verbreiten der Archive-E-Mail) für die doppelte E-Mail, die zurück zu einem dieser beiden IDs und damit zu den Informationen der ursprünglichen E-Mail zurückverweist. Das bedeutet, dass wir Daten im E-Mail-Body und im Header der ursprünglichen E-Mail platzieren müssen, um alle SparkPost-Daten von der ursprünglichen und der Archiv-E-Mail zu verknüpfen.
Um den Code zu erstellen, der in den E-Mail-Body eingefügt wird, habe ich den folgenden Prozess in der E-Mail-Erstellungsanwendung verwendet.
Irgendwo im E-Mail-Body habe ich den folgenden Eingabewert eingefügt:<input name="ArchiveCode" type="hidden" value="<<UID>>">
Dann habe ich einen eindeutigen Code erstellt und das Feld <<UID>> ersetzt: $uid = md5(uniqid(rand(), true)); $emailBody = str_replace(“<<UID>>,$uid,$emailBody);
Hier ist ein Beispielausgabe:
<input name="ArchiveCode" type="hidden" value="00006365263145">
Als nächstes habe ich sichergestellt, dass ich das $UID zum meta_data-Block des X-MSYS-API-Headers hinzugefügt habe. Dieser Schritt stellt sicher, dass die UID in jedes Ereignisausgabe der ursprünglichen E-Mail eingebettet ist:
X-MSYS-API: { "campaign_id": "<my_campaign>", "metadata": { "UID": "<UID>" }, "archive": [ { "email": "archive@geekwithapersonality.com" } ], "options": { "open_tracking": false, "click_tracking": false, "transactional": false, "ip_pool": "<my_ip_pool>" } }
Jetzt haben wir eine Möglichkeit, alle Daten von der ursprünglichen E-Mail mit dem E-Mail-Body der Archivkopie zu verknüpfen.
In SparkPost ist der beste Weg, eine E-Mail zu archivieren, eine identische Kopie der E-Mail zu erstellen, die speziell für Archivierungszwecke entworfen wurde. Dies wird durch die Verwendung der Archive-Funktion von SparkPost erreicht. Die Archivfunktion von SparkPost gibt dem Absender die Möglichkeit, eine Kopie der E-Mail an eine oder mehrere E-Mail-Adressen zu senden. Diese Kopie verwendet die gleichen Tracking- und Öffnungslinks wie das Original. Die SparkPost-Dokumentation definiert die Archivfunktion folgendermaßen:
Empfänger in der Archivliste erhalten eine exakte Kopie der Nachricht, die an die RCPT TO-Adresse gesendet wurde. Insbesondere werden alle kodierten Links, die für den RCPT TO-Empfänger bestimmt sind, in den Archivnachrichten identisch sein.
Der einzige Unterschied zwischen dieser Archivkopie und der ursprünglichen RCPT TO-E-Mail besteht darin, dass einige der Header unterschiedlich sein werden, da die Zieladresse für die Archivierungsmail anders ist, aber der E-Mail-Body wird eine exakte Kopie sein!
Wenn Sie eine tiefere Erklärung wünschen, finden Sie hier einen Link zur SparkPost-Dokumentation zum Erstellen von Duplikaten (oder Archive-) Kopien einer E-Mail. Beispiel X-MSYS-API-Header für dieses Projekt werden später in diesem Blog gezeigt.
Es gibt einen Vorbehalt zu diesem Ansatz; während alle Ereignisinformationen in der ursprünglichen E-Mail sowohl durch eine transmission_id als auch eine message_id verknüpft sind, gibt es keine Informationen im eingehenden Relayereignis (dem Mechanismus zum Erhalten und Verbreiten der Archive-E-Mail) für die doppelte E-Mail, die zurück zu einem dieser beiden IDs und damit zu den Informationen der ursprünglichen E-Mail zurückverweist. Das bedeutet, dass wir Daten im E-Mail-Body und im Header der ursprünglichen E-Mail platzieren müssen, um alle SparkPost-Daten von der ursprünglichen und der Archiv-E-Mail zu verknüpfen.
Um den Code zu erstellen, der in den E-Mail-Body eingefügt wird, habe ich den folgenden Prozess in der E-Mail-Erstellungsanwendung verwendet.
Irgendwo im E-Mail-Body habe ich den folgenden Eingabewert eingefügt:<input name="ArchiveCode" type="hidden" value="<<UID>>">
Dann habe ich einen eindeutigen Code erstellt und das Feld <<UID>> ersetzt: $uid = md5(uniqid(rand(), true)); $emailBody = str_replace(“<<UID>>,$uid,$emailBody);
Hier ist ein Beispielausgabe:
<input name="ArchiveCode" type="hidden" value="00006365263145">
Als nächstes habe ich sichergestellt, dass ich das $UID zum meta_data-Block des X-MSYS-API-Headers hinzugefügt habe. Dieser Schritt stellt sicher, dass die UID in jedes Ereignisausgabe der ursprünglichen E-Mail eingebettet ist:
X-MSYS-API: { "campaign_id": "<my_campaign>", "metadata": { "UID": "<UID>" }, "archive": [ { "email": "archive@geekwithapersonality.com" } ], "options": { "open_tracking": false, "click_tracking": false, "transactional": false, "ip_pool": "<my_ip_pool>" } }
Jetzt haben wir eine Möglichkeit, alle Daten von der ursprünglichen E-Mail mit dem E-Mail-Body der Archivkopie zu verknüpfen.
In SparkPost ist der beste Weg, eine E-Mail zu archivieren, eine identische Kopie der E-Mail zu erstellen, die speziell für Archivierungszwecke entworfen wurde. Dies wird durch die Verwendung der Archive-Funktion von SparkPost erreicht. Die Archivfunktion von SparkPost gibt dem Absender die Möglichkeit, eine Kopie der E-Mail an eine oder mehrere E-Mail-Adressen zu senden. Diese Kopie verwendet die gleichen Tracking- und Öffnungslinks wie das Original. Die SparkPost-Dokumentation definiert die Archivfunktion folgendermaßen:
Empfänger in der Archivliste erhalten eine exakte Kopie der Nachricht, die an die RCPT TO-Adresse gesendet wurde. Insbesondere werden alle kodierten Links, die für den RCPT TO-Empfänger bestimmt sind, in den Archivnachrichten identisch sein.
Der einzige Unterschied zwischen dieser Archivkopie und der ursprünglichen RCPT TO-E-Mail besteht darin, dass einige der Header unterschiedlich sein werden, da die Zieladresse für die Archivierungsmail anders ist, aber der E-Mail-Body wird eine exakte Kopie sein!
Wenn Sie eine tiefere Erklärung wünschen, finden Sie hier einen Link zur SparkPost-Dokumentation zum Erstellen von Duplikaten (oder Archive-) Kopien einer E-Mail. Beispiel X-MSYS-API-Header für dieses Projekt werden später in diesem Blog gezeigt.
Es gibt einen Vorbehalt zu diesem Ansatz; während alle Ereignisinformationen in der ursprünglichen E-Mail sowohl durch eine transmission_id als auch eine message_id verknüpft sind, gibt es keine Informationen im eingehenden Relayereignis (dem Mechanismus zum Erhalten und Verbreiten der Archive-E-Mail) für die doppelte E-Mail, die zurück zu einem dieser beiden IDs und damit zu den Informationen der ursprünglichen E-Mail zurückverweist. Das bedeutet, dass wir Daten im E-Mail-Body und im Header der ursprünglichen E-Mail platzieren müssen, um alle SparkPost-Daten von der ursprünglichen und der Archiv-E-Mail zu verknüpfen.
Um den Code zu erstellen, der in den E-Mail-Body eingefügt wird, habe ich den folgenden Prozess in der E-Mail-Erstellungsanwendung verwendet.
Irgendwo im E-Mail-Body habe ich den folgenden Eingabewert eingefügt:<input name="ArchiveCode" type="hidden" value="<<UID>>">
Dann habe ich einen eindeutigen Code erstellt und das Feld <<UID>> ersetzt: $uid = md5(uniqid(rand(), true)); $emailBody = str_replace(“<<UID>>,$uid,$emailBody);
Hier ist ein Beispielausgabe:
<input name="ArchiveCode" type="hidden" value="00006365263145">
Als nächstes habe ich sichergestellt, dass ich das $UID zum meta_data-Block des X-MSYS-API-Headers hinzugefügt habe. Dieser Schritt stellt sicher, dass die UID in jedes Ereignisausgabe der ursprünglichen E-Mail eingebettet ist:
X-MSYS-API: { "campaign_id": "<my_campaign>", "metadata": { "UID": "<UID>" }, "archive": [ { "email": "archive@geekwithapersonality.com" } ], "options": { "open_tracking": false, "click_tracking": false, "transactional": false, "ip_pool": "<my_ip_pool>" } }
Jetzt haben wir eine Möglichkeit, alle Daten von der ursprünglichen E-Mail mit dem E-Mail-Body der Archivkopie zu verknüpfen.
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.
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.
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
In der ersten Phase dieses Projekts speichere ich nur das rfc822-E-Mail-Format in S3 und einige allgemeine Beschreibungsfelder in einer SQL-Tabelle zur Suche. Da SparkPost die E-Mail-Daten in einer JSON-Struktur über Webhook-Datenströme an meine Archivierungsplattform sendet, habe ich eine Anwendung entwickelt (oft als Collector bezeichnet), die den Relay_Webhook-Datenstrom akzeptiert.
Jedes Paket vom SparkPost Relay_Webhook enthält die Informationen einer doppelten E-Mail auf einmal, sodass das Aufschlüsseln der JSON-Struktur in die gezielten Komponenten für dieses Projekt recht einfach ist. In meinem PHP-Code war das Abrufen der im rfc822-Format formatierten E-Mail so einfach wie die folgenden wenigen Codezeilen:
if ($_SERVER['REQUEST_METHOD'] === 'POST') { $body = file_get_contents("php://input"); $fields = json_decode($body, true); $rfc822body = $fields[0]['msys']['relay_message']['content']['email_rfc822']; $htmlbody = $fields[0]['msys']['relay_message']['content']['html']; $headers = $fields[0]['msys']['relay_message']['content']['headers']; }
Einige der Informationen, die ich in meiner SQL-Tabelle speichern möchte, befinden sich in einem Array von Header-Feldern. Also habe ich eine kleine Funktion geschrieben, die das Header-Array akzeptiert und durch das Array schleift, um die Daten zu erhalten, die ich speichern möchte:
function get_important_headers($headers, &$original_to, &$headerDate, &$subject, &$from) { foreach ($headers as $headerGroup) { foreach ($headerGroup as $key => $value) { if ($key === 'To') { $original_to = $value; } elseif ($key === 'Date') { $headerDate = $value; } elseif ($key === 'Subject') { $subject = $value; } elseif ($key === 'From') { $from = $value; } } } }
Jetzt, da ich die Daten habe, bin ich bereit, den Body in S3 zu speichern.
In der ersten Phase dieses Projekts speichere ich nur das rfc822-E-Mail-Format in S3 und einige allgemeine Beschreibungsfelder in einer SQL-Tabelle zur Suche. Da SparkPost die E-Mail-Daten in einer JSON-Struktur über Webhook-Datenströme an meine Archivierungsplattform sendet, habe ich eine Anwendung entwickelt (oft als Collector bezeichnet), die den Relay_Webhook-Datenstrom akzeptiert.
Jedes Paket vom SparkPost Relay_Webhook enthält die Informationen einer doppelten E-Mail auf einmal, sodass das Aufschlüsseln der JSON-Struktur in die gezielten Komponenten für dieses Projekt recht einfach ist. In meinem PHP-Code war das Abrufen der im rfc822-Format formatierten E-Mail so einfach wie die folgenden wenigen Codezeilen:
if ($_SERVER['REQUEST_METHOD'] === 'POST') { $body = file_get_contents("php://input"); $fields = json_decode($body, true); $rfc822body = $fields[0]['msys']['relay_message']['content']['email_rfc822']; $htmlbody = $fields[0]['msys']['relay_message']['content']['html']; $headers = $fields[0]['msys']['relay_message']['content']['headers']; }
Einige der Informationen, die ich in meiner SQL-Tabelle speichern möchte, befinden sich in einem Array von Header-Feldern. Also habe ich eine kleine Funktion geschrieben, die das Header-Array akzeptiert und durch das Array schleift, um die Daten zu erhalten, die ich speichern möchte:
function get_important_headers($headers, &$original_to, &$headerDate, &$subject, &$from) { foreach ($headers as $headerGroup) { foreach ($headerGroup as $key => $value) { if ($key === 'To') { $original_to = $value; } elseif ($key === 'Date') { $headerDate = $value; } elseif ($key === 'Subject') { $subject = $value; } elseif ($key === 'From') { $from = $value; } } } }
Jetzt, da ich die Daten habe, bin ich bereit, den Body in S3 zu speichern.
In der ersten Phase dieses Projekts speichere ich nur das rfc822-E-Mail-Format in S3 und einige allgemeine Beschreibungsfelder in einer SQL-Tabelle zur Suche. Da SparkPost die E-Mail-Daten in einer JSON-Struktur über Webhook-Datenströme an meine Archivierungsplattform sendet, habe ich eine Anwendung entwickelt (oft als Collector bezeichnet), die den Relay_Webhook-Datenstrom akzeptiert.
Jedes Paket vom SparkPost Relay_Webhook enthält die Informationen einer doppelten E-Mail auf einmal, sodass das Aufschlüsseln der JSON-Struktur in die gezielten Komponenten für dieses Projekt recht einfach ist. In meinem PHP-Code war das Abrufen der im rfc822-Format formatierten E-Mail so einfach wie die folgenden wenigen Codezeilen:
if ($_SERVER['REQUEST_METHOD'] === 'POST') { $body = file_get_contents("php://input"); $fields = json_decode($body, true); $rfc822body = $fields[0]['msys']['relay_message']['content']['email_rfc822']; $htmlbody = $fields[0]['msys']['relay_message']['content']['html']; $headers = $fields[0]['msys']['relay_message']['content']['headers']; }
Einige der Informationen, die ich in meiner SQL-Tabelle speichern möchte, befinden sich in einem Array von Header-Feldern. Also habe ich eine kleine Funktion geschrieben, die das Header-Array akzeptiert und durch das Array schleift, um die Daten zu erhalten, die ich speichern möchte:
function get_important_headers($headers, &$original_to, &$headerDate, &$subject, &$from) { foreach ($headers as $headerGroup) { foreach ($headerGroup as $key => $value) { if ($key === 'To') { $original_to = $value; } elseif ($key === 'Date') { $headerDate = $value; } elseif ($key === 'Subject') { $subject = $value; } elseif ($key === 'From') { $from = $value; } } } }
Jetzt, da ich die Daten habe, bin ich bereit, den Body in S3 zu speichern.
Das Duplikat der E-Mail in S3 speichern
Es tut mir leid, Sie enttäuschen zu müssen, aber ich werde kein Schritt-für-Schritt-Tutorial zum Erstellen eines S3-Buckets zur Speicherung der E-Mail geben, noch werde ich beschreiben, wie der notwendige Zugangsschlüssel erstellt wird, den Sie in Ihrer Anwendung zum Hochladen von Inhalten in Ihren Bucket benötigen; es gibt bessere Tutorials zu diesem Thema, als ich je schreiben könnte. Hier sind ein paar Artikel, die hilfreich sein könnten:
https://docs.aws.amazon.com/quickstarts/latest/s3backup/step-1-create-bucket.html
https://aws.amazon.com/blogs/security/wheres-my-secret-access-key/
Was ich tun werde, ist, einige der Einstellungen zu erläutern, die ich für ein solches Projekt ausgewählt habe.
Access Control. Sie müssen nicht nur die Sicherheit für den Bucket festlegen, sondern auch die Berechtigungen für die Objekte selbst. In meinem Projekt verwende ich eine sehr offene Richtlinie des öffentlichen Lesens, da die Beispieldaten nicht persönlich sind und ich einen einfachen Zugang zu den Daten wollte. Sie möchten wahrscheinlich eine viel strengere Reihe von ACL-Richtlinien. Hier ist ein interessanter Artikel zu ACL-Einstellungen: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html
Archiving the Archive. In S3 gibt es etwas, das Lifecycle Management genannt wird. Dies ermöglicht Ihnen, Daten von einer S3-Speicherklasse auf eine andere zu verschieben. Die verschiedenen Speicherklassen repräsentieren den Grad des Zugriffs, den Sie auf die gespeicherten Daten benötigen, mit niedrigeren Kosten, die mit dem Speicher verbunden sind, auf den Sie am wenigsten zugreifen. Eine gute Erklärung der verschiedenen Klassen und der Übergänge zwischen ihnen finden Sie in einem AWS-Leitfaden namens Transitioning Objects. In meinem Fall habe ich beschlossen, ein Lebenszyklus zu erstellen, der jedes Objekt nach einem Jahr von Standard zu Glacier verschiebt. Der Zugang zu Glacier ist viel günstiger als das Standard S3-Archiv und wird mir Speicherplatzkosten sparen.
Sobald ich den S3-Bucket erstellt und meine Einstellungen vorgenommen habe, ist S3 bereit für mich, die rfc822-konforme E-Mail hochzuladen, die ich aus dem SparkPost Relay Webhook-Datenstrom erhalten habe. Aber bevor ich die rfc822-E-Mail-Payload nach S3 hochlade, muss ich einen eindeutigen Dateinamen erstellen, den ich zum Speichern dieser E-Mail verwenden werde.
Für den eindeutigen Dateinamen werde ich den E-Mail-Body nach der versteckten ID durchsuchen, die die sendende Anwendung in die E-Mail eingefügt hat, und diese ID als Namen der Datei verwenden. Es gibt elegantere Methoden, die connectorId aus dem HTML-Body zu extrahieren, aber aus Einfachheit und Klarheit werde ich den folgenden Code verwenden:
$start = strpos($htmlbody, $inputField); if ($start !== false) { $start = strpos($htmlbody, 'value="', $start); if ($start !== false) { $start += 7; // Move past 'value="' $end = strpos($htmlbody, '"', $start); if ($end !== false) { $length = $end - $start; $UID = substr($htmlbody, $start, $length); } } }
* wir gehen davon aus, dass $inputField den Wert “ArchiveCode” enthält und in meiner config.php-Datei gefunden wurde.
Mit der UID können wir dann den Dateinamen erstellen, der in S3 verwendet wird:
$fileName = $ArchiveDirectory . '/' . $UID . '.eml';
Nun kann ich meine Verbindung zu S3 öffnen und die Datei hochladen. Wenn Sie sich die s3.php-Datei im GitHub-Repository ansehen, werden Sie feststellen, dass es nur sehr wenig Code benötigt, um die Datei hochzuladen.
Mein letzter Schritt ist es, diesen Eintrag in die MYSQL-Tabelle zu protokollieren.
Es tut mir leid, Sie enttäuschen zu müssen, aber ich werde kein Schritt-für-Schritt-Tutorial zum Erstellen eines S3-Buckets zur Speicherung der E-Mail geben, noch werde ich beschreiben, wie der notwendige Zugangsschlüssel erstellt wird, den Sie in Ihrer Anwendung zum Hochladen von Inhalten in Ihren Bucket benötigen; es gibt bessere Tutorials zu diesem Thema, als ich je schreiben könnte. Hier sind ein paar Artikel, die hilfreich sein könnten:
https://docs.aws.amazon.com/quickstarts/latest/s3backup/step-1-create-bucket.html
https://aws.amazon.com/blogs/security/wheres-my-secret-access-key/
Was ich tun werde, ist, einige der Einstellungen zu erläutern, die ich für ein solches Projekt ausgewählt habe.
Access Control. Sie müssen nicht nur die Sicherheit für den Bucket festlegen, sondern auch die Berechtigungen für die Objekte selbst. In meinem Projekt verwende ich eine sehr offene Richtlinie des öffentlichen Lesens, da die Beispieldaten nicht persönlich sind und ich einen einfachen Zugang zu den Daten wollte. Sie möchten wahrscheinlich eine viel strengere Reihe von ACL-Richtlinien. Hier ist ein interessanter Artikel zu ACL-Einstellungen: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html
Archiving the Archive. In S3 gibt es etwas, das Lifecycle Management genannt wird. Dies ermöglicht Ihnen, Daten von einer S3-Speicherklasse auf eine andere zu verschieben. Die verschiedenen Speicherklassen repräsentieren den Grad des Zugriffs, den Sie auf die gespeicherten Daten benötigen, mit niedrigeren Kosten, die mit dem Speicher verbunden sind, auf den Sie am wenigsten zugreifen. Eine gute Erklärung der verschiedenen Klassen und der Übergänge zwischen ihnen finden Sie in einem AWS-Leitfaden namens Transitioning Objects. In meinem Fall habe ich beschlossen, ein Lebenszyklus zu erstellen, der jedes Objekt nach einem Jahr von Standard zu Glacier verschiebt. Der Zugang zu Glacier ist viel günstiger als das Standard S3-Archiv und wird mir Speicherplatzkosten sparen.
Sobald ich den S3-Bucket erstellt und meine Einstellungen vorgenommen habe, ist S3 bereit für mich, die rfc822-konforme E-Mail hochzuladen, die ich aus dem SparkPost Relay Webhook-Datenstrom erhalten habe. Aber bevor ich die rfc822-E-Mail-Payload nach S3 hochlade, muss ich einen eindeutigen Dateinamen erstellen, den ich zum Speichern dieser E-Mail verwenden werde.
Für den eindeutigen Dateinamen werde ich den E-Mail-Body nach der versteckten ID durchsuchen, die die sendende Anwendung in die E-Mail eingefügt hat, und diese ID als Namen der Datei verwenden. Es gibt elegantere Methoden, die connectorId aus dem HTML-Body zu extrahieren, aber aus Einfachheit und Klarheit werde ich den folgenden Code verwenden:
$start = strpos($htmlbody, $inputField); if ($start !== false) { $start = strpos($htmlbody, 'value="', $start); if ($start !== false) { $start += 7; // Move past 'value="' $end = strpos($htmlbody, '"', $start); if ($end !== false) { $length = $end - $start; $UID = substr($htmlbody, $start, $length); } } }
* wir gehen davon aus, dass $inputField den Wert “ArchiveCode” enthält und in meiner config.php-Datei gefunden wurde.
Mit der UID können wir dann den Dateinamen erstellen, der in S3 verwendet wird:
$fileName = $ArchiveDirectory . '/' . $UID . '.eml';
Nun kann ich meine Verbindung zu S3 öffnen und die Datei hochladen. Wenn Sie sich die s3.php-Datei im GitHub-Repository ansehen, werden Sie feststellen, dass es nur sehr wenig Code benötigt, um die Datei hochzuladen.
Mein letzter Schritt ist es, diesen Eintrag in die MYSQL-Tabelle zu protokollieren.
Es tut mir leid, Sie enttäuschen zu müssen, aber ich werde kein Schritt-für-Schritt-Tutorial zum Erstellen eines S3-Buckets zur Speicherung der E-Mail geben, noch werde ich beschreiben, wie der notwendige Zugangsschlüssel erstellt wird, den Sie in Ihrer Anwendung zum Hochladen von Inhalten in Ihren Bucket benötigen; es gibt bessere Tutorials zu diesem Thema, als ich je schreiben könnte. Hier sind ein paar Artikel, die hilfreich sein könnten:
https://docs.aws.amazon.com/quickstarts/latest/s3backup/step-1-create-bucket.html
https://aws.amazon.com/blogs/security/wheres-my-secret-access-key/
Was ich tun werde, ist, einige der Einstellungen zu erläutern, die ich für ein solches Projekt ausgewählt habe.
Access Control. Sie müssen nicht nur die Sicherheit für den Bucket festlegen, sondern auch die Berechtigungen für die Objekte selbst. In meinem Projekt verwende ich eine sehr offene Richtlinie des öffentlichen Lesens, da die Beispieldaten nicht persönlich sind und ich einen einfachen Zugang zu den Daten wollte. Sie möchten wahrscheinlich eine viel strengere Reihe von ACL-Richtlinien. Hier ist ein interessanter Artikel zu ACL-Einstellungen: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html
Archiving the Archive. In S3 gibt es etwas, das Lifecycle Management genannt wird. Dies ermöglicht Ihnen, Daten von einer S3-Speicherklasse auf eine andere zu verschieben. Die verschiedenen Speicherklassen repräsentieren den Grad des Zugriffs, den Sie auf die gespeicherten Daten benötigen, mit niedrigeren Kosten, die mit dem Speicher verbunden sind, auf den Sie am wenigsten zugreifen. Eine gute Erklärung der verschiedenen Klassen und der Übergänge zwischen ihnen finden Sie in einem AWS-Leitfaden namens Transitioning Objects. In meinem Fall habe ich beschlossen, ein Lebenszyklus zu erstellen, der jedes Objekt nach einem Jahr von Standard zu Glacier verschiebt. Der Zugang zu Glacier ist viel günstiger als das Standard S3-Archiv und wird mir Speicherplatzkosten sparen.
Sobald ich den S3-Bucket erstellt und meine Einstellungen vorgenommen habe, ist S3 bereit für mich, die rfc822-konforme E-Mail hochzuladen, die ich aus dem SparkPost Relay Webhook-Datenstrom erhalten habe. Aber bevor ich die rfc822-E-Mail-Payload nach S3 hochlade, muss ich einen eindeutigen Dateinamen erstellen, den ich zum Speichern dieser E-Mail verwenden werde.
Für den eindeutigen Dateinamen werde ich den E-Mail-Body nach der versteckten ID durchsuchen, die die sendende Anwendung in die E-Mail eingefügt hat, und diese ID als Namen der Datei verwenden. Es gibt elegantere Methoden, die connectorId aus dem HTML-Body zu extrahieren, aber aus Einfachheit und Klarheit werde ich den folgenden Code verwenden:
$start = strpos($htmlbody, $inputField); if ($start !== false) { $start = strpos($htmlbody, 'value="', $start); if ($start !== false) { $start += 7; // Move past 'value="' $end = strpos($htmlbody, '"', $start); if ($end !== false) { $length = $end - $start; $UID = substr($htmlbody, $start, $length); } } }
* wir gehen davon aus, dass $inputField den Wert “ArchiveCode” enthält und in meiner config.php-Datei gefunden wurde.
Mit der UID können wir dann den Dateinamen erstellen, der in S3 verwendet wird:
$fileName = $ArchiveDirectory . '/' . $UID . '.eml';
Nun kann ich meine Verbindung zu S3 öffnen und die Datei hochladen. Wenn Sie sich die s3.php-Datei im GitHub-Repository ansehen, werden Sie feststellen, dass es nur sehr wenig Code benötigt, um die Datei hochzuladen.
Mein letzter Schritt ist es, diesen Eintrag in die MYSQL-Tabelle zu protokollieren.
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.
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.
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.
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.
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.



