Een e-mailarchiveringssysteem bouwen: het opslaan van de e-mailinhoud
·
4 mrt 2019

Belangrijkste punten
Doel: Dit bericht schetst de eerste fase van het bouwen van een e-mailarchiveringssysteem met behulp van SparkPost, Amazon S3, en MySQL. Het legt uit hoe e-mails gedupliceerd, vastgelegd en opgeslagen kunnen worden voor langdurige toegang en compliance.
Kernidee: Het systeem slaat automatisch de ruwe e-mailinhoud (rfc822-formaat) op in S3 en logt metadata (onderwerp, afzender, tijdstempel, enz.) in MySQL voor snelle zoekopdrachten en terughaling.
Essentiële zaken behandeld:
Dupliceer maken voor archivering: Gebruik de Archive feature van SparkPost om identieke kopieën van uitgaande e-mails naar een aangewezen archiefadres te sturen, waarbij de inhoud en volgkoppelingslinks identiek blijven.
Data binding via UID: Voeg een unieke identificatiecode (UID) in zowel de e-mailinhoud als de X-MSYS-API-metadata om de originele en gearchiveerde berichten te koppelen.
Inbound verwerking: Configureer een inbound domein en webhook in SparkPost om de gearchiveerde e-mail JSON-payloads via een applicatiecollector te ontvangen.
E-mails opslaan in S3: Upload het geparseerde rfc822 lichaam naar een S3 bucket, gebruikmakend van levenscyclusregels (bijv. overgang naar Glacier na een jaar) om opslagkosten te verlagen.
Metadata loggen in MySQL: Sla belangrijke velden op zoals RCPT_TO, FROM, SUBJECT, en S3-bestandsnaam voor zoekindexering en toekomstige terughaling.
Overwegingen voor prestaties: Code-efficiëntie en minimale logging zorgen ervoor dat de collector honderden verzoeken per minuut kan verwerken met minimale latentie.
Groot geheel: Deze basis ondersteunt toekomstige verbeteringen zoals opslag van loggebeurtenissen, foutwaarschuwingen, en UI-visualisatie, en legt de basis voor een schaalbare, controleerbare e-mailarchiefoplossing.
Q&A Hoogtepunten
Wat is het doel van dit project?
Om een geautomatiseerd e-mailsysteem te maken dat berichtlichamen opslaat in Amazon S3 terwijl het doorzoekbare metadata behoudt in een MySQL-database.
Waarom de Archive functie van SparkPost gebruiken?
Het stelt je in staat om exacte duplicaten van uitgaande e-mails te genereren, waarbij hun structuur en volggegevens voor naleving en beoordeling behouden blijven.
Hoe is elke gearchiveerde e-mail gekoppeld aan zijn oorspronkelijke bericht?
Een unieke UID is ingebed in zowel de e-mailbody als de metadata, waardoor nauwkeurige kruisverwijzing tussen de originele en gearchiveerde kopieën mogelijk is.
Waarom S3 gebruiken voor opslag?
S3 biedt schaalbare opslag- en levenscyclusbeheeropties (zoals Glacier), waardoor het kosteneffectief is voor langdurige e-mailopslag.
Wat slaat de MySQL database op?
Het slaat doorzoekbare metadata velden op—zoals onderwerpregel, afzender, tijdstempels, en de S3-bestandsnaam—waardoor efficiënte query en retrieval mogelijk is.
Wat zijn de volgende ontwikkelingsstappen?
Het toevoegen van logboekgebeurtenistracering, geautomatiseerde foutrapportage, een vereenvoudigde collector en een UI voor het bekijken of opnieuw verzenden van gearchiveerde e-mails.
In deze blog zal ik het proces beschrijven dat ik heb doorlopen om de inhoud van de e-mail op te slaan in S3 (Amazons Simple Store Service) en aanvullende gegevens in een MySQL-tabel voor eenvoudige kruisverwijzing. Uiteindelijk is dit het beginpunt voor de codebasis die een applicatie zal bevatten waarmee eenvoudig kan worden gezocht naar gearchiveerde e-mails, en vervolgens die e-mails samen met de gebeurtenis (log) gegevens kan worden weergegeven. De code voor dit project is te vinden in de volgende GitHub-repository: https://github.com/jeff-goldstein/PHPArchivePlatform.
Hoewel ik S3 en MySQL in dit project zal gebruiken, zijn dit zeker niet de enige technologieën die kunnen worden gebruikt om een archiveringsplatform te bouwen, maar gezien hun alomtegenwoordigheid dacht ik dat ze een goede keuze waren voor dit project. In een grootschalig hoogvolume systeem zou ik een database met hogere prestaties dan MySQL gebruiken, maar voor dit voorbeeldproject is MySQL perfect. Voor organisaties die PostgreSQL overwegen als hun archiveringsdatabaseselectie, is het implementeren van de juiste back-up- en herstelprocedures essentieel voor het behouden van de gegevensintegriteit in productiesystemen.
Ik heb hieronder de stappen beschreven die ik heb genomen in deze eerste fase van het project:
Het creëren van de dubbele e-mail voor archivering
Gebruik de Archivering en Inbound Relay-functies van SparkPost om een kopie van de oorspronkelijke e-mail terug te sturen naar SparkPost voor verwerking in een JSON-structuur, die vervolgens wordt verzonden naar een webhook-verzamelaar (applicatie)
Demonteer de JSON-structuur om de nodige componenten te verkrijgen
Verstuur de inhoud van de e-mail naar S3 voor opslag
Log een vermelding in MySQL voor elke e-mail voor kruisverwijzing
Een duplicaat van de Email maken
De Archief versie verkrijgen
Om een kopie van een e-mail voor archivering te verkrijgen, moet u de volgende stappen ondernemen:
Maak een subdomein waarop u alle archive (dubbele) e-mail(s) naartoe stuurt
Stel de juiste DNS-records in zodat alle e-mails naar dat subdomein naar SparkPost worden verzonden
Maak een inbound domein in SparkPost
Maak een inbound webhook in SparkPost
Maak een applicatie (collector) om de SparkPost webhook datastroom te ontvangen
De volgende twee links kunnen u helpen bij het begeleiden door dit proces:
SparkPost technische documentatie: Enabling Inbound Email Relaying & Relay Webhooks
Ook, de blog die ik vorig jaar schreef, Archiving Emails: A How-To Guide for Tracking Sent Mail zal u begeleiden bij de creatie van de inbound relay binnen SparkPost
* Opmerking: vanaf oktober 2018 werkt de Archive functie alleen bij het verzenden van e-mails met behulp van een SMTP-verbinding naar SparkPost, de RESTful API ondersteunt deze functie niet. Dat is waarschijnlijk niet een probleem omdat de meeste e-mails die dit niveau van auditcontrole nodig hebben, gepersonaliseerde e-mails zijn die volledig door een backend applicatie worden opgebouwd voordat e-maillevering nodig is.
Het verkrijgen van de dubbele e-mail in een JSON-structuur
Het opslaan van de dubbele email in S3
Het opslaan van de Meta Data in MySQL
We hebben alle benodigde gegevens in een eerdere stap verzameld, dus de opslagstap is eenvoudig. In deze eerste fase koos ik ervoor om een tabel te maken met de volgende velden:
MySQL Metadata Velden
Veld | Doel |
Datum/tijd (automatisch) | Tijdstempel wanneer de invoer werd geregistreerd |
RCPT_TO-adres | Doel-e-mailadres voor het gearchiveerde bericht |
DATE-header tijdstempel | Verzendtijd van de oorspronkelijke e-mail |
SUBJECT-header | Onderwerpregel voor indexering en zoeken |
FROM-header | Zendidentificatie voor opzoeking |
S3-map | Map pad binnen S3-bucket |
S3-bestandsnaam | Uniek .eml-bestand opgeslagen in S3 |
De functie genaamd, MySQLLog binnen het upload.php toepassingsbestand doorloopt de nodige stappen om de link naar MySQL te openen, de nieuwe rij in te voegen, de resultaten te testen en de link te sluiten. Ik voeg één andere stap toe voor de zekerheid, namelijk om deze gegevens in een tekstbestand te loggen. Moet ik veel meer loggen voor fouten? Ja. Maar ik wil deze code licht houden om ervoor te zorgen dat het extreem snel kan draaien. Soms wordt deze code honderden keren per minuut aangeroepen en moet het zo efficiënt mogelijk zijn. In toekomstige updates zal ik aanvullende code toevoegen die fouten verwerkt en die fouten naar een beheerder e-mailt voor monitoring.
Het afsluiten
Dus in een paar redelijk eenvoudige stappen konden we door de eerste fase van het bouwen van een robuust e-mailarchiveringssysteem lopen dat de e-mailduplicaat in S3 bewaart en gegevens kruislings controleert in een MySQL-tabel. Dit geeft ons een basis voor de rest van het project dat in verschillende toekomstige posts zal worden aangepakt.
In toekomstige revisies van dit project zou ik verwachten:
Alle loggebeurtenissen van de originele e-mail opslaan
Opslagfouten naar een beheerder sturen wanneer een upload- of logfout optreedt
De verzamelcomplexiteit minimaliseren.
Een UI toevoegen voor het bekijken van alle gegevens
De mogelijkheid ondersteunen om de e-mail opnieuw te verzenden
In de tussentijd hoop ik dat dit project interessant en nuttig voor je is geweest; veel plezier met versturen.



