Budowanie systemu archiwizacji e-maili: Przechowywanie treści e-maila
·
4 mar 2019

Najważniejsze informacje
Cel: Ten post przedstawia pierwszy etap budowy systemu archiwizacji e-maili przy użyciu SparkPost, Amazon S3 i MySQL. Wyjaśnia, jak duplikować, przechwytywać i przechowywać e-maile w celu długoterminowego dostępu i zgodności.
Główna idea: System automatycznie przechowuje surową treść e-maila (format rfc822) w S3 i zapisuje metadane (temat, nadawca, znacznik czasu itp.) w MySQL dla szybkiego wyszukiwania i odzyskiwania.
Podstawowe elementy:
Tworzenie duplikatów do archiwizacji: Użyj funkcji Archiwizuj SparkPost, aby wysłać identyczne kopie wychodzących e-maili na wyznaczony adres archiwum, zapewniając, że treść i linki śledzące pozostaną identyczne.
Powiązanie danych za pomocą UID: Osadź unikalny identyfikator (UID) w treści e-maila i metadanych X-MSYS-API, aby powiązać oryginalne i zarchiwizowane wiadomości.
Przetwarzanie przychodzące: Skonfiguruj domenę przychodzącą i webhook w SparkPost, aby odbierać zarchiwizowane ładunki JSON e-maili za pośrednictwem kolektora aplikacji.
Przechowywanie e-maili w S3: Prześlij sparsowaną treść rfc822 do koszyka S3, stosując zasady cyklu życia (np. przejście do Glacier po roku), aby obniżyć koszty przechowywania.
Logowanie metadanych w MySQL: Zapisz kluczowe pola, takie jak RCPT_TO, FROM, SUBJECT i nazwa pliku S3 w celu indeksowania wyszukiwania i przyszłego odzyskiwania.
Rozważania dotyczące wydajności: Efektywność kodu i minimalne logowanie zapewniają, że kolektor może obsługiwać setki żądań na minutę przy minimalnych opóźnieniach.
Ogólny obraz: Ta podstawa wspiera przyszłe usprawnienia – takie jak przechowywanie zdarzeń logów, alerty o awariach i wizualizacja interfejsu – kładąc fundamenty pod skalowalne, audytowalne rozwiązanie archiwizacji e-maili.
Podsumowanie pytań i odpowiedzi
Jaki jest cel tego projektu?
Aby stworzyć zautomatyzowany system archiwizacji e-maili, który przechowuje treści wiadomości w Amazon S3, jednocześnie zachowując dane metadane wyszukiwalne w bazie danych MySQL.
Dlaczego warto używać funkcji Archiwum SparkPost?
Umożliwia generowanie dokładnych duplikatów wychodzących e-maili, zachowując ich strukturę oraz dane śledzenia dla celów zgodności i przeglądu.
Jak każdy zarchiwizowany email jest powiązany ze swoją oryginalną wiadomością?
Unikalny identyfikator UID jest osadzony zarówno w treści wiadomości e-mail, jak i w metadanych, umożliwiając dokładne odniesienie między oryginalną a zarchiwizowaną kopią.
Dlaczego używać S3 do przechowywania?
S3 oferuje skalowalny magazyn i opcje zarządzania cyklem życia (jak Glacier), co czyni go opłacalnym dla długoterminowego przechowywania e-maili.
Co przechowuje baza danych MySQL?
Przechowuje pola metadanych, które można przeszukiwać—takie jak linia tematu, nadawca, znaczniki czasu i nazwa pliku S3—umożliwiając wydajne zapytania i pobieranie.
Jakie są następne kroki rozwoju?
Dodawanie śledzenia zdarzeń logów, zautomatyzowanego raportowania błędów, uproszczonego kolektora oraz interfejsu do przeglądania lub ponownego wysyłania zarchiwizowanych e-maili.
W tym blogu opiszę proces, przez który przeszedłem, aby przechować treść e-maila w S3 (Amazon’s Simple Store Service) oraz dane dodatkowe w tabeli MySQL dla łatwego krzyżowego odniesienia. Ostatecznie jest to punkt wyjścia dla bazy kodu, która zawiera aplikację, która umożliwi łatwe przeszukiwanie archiwalnych e-maili, a następnie wyświetlanie tych e-maili wraz z danymi o wydarzeniach (log). Kod do tego projektu znajduje się w następującym repozytorium GitHub: https://github.com/jeff-goldstein/PHPArchivePlatform.
Chociaż w tym projekcie wykorzystam S3 i MySQL, w żadnym wypadku nie są to jedyne technologie, które można wykorzystać do budowy platformy archiwizacyjnej, ale biorąc pod uwagę ich wszechobecność, pomyślałem, że są dobrym wyborem do tego projektu. W systemie o pełnej skali o wysokiej wydajności użyłbym bazy danych o wyższej wydajności niż MySQL, ale dla tego przykładowego projektu MySQL jest idealne. Dla organizacji rozważających PostgreSQL jako wybór bazy danych do archiwizacji, wdrożenie odpowiednich procedur tworzenia kopii zapasowych i przywracania jest niezbędne do utrzymania integralności danych w systemach produkcyjnych.
Szczegółowo opisałem poniżej kroki, które podjąłem w tej pierwszej fazie projektu:
Tworzenie duplikatu e-maila do archiwizacji
Wykorzystanie funkcji archiwizacji i przekazywania przychodzącego SparkPost do wysłania kopii oryginalnego e-maila z powrotem do SparkPost w celu przetworzenia na strukturę JSON, a następnie wysłania do zbieracza webhook (aplikacja)
Rozmontowanie struktury JSON w celu uzyskania niezbędnych komponentów
Wysłanie treści e-maila do S3 w celu przechowywania
Zalogowanie wpisu do MySQL dla każdego e-maila w celu krzyżowego odniesienia
Tworzenie duplikatu wiadomości e-mail
Uzyskiwanie wersji archiwalnej
Aby uzyskać kopię e-maila do archiwum, należy wykonać następujące kroki:
Utwórz subdomenę, na którą będziesz wysyłać wszystkie archiwalne (duplikatowe) e-maile
Ustaw odpowiednie rekordy DNS, aby wszystkie e-maile wysyłane na tę subdomenę były kierowane do SparkPost
Utwórz domenę przychodzącą w SparkPost
Utwórz webhook przychodzący w SparkPost
Utwórz aplikację (kolektor), aby odbierać strumień danych webhooka SparkPost
Poniższe dwa linki mogą być użyteczne, aby poprowadzić Cię przez ten proces:
Dokumentacja techniczna SparkPost: Włączanie przesyłania e-maili przychodzących i webhooków
Również blog, który napisałem w zeszłym roku, Archiwizowanie e-maili: Przewodnik, jak śledzić wysłane wiadomości przeprowadzi Cię przez tworzenie relayu przychodzącego w SparkPost
* Uwaga: od października 2018 roku funkcja archiwum działa tylko w przypadku wysyłania e-maili przy użyciu połączenia SMTP z SparkPost, interfejs API RESTful nie obsługuje tej funkcji. To prawdopodobnie nie jest problem, ponieważ większość e-maili, które wymagają tego poziomu kontroli audytu, ma tendencję do bycia spersonalizowanymi e-mailami, które są w pełni przygotowane przez aplikację zaplecza przed potrzebą dostarczenia e-maila.
Uzyskanie duplikatu adresu e-mail w strukturze JSON
Przechowywanie duplikatu adresu e-mail w S3
Przechowywanie metadanych w MySQL
Zebraliśmy wszystkie niezbędne dane w poprzednim kroku, więc krok przechowywania jest łatwy. W tej pierwszej fazie postanowiłem zbudować tabelę z następującymi polami:
Pola metadanych MySQL
Pole | Cel |
Data/godzina (auto) | Znacznik czasu, kiedy wpis został zapisany |
Adres RCPT_TO | Docelowy adres e-mail dla zarchiwizowanej wiadomości |
Znacznik czasu nagłówka DATE | Oryginalny czas wysłania e-maila |
Znacznik nagłówka SUBJECT | Temat do indeksowania i wyszukiwania |
Znacznik nagłówka FROM | Identyfikator nadawcy do wyszukiwania |
Katalog S3 | Ścieżka katalogu wewnątrz koszyka S3 |
Nazwa pliku S3 | Unikalny plik .eml przechowywany w S3 |
Funkcja o nazwie MySQLLog w pliku aplikacji upload.php przechodzi przez niezbędne kroki, aby otworzyć połączenie z MySQL, wstrzyknąć nowy wiersz, przetestować wyniki i zamknąć połączenie. Dodaję jeszcze jeden krok dla pewności, a mianowicie zapisuję te dane do pliku tekstowego. Czy powinienem robić znacznie więcej logowania błędów? Tak. Ale chcę, aby ten kod działał lekko, aby mógł działać bardzo szybko. Czasami ten kod będzie wywoływany setki razy na minutę i musi być jak najbardziej efektywny. W przyszłych aktualizacjach dodam dodatkowy kod, który będzie przetwarzać błędy i wysyłać te błędy na adres e-mail administratora w celu monitorowania.
Podsumowując
W zaledwie kilku stosunkowo łatwych krokach, mogliśmy przejść przez pierwszą fazę budowy solidnego systemu archiwizacji e-maili, który przechowuje duplikaty e-maili w S3 i porównuje dane w tabeli MySQL. To da nam fundament do reszty projektu, który będzie realizowany w kilku przyszłych postach.
W przyszłych rewizjach tego projektu oczekiwałbym:
Przechowywać wszystkie zdarzenia dziennika oryginalnego e-maila
Wysyłać błędy przechowywania do administratora, gdy wystąpi błąd przesyłania lub logowania
Zmniejszyć złożoność kolektora.
Dodaj interfejs użytkownika do przeglądania wszystkich danych
Wspierać możliwość ponownego wysłania e-maila
W międzyczasie, mam nadzieję, że ten projekt był interesujący i pomocny dla Ciebie; miłego wysyłania.



