Erreichen

Grow

Manage

Automate

Erreichen

Grow

Manage

Automate

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

Vogel

04.03.2019

E-Mail

1 min read

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

Vogel

04.03.2019

E-Mail

1 min read

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

In diesem Blog werde ich den Prozess beschreiben, den ich durchlaufen habe, um den Inhalt der E-Mail in S3 (Amazon Simple Storage Service) und zusätzliche Daten in einer MySQL-Tabelle für eine einfache gegenseitige Referenzierung zu speichern.

In diesem Blog werde ich den Prozess beschreiben, den ich durchlaufen habe, um den Körper der E-Mail auf S3 (Amazons Simple Store Service) zu speichern und zusätzliche Daten in eine MySQL-Tabelle für einfache Kreuzverweise einzutragen. Letztendlich ist dies der Ausgangspunkt für den Code, der eine Anwendung beinhalten wird, die eine einfache Suche nach archivierten E-Mails ermöglicht und diese E-Mails zusammen mit den Ereignisprotokolldaten anzeigt. 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 nutzen werde, sind dies keineswegs die einzigen Technologien, die für den Aufbau einer Archivierungsplattform verwendet werden können. Aufgrund ihrer Allgegenwart hielt ich sie jedoch für eine gute Wahl für dieses Projekt. In einem groß angelegten Hochleistungssystem würde ich eine leistungsstärkere Datenbank als MySQL verwenden, aber für dieses Beispielprojekt ist MySQL perfekt. Für Organisationen, die PostgreSQL als ihre Archivierungsdatenbank in Betracht ziehen, ist die Implementierung geeigneter Backup- und Wiederherstellungsverfahren unerlässlich, um die Datenintegrität in Produktionssystemen zu gewährleisten.

Im Folgenden habe ich die Schritte aufgeführt, die ich in dieser ersten Phase des Projekts unternommen habe:

  1. Erstellen der doppelten E-Mail zur Archivierung

  2. Verwenden Sie die Archivierungs- und Eingangs-Relay-Funktionen von SparkPost, um eine Kopie der Original-E-Mail zurück an SparkPost zu senden, um sie in eine JSON-Struktur zu verarbeiten, die dann an einen Webhook-Sammler (Anwendung) gesendet wird

  3. Dismantle der JSON-Struktur, um die notwendigen Komponenten zu erhalten

  4. Den Körper der E-Mail für die Speicherung an S3 senden

  5. Einen Eintrag in MySQL für jede E-Mail für Kreuzreferenzen protokollieren

Erstellen eines Duplicate der Email

In SparkPost ist die beste Möglichkeit, eine E-Mail zu archivieren, eine identische Kopie der E-Mail zu erstellen, die speziell für Archivierungszwecke entwickelt wurde. Dies wird durch die Verwendung der SparkPost-Archivfunktion erreicht. Die Archivfunktion von SparkPost gibt dem Absender die Möglichkeit, ein Duplikat der E-Mail an eine oder mehrere E-Mail-Adressen zu senden.  Dieses Duplikat verwendet dieselben Tracking- und Öffnungslinks wie das Original. Die SparkPost-Dokumentation definiert die Archivfunktion folgendermaßen:

Empfänger in der Archivliste erhalten eine genaue Kopie der Nachricht, die an die RCPT TO-Adresse gesendet wurde. Insbesondere sind alle codierten Links, die für den RCPT TO-Empfänger bestimmt waren, in den Archivnachrichten identisch.

Der einzige Unterschied zwischen dieser Archivkopie und der originalen RCPT TO-E-Mail besteht darin, dass einige der Header unterschiedlich sein werden, da die Zieladresse für die archivierte E-Mail eine andere ist, aber der Inhalt der E-Mail eine exakte Kopie sein wird!

Wenn Sie eine tiefere Erklärung wünschen, hier ist ein Link zur SparkPost-Dokumentation zum Erstellen von Duplikat- (oder Archiv-) Kopien einer E-Mail. Beispiele für X-MSYS-API-Header für dieses Projekt werden später in diesem Blog gezeigt.

Es gibt einen Vorbehalt bei diesem Ansatz: Obwohl alle Ereignisinformationen in der originalen E-Mail sowohl durch eine transmission_id als auch eine message_id verknüpft sind, gibt es keine Informationen im Inbound-Relay-Ereignis (dem Mechanismus zum Abrufen und Verbreiten der Archiv-E-Mail) für die Duplikat-E-Mail, die auf eine dieser beiden IDs und damit die Informationen für die original E-Mail zurückführen. Dies bedeutet, dass wir Daten in den E-Mail-Text und die Kopfzeile der originalen E-Mail einfügen müssen, um alle SparkPost-Daten aus der originalen und der Archiv-E-Mail miteinander zu verknüpfen.

Um den Code zu erstellen, der in den E-Mail-Text eingefügt wird, verwendete ich den folgenden Prozess in der E-Mail-Erstellungsanwendung.

  1. Irgendwo im E-Mail-Text platzierte ich den folgenden Eingabeeintrag:<input name="ArchiveCode" type="hidden" value="<<UID>>">

  2. Dann erstellte ich einen eindeutigen Code und ersetzte das <<UID>>-Feld:$uid = md5(uniqid(rand(), true)); $emailBody = str_replace(“<<UID>>,$uid,$emailBody);

    Hier ist ein Beispielausgabe:

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

  3. Als Nächstes stellte ich sicher, dass ich die $UID in den meta_data-Block des X-MSYS-API-Headers einfügte. Dieser Schritt stellt sicher, dass die UID in jedes Ereignisausgabe für die original 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 aus der originalen E-Mail mit dem E-Mail-Text des Archivs zu verknüpfen.

Erhalten der Archive Version

Um eine Kopie einer E-Mail zur Archivierung zu erhalten, müssen Sie die folgenden Schritte ausführen:

  1. Erstellen Sie eine Subdomain, an die Sie alle Archiv-(Duplikat-)E-Mails senden werden

  2. Setzen Sie die entsprechenden DNS-Einträge, um alle E-Mails, die an diese Subdomain gesendet werden, an SparkPost zu schicken

  3. Erstellen Sie eine eingehende Domain in SparkPost

  4. Erstellen Sie einen eingehenden Webhook in SparkPost

  5. Erstellen Sie eine Anwendung (Collector), um den SparkPost-Webhook-Datenstream zu empfangen

Die folgenden zwei Links können Ihnen helfen, diesen Prozess zu durchlaufen:

  1. Technische Dokumentation von SparkPost: Enabling Inbound Email Relaying & Relay Webhooks

  2. Außerdem führt Sie der Blog, den ich letztes Jahr geschrieben habe, Archiving Emails: A How-To Guide for Tracking Sent Mail, durch die Erstellung des eingehenden Relays innerhalb von SparkPost

* Hinweis: Ab Oktober 2018 funktioniert die Archivfunktion nur, wenn E-Mails über eine SMTP-Verbindung zu SparkPost gesendet werden. Die RESTful-API unterstützt diese Funktion nicht. Das ist wahrscheinlich kein Problem, weil die meisten E-Mails, die diese Ebene der Prüfungskontrolle benötigen, dazu neigen, personalisierte E-Mails zu sein, die von einer Backend-Anwendung vollständig aufgebaut werden, bevor die E-Mail-Zustellung erforderlich ist.

Um eine Kopie einer E-Mail zur Archivierung zu erhalten, müssen Sie die folgenden Schritte ausführen:

  1. Erstellen Sie eine Subdomain, an die Sie alle Archiv-(Duplikat-)E-Mails senden werden

  2. Setzen Sie die entsprechenden DNS-Einträge, um alle E-Mails, die an diese Subdomain gesendet werden, an SparkPost zu schicken

  3. Erstellen Sie eine eingehende Domain in SparkPost

  4. Erstellen Sie einen eingehenden Webhook in SparkPost

  5. Erstellen Sie eine Anwendung (Collector), um den SparkPost-Webhook-Datenstream zu empfangen

Die folgenden zwei Links können Ihnen helfen, diesen Prozess zu durchlaufen:

  1. Technische Dokumentation von SparkPost: Enabling Inbound Email Relaying & Relay Webhooks

  2. Außerdem führt Sie der Blog, den ich letztes Jahr geschrieben habe, Archiving Emails: A How-To Guide for Tracking Sent Mail, durch die Erstellung des eingehenden Relays innerhalb von SparkPost

* Hinweis: Ab Oktober 2018 funktioniert die Archivfunktion nur, wenn E-Mails über eine SMTP-Verbindung zu SparkPost gesendet werden. Die RESTful-API unterstützt diese Funktion nicht. Das ist wahrscheinlich kein Problem, weil die meisten E-Mails, die diese Ebene der Prüfungskontrolle benötigen, dazu neigen, personalisierte E-Mails zu sein, die von einer Backend-Anwendung vollständig aufgebaut werden, bevor die E-Mail-Zustellung erforderlich ist.

Um eine Kopie einer E-Mail zur Archivierung zu erhalten, müssen Sie die folgenden Schritte ausführen:

  1. Erstellen Sie eine Subdomain, an die Sie alle Archiv-(Duplikat-)E-Mails senden werden

  2. Setzen Sie die entsprechenden DNS-Einträge, um alle E-Mails, die an diese Subdomain gesendet werden, an SparkPost zu schicken

  3. Erstellen Sie eine eingehende Domain in SparkPost

  4. Erstellen Sie einen eingehenden Webhook in SparkPost

  5. Erstellen Sie eine Anwendung (Collector), um den SparkPost-Webhook-Datenstream zu empfangen

Die folgenden zwei Links können Ihnen helfen, diesen Prozess zu durchlaufen:

  1. Technische Dokumentation von SparkPost: Enabling Inbound Email Relaying & Relay Webhooks

  2. Außerdem führt Sie der Blog, den ich letztes Jahr geschrieben habe, Archiving Emails: A How-To Guide for Tracking Sent Mail, durch die Erstellung des eingehenden Relays innerhalb von SparkPost

* Hinweis: Ab Oktober 2018 funktioniert die Archivfunktion nur, wenn E-Mails über eine SMTP-Verbindung zu SparkPost gesendet werden. Die RESTful-API unterstützt diese Funktion nicht. Das ist wahrscheinlich kein Problem, weil die meisten E-Mails, die diese Ebene der Prüfungskontrolle benötigen, dazu neigen, personalisierte E-Mails zu sein, die von einer Backend-Anwendung vollständig aufgebaut werden, 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 hochrangige 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 wird die Informationen einer doppelten E-Mail auf einmal enthalten, daher ist es ziemlich einfach, die JSON-Struktur in die gezielten Komponenten für dieses Projekt herunterzubrechen.  In meinem PHP-Code war das Abrufen der rfc822-formatierten E-Mail so einfach wie die folgenden wenigen Zeilen Code:

wenn ($verb == "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 meine SQL-Tabelle speichern möchte, befinden sich in einem Array von Header-Feldern.  Also schrieb ich eine kleine Funktion, die das Header-Array akzeptierte und durch das Array schleifte, um die Daten zu erhalten, die ich speichern wollte:

function get_important_headers($headers, &$original_to, &$headerDate, &$subject, &$from) {    foreach ($headers as $key => $value) {        foreach ($value as $key_sub => $value_sub) {            if ($key_sub == 'To') $original_to = $value_sub;            if ($key_sub == 'Date') $headerDate = $value_sub;            if ($key_sub == 'Subject') $subject = $value_sub;            if ($key_sub == 'From') $from = $value_sub;        }    } }

Jetzt, da ich die Daten habe, bin ich bereit, den Körper in S3 zu speichern.

Speichern der doppelten E-Mail in S3

Es tut mir leid, Sie enttäuschen zu müssen, aber ich werde kein Schritt-für-Schritt-Tutorial zum Erstellen eines S3-Buckets zum Speichern der E-Mail geben, noch werde ich beschreiben, wie man den notwendigen Zugriffsschlüssel erstellt, den Sie in Ihrer Anwendung zum Hochladen von Inhalten in Ihren Bucket benötigen; es gibt bessere Tutorials zu diesem Thema, als ich jemals schreiben könnte.  Hier sind ein paar Artikel, die Ihnen helfen 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 Projekt wie dieses gewählt habe.

  1. Zugriffskontrolle.  Sie müssen nicht nur die Sicherheit für den Bucket festlegen, sondern auch die Berechtigungen für die einzelnen Elemente.  In meinem Projekt verwende ich eine sehr offene Richtlinie des öffentlichen Lesens, da die Beispiel daten nicht persönlich sind und ich einen einfachen Zugang zu den Daten wollte.  Sie werden wahrscheinlich eine viel strengere ACL-Richtlinie benötigen. Hier ist ein schöner Artikel zu ACL-Einstellungen: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html

  2. Archivierung des Archivs. In S3 gibt es etwas, das sich Lifecycle Management nennt.  Damit können Sie Daten von einer Art von S3-Speicherklasse zu einer anderen verschieben.  Die verschiedenen Speicherklassen repräsentieren das Maß an Zugriff, das Sie auf die gespeicherten Daten benötigen, wobei mit den geringeren Kosten der Speicher verbunden wird, den Sie am wenigsten nutzen. Eine gute Beschreibung der verschiedenen Klassen und ihrer Übergänge finden Sie in einem AWS-Leitfaden namens Transitioning Objects. In meinem Fall habe ich beschlossen, einen Lebenszyklus zu erstellen, der jedes Objekt nach einem Jahr von Standard nach Glacier verschiebt. Glacier-Zugriff ist viel günstiger als das Standard S3-Archiv und wird mir Speicherkosten 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-Nutzladung nach S3 hochlade, muss ich einen eindeutigen Dateinamen erstellen, den ich zur Speicherung dieser E-Mail verwenden werde.

Für den eindeutigen Dateinamen werde ich im E-Mail-Text nach der versteckten ID suchen, die die sendende Anwendung in die E-Mail eingefügt hat, und diese ID als Dateinamen verwenden. Es gibt elegantere Methoden, um die connectorId aus dem html-Text zu extrahieren, aber der Einfachheit und Klarheit halber werde ich den folgenden Code verwenden:

       $start = strpos($htmlbody, $inputField);          $start = strpos($htmlbody, "value=", $start) + 7;        $end = strpos($htmlbody, ">", $start) - 1;        $length = $end - $start;        $UID = substr($html, $start, $length);

* Wir nehmen an, dass $inputField den Wert "ArchiveCode" enthält und in meiner Datei config.php gefunden wurde.

Mit der UID können wir dann den Dateinamen erstellen, der in S3 verwendet wird:

$fileName = $ArchiveDirectory . '/' . $UID . '.eml';

Jetzt bin ich in der Lage, meine Verbindung zu S3 zu öffnen und die Datei hochzuladen. Wenn Sie sich die Datei s3.php im GitHub-Repository ansehen, werden Sie feststellen, dass es sehr wenig Code benötigt, um die Datei hochzuladen.

Mein letzter Schritt ist es, diesen Eintrag in der MYSQL-Tabelle zu protokollieren.

Speichern der Meta Data in MySQL

Wir haben in einem vorherigen Schritt alle notwendigen Daten erfasst, daher ist der Schritt der Speicherung einfach.  In dieser ersten Phase habe ich mich entschieden, eine Tabelle mit den folgenden Feldern zu erstellen:

  • Ein automatisches Feld für Datum/Uhrzeit

  • Die Ziel-E-Mail-Adresse (RCPT_TO)

  • Der Zeitstempel aus dem E-Mail-DATUM-Header

  • Der BETREFF-Header

  • Der FROM-E-Mail-Adress-Header

  • Das Verzeichnis, das im S3-Bucket verwendet wird

  • Der S3-Dateiname für die archivierte E-Mail

Die Funktion namens MySQLLog innerhalb der upload.php-Anwendungsdatei geht durch 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 zur Sicherheit hinzu, und zwar, um diese Daten in eine Textdatei zu protokollieren. Sollte ich viel mehr Protokollierung für Fehler machen? Ja. Aber ich möchte diesen Code leicht halten, um ihn extrem schnell auszuführen. Manchmal wird dieser Code 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 Ausfälle verarbeitet und diese Ausfälle zur Überwachung an einen Administrator per E-Mail sendet.

Abschließend

So konnten wir in ein paar recht einfachen Schritten die erste Phase des Aufbaus eines robusten E-Mail-Archivierungssystems durchlaufen, das das E-Mail-Duplikat in S3 speichert und Daten in einer MySQL-Tabelle abgleicht.  Dies gibt uns eine Grundlage für den Rest des Projekts, das in mehreren zukünftigen Beiträgen behandelt werden wird.

In zukünftigen Überarbeitungen dieses Projekts erwarte ich:

  1. Alle Protokollereignisse der ursprünglichen E-Mail speichern

  2. Speicherfehler an einen Administrator senden, wenn beim Hochladen oder Protokollieren ein Fehler auftritt

  3. Die Komplexität des Sammlers minimieren.

  4. Eine Benutzeroberfläche zum Anzeigen aller Daten hinzufügen

  5. Die Möglichkeit unterstützen, die E-Mail erneut zu senden

In der Zwischenzeit hoffe ich, dass dieses Projekt interessant und hilfreich für Sie war; viel Spaß beim Senden.

Lassen Sie uns Sie mit einem Bird-Experten verbinden.
Erleben Sie die volle Macht des Bird in 30 Minuten.

Durch die Übermittlung stimmen Sie zu, dass Bird Sie bezüglich unserer Produkte und Dienstleistungen kontaktieren darf.

Sie können sich jederzeit abmelden. Weitere Informationen zur Datenverarbeitung finden Sie in Birds Datenschutzerklärung.

Unternehmen

Newsletter

Bleiben Sie mit Bird auf dem Laufenden durch wöchentliche Updates in Ihrem Posteingang.

Lassen Sie uns Sie mit einem Bird-Experten verbinden.
Erleben Sie die volle Macht des Bird in 30 Minuten.

Durch die Übermittlung stimmen Sie zu, dass Bird Sie bezüglich unserer Produkte und Dienstleistungen kontaktieren darf.

Sie können sich jederzeit abmelden. Weitere Informationen zur Datenverarbeitung finden Sie in Birds Datenschutzerklärung.

Unternehmen

Newsletter

Bleiben Sie mit Bird auf dem Laufenden durch wöchentliche Updates in Ihrem Posteingang.

Lassen Sie uns Sie mit einem Bird-Experten verbinden.
Erleben Sie die volle Macht des Bird in 30 Minuten.

Durch die Übermittlung stimmen Sie zu, dass Bird Sie bezüglich unserer Produkte und Dienstleistungen kontaktieren darf.

Sie können sich jederzeit abmelden. Weitere Informationen zur Datenverarbeitung finden Sie in Birds Datenschutzerklärung.

R

Erreichen

G

Grow

M

Manage

A

Automate

Unternehmen

Newsletter

Bleiben Sie mit Bird auf dem Laufenden durch wöchentliche Updates in Ihrem Posteingang.