Membangun Sistem Pengarsipan Email: Menyimpan Isi Email
·
4 Mar 2019

Poin Penting
Tujuan: Postingan ini menjelaskan fase pertama membangun sistem pengarsipan email menggunakan SparkPost, Amazon S3, dan MySQL. Ini menjelaskan bagaimana cara menduplikasi, menangkap, dan menyimpan email untuk akses jangka panjang dan kepatuhan.
Gagasan inti: Sistem secara otomatis menyimpan tubuh email mentah (format rfc822) di S3 dan mencatat metadata (subjek, pengirim, timestamp, dll.) ke dalam MySQL untuk pencarian dan pengambilan yang cepat.
Hal-hal penting yang dibahas:
Membuat duplikat untuk pengarsipan: Gunakan fitur Arsip SparkPost untuk mengirim salinan identik dari email keluar ke alamat arsip yang ditentukan, memastikan tubuh dan tautan pelacakan tetap identik.
Pemrograman data melalui UID: Sertakan pengidentifikasi unik (UID) ke dalam tubuh email dan metadata X-MSYS-API untuk menghubungkan pesan asli dan yang diarsipkan.
Proses masuk: Konfigurasikan domain masuk dan webhook di SparkPost untuk menerima payload JSON email yang diarsipkan melalui pengumpul aplikasi.
Menyimpan email di S3: Unggah tubuh rfc822 yang diurai ke bucket S3, menggunakan aturan siklus hidup (misalnya, transisi ke Glacier setelah satu tahun) untuk mengurangi biaya penyimpanan.
Mencatat metadata di MySQL: Simpan bidang kunci seperti RCPT_TO, FROM, SUBJECT, dan nama file S3 untuk pengindeksan pencarian dan pengambilan di masa mendatang.
Pertimbangan kinerja: Efisiensi kode dan pencatatan minimal memastikan pengumpul dapat menangani ratusan permintaan per menit dengan latensi minimal.
Gambaran besar: Fondasi ini mendukung peningkatan di masa depan—seperti penyimpanan event log, peringatan kegagalan, dan visualisasi UI—meletakkan dasar untuk solusi arsip email yang dapat diskalakan dan diaudit.
Sorotan Tanya jawab
Apa tujuan dari proyek ini?
Untuk membuat sistem pengarsipan email otomatis yang menyimpan isi pesan di Amazon S3 sambil mempertahankan metadata yang dapat dicari dalam basis data MySQL.
Mengapa menggunakan fitur Arsip SparkPost?
Ini memungkinkan Anda untuk menghasilkan duplikat tepat dari email yang keluar, mempertahankan struktur dan data pelacakan untuk kepatuhan dan tinjauan.
Bagaimana setiap email yang diarsipkan terhubung ke pesan aslinya?
UID yang unik disematkan ke dalam baik isi email maupun metadata, memungkinkan referensi silang yang akurat antara salinan asli dan yang diarsipkan.
Mengapa menggunakan S3 untuk penyimpanan?
S3 menawarkan opsi penyimpanan yang skalabel dan manajemen siklus hidup (seperti Glacier), menjadikannya hemat biaya untuk retensi email jangka panjang.
Apa yang disimpan oleh database MySQL?
Ini menyimpan bidang metadata yang dapat dicari—seperti baris subjek, pengirim, timestamp, dan nama file S3—memungkinkan kueri dan pengambilan yang efisien.
Apa langkah pengembangan selanjutnya?
Menambahkan pelacakan acara log, pelaporan kesalahan otomatis, pengumpul yang disederhanakan, dan antarmuka pengguna untuk melihat atau mengirim ulang email yang diarsipkan.
Dalam blog ini, saya akan menjelaskan proses yang saya lalui untuk menyimpan isi email ke S3 (Layanan Penyimpanan Sederhana Amazon) dan data tambahan ke dalam tabel MySQL untuk referensi silang yang mudah. Pada akhirnya, ini adalah titik awal untuk basis kode yang akan mencakup aplikasi yang akan memungkinkan pencarian email yang diarsipkan dengan mudah, lalu menampilkan email-email tersebut bersama dengan data peristiwa (log). Kode untuk proyek ini dapat ditemukan di repositori GitHub berikut: https://github.com/jeff-goldstein/PHPArchivePlatform.
Sementara saya akan memanfaatkan S3 dan MySQL dalam proyek ini, sama sekali bukan berarti ini adalah satu-satunya teknologi yang dapat digunakan untuk membangun platform pengarsipan, tetapi mengingat ubiquitasnya, saya rasa mereka adalah pilihan yang baik untuk proyek ini. Dalam sistem berskala besar dengan volume tinggi, saya akan menggunakan basis data dengan kinerja lebih tinggi daripada MySQL, tetapi untuk proyek contoh ini, MySQL sangat cocok. Untuk organisasi yang mempertimbangkan PostgreSQL sebagai pilihan basis data pengarsipan mereka, menerapkan prosedur cadangan dan pemulihan yang tepat adalah penting untuk mempertahankan integritas data dalam sistem produksi.
Saya telah merinci di bawah ini, langkah-langkah yang saya ambil dalam fase pertama proyek ini:
Membuat email duplikat untuk pengarsipan
Gunakan fitur Pengarsipan dan Relay Masuk dari SparkPost untuk mengirim salinan email asli kembali ke SparkPost untuk diproses menjadi struktur JSON, lalu dikirim ke pengumpul webhook (aplikasi)
Membongkar struktur JSON untuk mendapatkan komponen yang diperlukan
Kirim isi email ke S3 untuk penyimpanan
Catat entri ke MySQL untuk setiap email untuk referensi silang
Membuat Duplikat Email
Mendapatkan versi Arsip
Untuk mendapatkan salinan email untuk arsip, Anda perlu melakukan langkah-langkah berikut:
Buat subdomain yang akan Anda kirim semua email arsip (duplikat) ke
Atur catatan DNS yang tepat agar semua email yang dikirim ke subdomain tersebut diarahkan ke SparkPost
Buat domain masuk di SparkPost
Buat webhook masuk di SparkPost
Buat aplikasi (pengumpul) untuk menerima aliran data webhook SparkPost
Dua tautan berikut dapat digunakan untuk membantu memandu Anda melalui proses ini:
Dokumen teknis SparkPost: Mengaktifkan Pengalihan Email Masuk & Webhook Pengalihan
Juga, blog yang saya tulis tahun lalu, Mengarsipkan Email: Panduan Cara untuk Melacak Email yang Dikirim akan memandu Anda melalui pembuatan pengalihan masuk dalam SparkPost
* Catatan: sejak Oktober 2018, fitur Arsip hanya berfungsi saat mengirim email menggunakan koneksi SMTP ke SparkPost, API RESTful tidak mendukung fitur ini. Itu mungkin bukan masalah karena sebagian besar email yang memerlukan tingkat kontrol audit ini cenderung merupakan email yang dipersonalisasi yang sepenuhnya dibangun oleh aplikasi backend sebelum pengiriman email diperlukan.
Mendapatkan duplikat email dalam struktur JSON
Menyimpan email duplikat di S3
Menyimpan Data Meta di MySQL
Kami telah mengambil semua data yang diperlukan pada langkah sebelumnya, jadi langkah penyimpanan ini mudah. Pada fase pertama ini saya memilih untuk membangun tabel dengan bidang-bidang berikut:
Bidang Metadata MySQL
Bidang | Tujuan |
Tanggal/waktu (otomatis) | Stempel waktu ketika entri dicatat |
Alamat RCPT_TO | Alamat email target untuk pesan yang diarsipkan |
Stempel waktu header TANGGAL | Waktu pengiriman email asli |
Header SUBJEK | Baris subjek untuk pengindeksan dan pencarian |
Header DARI | Identifikasi pengirim untuk pencarian |
Direktori S3 | Jalur direktori di dalam bucket S3 |
Nama file S3 | File .eml unik yang disimpan di S3 |
Fungsi bernama MySQLLog dalam file aplikasi upload.php melalui langkah-langkah yang diperlukan untuk membuka tautan ke MySQL, menyuntikkan baris baru, menguji hasilnya, dan menutup tautan tersebut. Saya juga menambahkan satu langkah lain untuk jaga-jaga dan itu adalah mencatat data ini ke dalam file teks. Haruskah saya melakukan lebih banyak pencatatan untuk kesalahan? Ya. Tetapi saya ingin menjaga kode ini tetap ringan untuk memungkinkan berjalan dengan sangat cepat. Kadang-kadang kode ini akan dipanggil ratusan kali per menit dan perlu seefisien mungkin. Dalam pembaruan mendatang, saya akan menambahkan kode tambahan yang akan memproses kegagalan dan mengirimkan kegagalan tersebut kepada admin untuk pemantauan.
Menyimpulkan
Jadi dalam beberapa langkah yang cukup mudah, kami berhasil melewati fase pertama dalam membangun sistem pengarsipan email yang kuat yang menyimpan duplikat email di S3 dan merujuk data dalam tabel MySQL. Ini akan memberikan kami landasan untuk sisa proyek yang akan ditangani dalam beberapa pos mendatang.
Dalam revisi proyek mendatang, saya berharap untuk:
Menyimpan semua log peristiwa dari email asli
Mengirimkan kesalahan penyimpanan kepada admin ketika terjadi kegagalan dalam mengunggah atau mencatat
Meminimalkan kompleksitas pengumpul.
Menambah antarmuka pengguna untuk melihat semua data
Mendukung kemampuan untuk mengirim ulang email
Sementara itu, saya berharap proyek ini menarik dan bermanfaat bagi Anda; selamat mengirim.



