Membangun Sistem Pengarsipan Email: Menyimpan Isi Email
Burung
4 Mar 2019
1 min read

Intisari Utama
Tujuan: Postingan ini menjelaskan fase pertama dari pembangunan sistem pengarsipan email menggunakan SparkPost, Amazon S3, dan MySQL. Ini menjelaskan cara menduplikasi, menangkap, dan menyimpan email untuk akses jangka panjang dan kepatuhan.
Ide inti: Sistem secara otomatis menyimpan tubuh email mentah (format rfc822) di S3 dan mencatat metadata (subjek, pengirim, stempel waktu, dll.) ke dalam MySQL untuk pencarian dan pengambilan cepat.
Hal penting yang dibahas:
Membuat duplikat untuk arsip: Gunakan fitur Archive SparkPost untuk mengirim salinan identik dari email keluar ke alamat arsip yang ditentukan, memastikan tubuh dan tautan pelacakan tetap identik.
Pemautan data via UID: Sertakan pengenal unik (UID) ke dalam tubuh email dan metadata X-MSYS-API untuk mengaitkan pesan asli dan yang diarsipkan.
Pemrosesan 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 telah diurai ke dalam bucket S3, menggunakan aturan siklus hidup (misalnya, pindah 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 depan.
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 log kejadian, peringatan kegagalan, dan visualisasi UI—meletakkan dasar untuk solusi arsip email yang dapat diskalakan dan dapat diaudit.
Sorotan Q&A
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 database MySQL.
Mengapa menggunakan fitur Archive dari SparkPost?
Ini memungkinkan Anda untuk menghasilkan duplikat persis dari email yang dikirim, dengan mempertahankan struktur dan data pelacakan mereka untuk kepatuhan dan tinjauan.
Bagaimana setiap email yang diarsipkan terhubung ke pesan aslinya?
Sebuah UID unik tertanam dalam tubuh email dan metadata, memungkinkan pencocokan silang yang akurat antara salinan asli dan yang diarsipkan.
Mengapa menggunakan S3 untuk penyimpanan?
S3 menawarkan opsi penyimpanan yang dapat diskalakan dan pengelolaan siklus hidup (seperti Glacier), membuatnya hemat biaya untuk penyimpanan email jangka panjang.
Apa yang disimpan dalam database MySQL?
Ini menyimpan bidang metadata yang dapat dicari—seperti garis subjek, pengirim, cap waktu, dan nama file S3—memungkinkan kueri dan pengambilan yang efisien.
Apa langkah pengembangan selanjutnya?
Menambahkan pelacakan acara log, pelaporan kesalahan otomatis, kolektor 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 (Amazon's Simple Store Service) dan data tambahan ke dalam tabel MySQL untuk referensi silang yang mudah. Pada akhirnya, ini adalah titik awal untuk basis kode yang akan menyertakan aplikasi yang memungkinkan pencarian email yang diarsipkan dengan mudah, dan kemudian menampilkan email tersebut bersama dengan data peristiwa (log). Kode untuk proyek ini dapat ditemukan di repositori GitHub berikut: https://github.com/jeff-goldstein/PHPArchivePlatform.
Walaupun saya akan memanfaatkan S3 dan MySQL dalam proyek ini, ini bukan satu-satunya teknologi yang dapat digunakan untuk membangun platform pengarsipan, namun mengingat urgensinya, saya pikir mereka adalah pilihan yang baik untuk proyek ini. Dalam sistem skala penuh dengan volume tinggi, saya akan menggunakan database berkinerja lebih tinggi daripada MySQL, tetapi untuk proyek sampel ini, MySQL sangat cocok. Untuk organisasi yang mempertimbangkan PostgreSQL sebagai pilihan database pengarsipan mereka, menerapkan prosedur pencadangan dan pemulihan yang tepat sangat penting untuk menjaga integritas data dalam sistem produksi.
Saya telah merinci di bawah ini, langkah-langkah yang saya lakukan dalam fase pertama dari proyek ini:
Membuat email duplikat untuk pengarsipan
Menggunakan fitur Archiving dan Inbound Relay 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
Mengirim isi email ke S3 untuk penyimpanan
Mencatat entri ke dalam MySQL untuk setiap email untuk referensi silang
Dalam blog ini, saya akan menjelaskan proses yang saya lalui untuk menyimpan isi email ke S3 (Amazon's Simple Store Service) dan data tambahan ke dalam tabel MySQL untuk referensi silang yang mudah. Pada akhirnya, ini adalah titik awal untuk basis kode yang akan menyertakan aplikasi yang memungkinkan pencarian email yang diarsipkan dengan mudah, dan kemudian menampilkan email tersebut bersama dengan data peristiwa (log). Kode untuk proyek ini dapat ditemukan di repositori GitHub berikut: https://github.com/jeff-goldstein/PHPArchivePlatform.
Walaupun saya akan memanfaatkan S3 dan MySQL dalam proyek ini, ini bukan satu-satunya teknologi yang dapat digunakan untuk membangun platform pengarsipan, namun mengingat urgensinya, saya pikir mereka adalah pilihan yang baik untuk proyek ini. Dalam sistem skala penuh dengan volume tinggi, saya akan menggunakan database berkinerja lebih tinggi daripada MySQL, tetapi untuk proyek sampel ini, MySQL sangat cocok. Untuk organisasi yang mempertimbangkan PostgreSQL sebagai pilihan database pengarsipan mereka, menerapkan prosedur pencadangan dan pemulihan yang tepat sangat penting untuk menjaga integritas data dalam sistem produksi.
Saya telah merinci di bawah ini, langkah-langkah yang saya lakukan dalam fase pertama dari proyek ini:
Membuat email duplikat untuk pengarsipan
Menggunakan fitur Archiving dan Inbound Relay 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
Mengirim isi email ke S3 untuk penyimpanan
Mencatat entri ke dalam MySQL untuk setiap email untuk referensi silang
Dalam blog ini, saya akan menjelaskan proses yang saya lalui untuk menyimpan isi email ke S3 (Amazon's Simple Store Service) dan data tambahan ke dalam tabel MySQL untuk referensi silang yang mudah. Pada akhirnya, ini adalah titik awal untuk basis kode yang akan menyertakan aplikasi yang memungkinkan pencarian email yang diarsipkan dengan mudah, dan kemudian menampilkan email tersebut bersama dengan data peristiwa (log). Kode untuk proyek ini dapat ditemukan di repositori GitHub berikut: https://github.com/jeff-goldstein/PHPArchivePlatform.
Walaupun saya akan memanfaatkan S3 dan MySQL dalam proyek ini, ini bukan satu-satunya teknologi yang dapat digunakan untuk membangun platform pengarsipan, namun mengingat urgensinya, saya pikir mereka adalah pilihan yang baik untuk proyek ini. Dalam sistem skala penuh dengan volume tinggi, saya akan menggunakan database berkinerja lebih tinggi daripada MySQL, tetapi untuk proyek sampel ini, MySQL sangat cocok. Untuk organisasi yang mempertimbangkan PostgreSQL sebagai pilihan database pengarsipan mereka, menerapkan prosedur pencadangan dan pemulihan yang tepat sangat penting untuk menjaga integritas data dalam sistem produksi.
Saya telah merinci di bawah ini, langkah-langkah yang saya lakukan dalam fase pertama dari proyek ini:
Membuat email duplikat untuk pengarsipan
Menggunakan fitur Archiving dan Inbound Relay 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
Mengirim isi email ke S3 untuk penyimpanan
Mencatat entri ke dalam MySQL untuk setiap email untuk referensi silang
Membuat Duplikat dari Email
Di SparkPost, cara terbaik untuk mengarsipkan email adalah dengan membuat salinan identik dari email yang dirancang khusus untuk keperluan arsip. Ini dilakukan dengan menggunakan fitur Arsip SparkPost. Fitur Arsip SparkPost memberikan pengirim kemampuan untuk mengirim duplikat email ke satu atau lebih alamat email. Duplikat ini menggunakan pelacakan dan tautan buka yang sama dengan yang asli. Dokumentasi SparkPost mendefinisikan fitur Arsip dengan cara berikut:
Penerima dalam daftar arsip akan menerima replika persis dari pesan yang dikirim ke alamat RCPT TO. Secara khusus, tautan yang dikodekan untuk penerima RCPT TO akan identik dalam pesan arsip
Satu-satunya perbedaan antara salinan arsip ini dan email RCPT TO asli adalah beberapa tajuk akan berbeda karena alamat tujuan untuk email pengarsipan berbeda, tetapi isi email akan menjadi replika yang sama persis!
Jika Anda menginginkan penjelasan lebih mendalam, berikut adalah tautan ke dokumentasi SparkPost tentang membuat salinan duplikat (atau arsip) dari email. Contoh tajuk X-MSYS-API untuk proyek ini ditunjukkan nanti dalam blog ini.
Ada satu peringatan untuk pendekatan ini; sementara semua informasi peristiwa dalam email asli diikat bersama oleh transmission_id dan message_id, tidak ada informasi dalam peristiwa relay masuk (mekanisme untuk memperoleh dan menyebarkan email arsip) untuk email duplikat yang mengikat kembali ke salah satu dari kedua ID tersebut dan dengan demikian informasi untuk email asli. Ini berarti kita perlu meletakkan data dalam badan email dan tajuk email asli sebagai cara untuk mengikat semua data SparkPost dari email asli dan arsip.
Untuk membuat kode yang dimasukkan ke dalam badan email, saya menggunakan proses berikut dalam aplikasi pembuatan email.
Di suatu tempat dalam badan email, saya memasukkan entri input berikut:<input name="ArchiveCode" type="hidden" value="<<UID>>">
Lalu saya membuat kode unik dan mengganti bidang <<UID>>: $uid = md5(uniqid(rand(), true)); $emailBody = str_replace(“<<UID>>,$uid,$emailBody);
Berikut adalah contoh output:
<input name="ArchiveCode" type="hidden" value="00006365263145">
Selanjutnya, saya memastikan menambahkan $UID ke blok meta_data di tajuk X-MSYS-API. Langkah ini memastikan bahwa UID tertanam dalam setiap output peristiwa untuk email asli:
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>" } }
Sekarang kita memiliki cara untuk mengikat semua data dari email asli ke badan email dari arsip.
Di SparkPost, cara terbaik untuk mengarsipkan email adalah dengan membuat salinan identik dari email yang dirancang khusus untuk keperluan arsip. Ini dilakukan dengan menggunakan fitur Arsip SparkPost. Fitur Arsip SparkPost memberikan pengirim kemampuan untuk mengirim duplikat email ke satu atau lebih alamat email. Duplikat ini menggunakan pelacakan dan tautan buka yang sama dengan yang asli. Dokumentasi SparkPost mendefinisikan fitur Arsip dengan cara berikut:
Penerima dalam daftar arsip akan menerima replika persis dari pesan yang dikirim ke alamat RCPT TO. Secara khusus, tautan yang dikodekan untuk penerima RCPT TO akan identik dalam pesan arsip
Satu-satunya perbedaan antara salinan arsip ini dan email RCPT TO asli adalah beberapa tajuk akan berbeda karena alamat tujuan untuk email pengarsipan berbeda, tetapi isi email akan menjadi replika yang sama persis!
Jika Anda menginginkan penjelasan lebih mendalam, berikut adalah tautan ke dokumentasi SparkPost tentang membuat salinan duplikat (atau arsip) dari email. Contoh tajuk X-MSYS-API untuk proyek ini ditunjukkan nanti dalam blog ini.
Ada satu peringatan untuk pendekatan ini; sementara semua informasi peristiwa dalam email asli diikat bersama oleh transmission_id dan message_id, tidak ada informasi dalam peristiwa relay masuk (mekanisme untuk memperoleh dan menyebarkan email arsip) untuk email duplikat yang mengikat kembali ke salah satu dari kedua ID tersebut dan dengan demikian informasi untuk email asli. Ini berarti kita perlu meletakkan data dalam badan email dan tajuk email asli sebagai cara untuk mengikat semua data SparkPost dari email asli dan arsip.
Untuk membuat kode yang dimasukkan ke dalam badan email, saya menggunakan proses berikut dalam aplikasi pembuatan email.
Di suatu tempat dalam badan email, saya memasukkan entri input berikut:<input name="ArchiveCode" type="hidden" value="<<UID>>">
Lalu saya membuat kode unik dan mengganti bidang <<UID>>: $uid = md5(uniqid(rand(), true)); $emailBody = str_replace(“<<UID>>,$uid,$emailBody);
Berikut adalah contoh output:
<input name="ArchiveCode" type="hidden" value="00006365263145">
Selanjutnya, saya memastikan menambahkan $UID ke blok meta_data di tajuk X-MSYS-API. Langkah ini memastikan bahwa UID tertanam dalam setiap output peristiwa untuk email asli:
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>" } }
Sekarang kita memiliki cara untuk mengikat semua data dari email asli ke badan email dari arsip.
Di SparkPost, cara terbaik untuk mengarsipkan email adalah dengan membuat salinan identik dari email yang dirancang khusus untuk keperluan arsip. Ini dilakukan dengan menggunakan fitur Arsip SparkPost. Fitur Arsip SparkPost memberikan pengirim kemampuan untuk mengirim duplikat email ke satu atau lebih alamat email. Duplikat ini menggunakan pelacakan dan tautan buka yang sama dengan yang asli. Dokumentasi SparkPost mendefinisikan fitur Arsip dengan cara berikut:
Penerima dalam daftar arsip akan menerima replika persis dari pesan yang dikirim ke alamat RCPT TO. Secara khusus, tautan yang dikodekan untuk penerima RCPT TO akan identik dalam pesan arsip
Satu-satunya perbedaan antara salinan arsip ini dan email RCPT TO asli adalah beberapa tajuk akan berbeda karena alamat tujuan untuk email pengarsipan berbeda, tetapi isi email akan menjadi replika yang sama persis!
Jika Anda menginginkan penjelasan lebih mendalam, berikut adalah tautan ke dokumentasi SparkPost tentang membuat salinan duplikat (atau arsip) dari email. Contoh tajuk X-MSYS-API untuk proyek ini ditunjukkan nanti dalam blog ini.
Ada satu peringatan untuk pendekatan ini; sementara semua informasi peristiwa dalam email asli diikat bersama oleh transmission_id dan message_id, tidak ada informasi dalam peristiwa relay masuk (mekanisme untuk memperoleh dan menyebarkan email arsip) untuk email duplikat yang mengikat kembali ke salah satu dari kedua ID tersebut dan dengan demikian informasi untuk email asli. Ini berarti kita perlu meletakkan data dalam badan email dan tajuk email asli sebagai cara untuk mengikat semua data SparkPost dari email asli dan arsip.
Untuk membuat kode yang dimasukkan ke dalam badan email, saya menggunakan proses berikut dalam aplikasi pembuatan email.
Di suatu tempat dalam badan email, saya memasukkan entri input berikut:<input name="ArchiveCode" type="hidden" value="<<UID>>">
Lalu saya membuat kode unik dan mengganti bidang <<UID>>: $uid = md5(uniqid(rand(), true)); $emailBody = str_replace(“<<UID>>,$uid,$emailBody);
Berikut adalah contoh output:
<input name="ArchiveCode" type="hidden" value="00006365263145">
Selanjutnya, saya memastikan menambahkan $UID ke blok meta_data di tajuk X-MSYS-API. Langkah ini memastikan bahwa UID tertanam dalam setiap output peristiwa untuk email asli:
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>" } }
Sekarang kita memiliki cara untuk mengikat semua data dari email asli ke badan email dari arsip.
Mendapatkan versi Archive
Untuk mendapatkan salinan email untuk arsip, Anda perlu melakukan langkah-langkah berikut:
Buat subdomain yang akan Anda gunakan untuk mengirim semua email arsip (duplikat)
Setel catatan DNS yang sesuai agar semua email yang dikirim ke subdomain tersebut diarahkan ke SparkPost
Buat domain inbound di SparkPost
Buat webhook inbound di SparkPost
Buat aplikasi (kolektor) untuk menerima aliran data webhook dari SparkPost
Dua tautan berikut dapat digunakan untuk membantu memandu Anda melalui proses ini:
Dokumen teknis SparkPost: Enabling Inbound Email Relaying & Relay Webhooks
Selain itu, blog yang saya tulis tahun lalu, Archiving Emails: A How-To Guide for Tracking Sent Mail akan membimbing Anda melalui pembuatan relay inbound dalam SparkPost
* Catatan: mulai Oktober 2018, fitur Arsip hanya berfungsi saat mengirim email menggunakan koneksi SMTP ke SparkPost, API RESTful tidak mendukung fitur ini. Mungkin itu bukan masalah karena sebagian besar email yang memerlukan kontrol audit tingkat ini cenderung merupakan email yang dipersonalisasi sepenuhnya yang dibangun oleh aplikasi backend sebelum pengiriman email diperlukan.
Untuk mendapatkan salinan email untuk arsip, Anda perlu melakukan langkah-langkah berikut:
Buat subdomain yang akan Anda gunakan untuk mengirim semua email arsip (duplikat)
Setel catatan DNS yang sesuai agar semua email yang dikirim ke subdomain tersebut diarahkan ke SparkPost
Buat domain inbound di SparkPost
Buat webhook inbound di SparkPost
Buat aplikasi (kolektor) untuk menerima aliran data webhook dari SparkPost
Dua tautan berikut dapat digunakan untuk membantu memandu Anda melalui proses ini:
Dokumen teknis SparkPost: Enabling Inbound Email Relaying & Relay Webhooks
Selain itu, blog yang saya tulis tahun lalu, Archiving Emails: A How-To Guide for Tracking Sent Mail akan membimbing Anda melalui pembuatan relay inbound dalam SparkPost
* Catatan: mulai Oktober 2018, fitur Arsip hanya berfungsi saat mengirim email menggunakan koneksi SMTP ke SparkPost, API RESTful tidak mendukung fitur ini. Mungkin itu bukan masalah karena sebagian besar email yang memerlukan kontrol audit tingkat ini cenderung merupakan email yang dipersonalisasi sepenuhnya yang dibangun oleh aplikasi backend sebelum pengiriman email diperlukan.
Untuk mendapatkan salinan email untuk arsip, Anda perlu melakukan langkah-langkah berikut:
Buat subdomain yang akan Anda gunakan untuk mengirim semua email arsip (duplikat)
Setel catatan DNS yang sesuai agar semua email yang dikirim ke subdomain tersebut diarahkan ke SparkPost
Buat domain inbound di SparkPost
Buat webhook inbound di SparkPost
Buat aplikasi (kolektor) untuk menerima aliran data webhook dari SparkPost
Dua tautan berikut dapat digunakan untuk membantu memandu Anda melalui proses ini:
Dokumen teknis SparkPost: Enabling Inbound Email Relaying & Relay Webhooks
Selain itu, blog yang saya tulis tahun lalu, Archiving Emails: A How-To Guide for Tracking Sent Mail akan membimbing Anda melalui pembuatan relay inbound dalam SparkPost
* Catatan: mulai Oktober 2018, fitur Arsip hanya berfungsi saat mengirim email menggunakan koneksi SMTP ke SparkPost, API RESTful tidak mendukung fitur ini. Mungkin itu bukan masalah karena sebagian besar email yang memerlukan kontrol audit tingkat ini cenderung merupakan email yang dipersonalisasi sepenuhnya yang dibangun oleh aplikasi backend sebelum pengiriman email diperlukan.
Memperoleh email duplikat dalam struktur JSON
Pada fase pertama proyek ini, semua yang saya simpan adalah format email rfc822 di S3 dan beberapa bidang deskripsi tingkat tinggi ke dalam tabel SQL untuk pencarian. Karena SparkPost akan mengirim data email dalam struktur JSON ke platform pengarsipan saya melalui aliran data webhook, saya membangun aplikasi (sering disebut collector) yang menerima aliran data Relay_Webhook.
Setiap paket dari SparkPost Relay_Webhook akan berisi informasi satu email duplikat pada suatu waktu, jadi memecah struktur JSON ke dalam komponen yang ditargetkan untuk proyek ini cukup mudah. Dalam kode PHP saya, mendapatkan email berformat rfc822 semudah beberapa baris kode berikut:
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']; }
Beberapa informasi yang ingin saya simpan ke dalam tabel SQL saya berada dalam array bidang header. Jadi saya menulis fungsi kecil yang menerima array header dan mengulangi array tersebut untuk mendapatkan data yang saya minati untuk disimpan:
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; } } } }
Sekarang saya memiliki data, saya siap untuk menyimpan body ke S3.
Pada fase pertama proyek ini, semua yang saya simpan adalah format email rfc822 di S3 dan beberapa bidang deskripsi tingkat tinggi ke dalam tabel SQL untuk pencarian. Karena SparkPost akan mengirim data email dalam struktur JSON ke platform pengarsipan saya melalui aliran data webhook, saya membangun aplikasi (sering disebut collector) yang menerima aliran data Relay_Webhook.
Setiap paket dari SparkPost Relay_Webhook akan berisi informasi satu email duplikat pada suatu waktu, jadi memecah struktur JSON ke dalam komponen yang ditargetkan untuk proyek ini cukup mudah. Dalam kode PHP saya, mendapatkan email berformat rfc822 semudah beberapa baris kode berikut:
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']; }
Beberapa informasi yang ingin saya simpan ke dalam tabel SQL saya berada dalam array bidang header. Jadi saya menulis fungsi kecil yang menerima array header dan mengulangi array tersebut untuk mendapatkan data yang saya minati untuk disimpan:
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; } } } }
Sekarang saya memiliki data, saya siap untuk menyimpan body ke S3.
Pada fase pertama proyek ini, semua yang saya simpan adalah format email rfc822 di S3 dan beberapa bidang deskripsi tingkat tinggi ke dalam tabel SQL untuk pencarian. Karena SparkPost akan mengirim data email dalam struktur JSON ke platform pengarsipan saya melalui aliran data webhook, saya membangun aplikasi (sering disebut collector) yang menerima aliran data Relay_Webhook.
Setiap paket dari SparkPost Relay_Webhook akan berisi informasi satu email duplikat pada suatu waktu, jadi memecah struktur JSON ke dalam komponen yang ditargetkan untuk proyek ini cukup mudah. Dalam kode PHP saya, mendapatkan email berformat rfc822 semudah beberapa baris kode berikut:
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']; }
Beberapa informasi yang ingin saya simpan ke dalam tabel SQL saya berada dalam array bidang header. Jadi saya menulis fungsi kecil yang menerima array header dan mengulangi array tersebut untuk mendapatkan data yang saya minati untuk disimpan:
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; } } } }
Sekarang saya memiliki data, saya siap untuk menyimpan body ke S3.
Menyimpan email duplikat di S3
Maaf mengecewakan Anda, tetapi saya tidak akan memberikan tutorial langkah demi langkah tentang membuat S3 bucket untuk menyimpan email atau menjelaskan cara membuat kunci akses yang diperlukan untuk aplikasi Anda dalam mengunggah konten ke bucket; ada tutorial yang lebih baik tentang topik ini daripada yang bisa saya tulis. Berikut beberapa artikel yang dapat membantu:
https://docs.aws.amazon.com/quickstarts/latest/s3backup/step-1-create-bucket.html
https://aws.amazon.com/blogs/security/wheres-my-secret-access-key/
Apa yang akan saya lakukan adalah menunjukkan beberapa pengaturan yang saya pilih terkait dengan proyek seperti ini.
Kontrol Akses. Anda tidak hanya perlu mengatur keamanan untuk bucket, tetapi Anda juga perlu mengatur izin untuk item itu sendiri. Dalam proyek saya, saya menggunakan kebijakan yang sangat terbuka yaitu public-read karena data sampel tidak bersifat pribadi dan saya ingin akses mudah ke data tersebut. Anda mungkin ingin kebijakan ACL yang jauh lebih ketat. Berikut adalah artikel bagus tentang pengaturan ACL: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html
Mengarsipkan Arsip. Di S3 ada sesuatu yang disebut Lifecycle Management. Ini memungkinkan Anda memindahkan data dari satu jenis kelas penyimpanan S3 ke yang lain. Kelas penyimpanan yang berbeda mewakili jumlah akses yang Anda butuhkan ke data yang disimpan dengan biaya lebih rendah terkait dengan penyimpanan yang paling jarang Anda akses. Panduan yang baik tentang kelas yang berbeda dan transisi melalui mereka dapat ditemukan dalam panduan AWS yang disebut Transitioning Objects. Dalam kasus saya, saya memilih untuk membuat masa siklus yang memindahkan setiap objek dari Standar ke Glacier setelah satu tahun. Akses Glacier jauh lebih murah daripada arsip S3 standar dan akan menghemat biaya penyimpanan saya.
Setelah saya membuat S3 bucket dan menyiapkan pengaturan saya, S3 siap untuk saya mengunggah email yang sesuai dengan rfc822 yang saya peroleh dari aliran data SparkPost Relay Webhook. Namun sebelum mengunggah payload email rfc822 ke S3, saya perlu membuat nama file unik yang akan saya gunakan untuk menyimpan email tersebut.
Untuk nama file unik, saya akan mencari pada tubuh email untuk id tersembunyi yang ditempatkan aplikasi pengirim ke dalam email dan menggunakan id tersebut sebagai nama file. Ada cara yang lebih elegan untuk menarik connectorId dari tubuh html, tetapi demi kesederhanaan dan kejelasan saya akan menggunakan kode berikut:
$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); } } }
* kami berasumsi bahwa $inputField memegang nilai “ArchiveCode” dan ditemukan dalam file config.php saya.
Dengan UID, kita kemudian dapat membuat nama file yang akan digunakan di S3:
$fileName = $ArchiveDirectory . '/' . $UID . '.eml';
Sekarang saya dapat membuka koneksi saya ke S3 dan mengunggah file tersebut. Jika Anda melihat file s3.php di repositori GitHub Anda akan melihat bahwa dibutuhkan sangat sedikit kode untuk mengunggah file tersebut.
Langkah terakhir saya adalah mencatat entri ini ke dalam tabel MYSQL.
Maaf mengecewakan Anda, tetapi saya tidak akan memberikan tutorial langkah demi langkah tentang membuat S3 bucket untuk menyimpan email atau menjelaskan cara membuat kunci akses yang diperlukan untuk aplikasi Anda dalam mengunggah konten ke bucket; ada tutorial yang lebih baik tentang topik ini daripada yang bisa saya tulis. Berikut beberapa artikel yang dapat membantu:
https://docs.aws.amazon.com/quickstarts/latest/s3backup/step-1-create-bucket.html
https://aws.amazon.com/blogs/security/wheres-my-secret-access-key/
Apa yang akan saya lakukan adalah menunjukkan beberapa pengaturan yang saya pilih terkait dengan proyek seperti ini.
Kontrol Akses. Anda tidak hanya perlu mengatur keamanan untuk bucket, tetapi Anda juga perlu mengatur izin untuk item itu sendiri. Dalam proyek saya, saya menggunakan kebijakan yang sangat terbuka yaitu public-read karena data sampel tidak bersifat pribadi dan saya ingin akses mudah ke data tersebut. Anda mungkin ingin kebijakan ACL yang jauh lebih ketat. Berikut adalah artikel bagus tentang pengaturan ACL: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html
Mengarsipkan Arsip. Di S3 ada sesuatu yang disebut Lifecycle Management. Ini memungkinkan Anda memindahkan data dari satu jenis kelas penyimpanan S3 ke yang lain. Kelas penyimpanan yang berbeda mewakili jumlah akses yang Anda butuhkan ke data yang disimpan dengan biaya lebih rendah terkait dengan penyimpanan yang paling jarang Anda akses. Panduan yang baik tentang kelas yang berbeda dan transisi melalui mereka dapat ditemukan dalam panduan AWS yang disebut Transitioning Objects. Dalam kasus saya, saya memilih untuk membuat masa siklus yang memindahkan setiap objek dari Standar ke Glacier setelah satu tahun. Akses Glacier jauh lebih murah daripada arsip S3 standar dan akan menghemat biaya penyimpanan saya.
Setelah saya membuat S3 bucket dan menyiapkan pengaturan saya, S3 siap untuk saya mengunggah email yang sesuai dengan rfc822 yang saya peroleh dari aliran data SparkPost Relay Webhook. Namun sebelum mengunggah payload email rfc822 ke S3, saya perlu membuat nama file unik yang akan saya gunakan untuk menyimpan email tersebut.
Untuk nama file unik, saya akan mencari pada tubuh email untuk id tersembunyi yang ditempatkan aplikasi pengirim ke dalam email dan menggunakan id tersebut sebagai nama file. Ada cara yang lebih elegan untuk menarik connectorId dari tubuh html, tetapi demi kesederhanaan dan kejelasan saya akan menggunakan kode berikut:
$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); } } }
* kami berasumsi bahwa $inputField memegang nilai “ArchiveCode” dan ditemukan dalam file config.php saya.
Dengan UID, kita kemudian dapat membuat nama file yang akan digunakan di S3:
$fileName = $ArchiveDirectory . '/' . $UID . '.eml';
Sekarang saya dapat membuka koneksi saya ke S3 dan mengunggah file tersebut. Jika Anda melihat file s3.php di repositori GitHub Anda akan melihat bahwa dibutuhkan sangat sedikit kode untuk mengunggah file tersebut.
Langkah terakhir saya adalah mencatat entri ini ke dalam tabel MYSQL.
Maaf mengecewakan Anda, tetapi saya tidak akan memberikan tutorial langkah demi langkah tentang membuat S3 bucket untuk menyimpan email atau menjelaskan cara membuat kunci akses yang diperlukan untuk aplikasi Anda dalam mengunggah konten ke bucket; ada tutorial yang lebih baik tentang topik ini daripada yang bisa saya tulis. Berikut beberapa artikel yang dapat membantu:
https://docs.aws.amazon.com/quickstarts/latest/s3backup/step-1-create-bucket.html
https://aws.amazon.com/blogs/security/wheres-my-secret-access-key/
Apa yang akan saya lakukan adalah menunjukkan beberapa pengaturan yang saya pilih terkait dengan proyek seperti ini.
Kontrol Akses. Anda tidak hanya perlu mengatur keamanan untuk bucket, tetapi Anda juga perlu mengatur izin untuk item itu sendiri. Dalam proyek saya, saya menggunakan kebijakan yang sangat terbuka yaitu public-read karena data sampel tidak bersifat pribadi dan saya ingin akses mudah ke data tersebut. Anda mungkin ingin kebijakan ACL yang jauh lebih ketat. Berikut adalah artikel bagus tentang pengaturan ACL: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html
Mengarsipkan Arsip. Di S3 ada sesuatu yang disebut Lifecycle Management. Ini memungkinkan Anda memindahkan data dari satu jenis kelas penyimpanan S3 ke yang lain. Kelas penyimpanan yang berbeda mewakili jumlah akses yang Anda butuhkan ke data yang disimpan dengan biaya lebih rendah terkait dengan penyimpanan yang paling jarang Anda akses. Panduan yang baik tentang kelas yang berbeda dan transisi melalui mereka dapat ditemukan dalam panduan AWS yang disebut Transitioning Objects. Dalam kasus saya, saya memilih untuk membuat masa siklus yang memindahkan setiap objek dari Standar ke Glacier setelah satu tahun. Akses Glacier jauh lebih murah daripada arsip S3 standar dan akan menghemat biaya penyimpanan saya.
Setelah saya membuat S3 bucket dan menyiapkan pengaturan saya, S3 siap untuk saya mengunggah email yang sesuai dengan rfc822 yang saya peroleh dari aliran data SparkPost Relay Webhook. Namun sebelum mengunggah payload email rfc822 ke S3, saya perlu membuat nama file unik yang akan saya gunakan untuk menyimpan email tersebut.
Untuk nama file unik, saya akan mencari pada tubuh email untuk id tersembunyi yang ditempatkan aplikasi pengirim ke dalam email dan menggunakan id tersebut sebagai nama file. Ada cara yang lebih elegan untuk menarik connectorId dari tubuh html, tetapi demi kesederhanaan dan kejelasan saya akan menggunakan kode berikut:
$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); } } }
* kami berasumsi bahwa $inputField memegang nilai “ArchiveCode” dan ditemukan dalam file config.php saya.
Dengan UID, kita kemudian dapat membuat nama file yang akan digunakan di S3:
$fileName = $ArchiveDirectory . '/' . $UID . '.eml';
Sekarang saya dapat membuka koneksi saya ke S3 dan mengunggah file tersebut. Jika Anda melihat file s3.php di repositori GitHub Anda akan melihat bahwa dibutuhkan sangat sedikit kode untuk mengunggah file tersebut.
Langkah terakhir saya adalah mencatat entri ini ke dalam tabel MYSQL.
Menyimpan Meta Data di MySQL
Kami telah mengumpulkan semua data yang diperlukan pada langkah sebelumnya, jadi langkah penyimpanan menjadi mudah. Pada fase pertama ini, saya memilih untuk membuat tabel dengan bidang berikut:
MySQL Metadata Fields
Field | Tujuan |
Tanggal/waktu (otomatis) | Waktu ketika entri dicatat |
RCPT_TO alamat | Alamat email tujuan untuk pesan yang diarsipkan |
Penanda waktu header DATE | Waktu pengiriman email asli |
HEADER SUBJECT | Baris subjek untuk pengindeksan dan pencarian |
HEADER FROM | Pengidentifikasi 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 menjalankan langkah-langkah yang diperlukan untuk membuka tautan ke MySQL, menyuntikkan baris baru, menguji hasilnya, dan menutup tautan. Saya menambahkan satu langkah lain untuk jaga-jaga yaitu mencatat data ini ke dalam file teks. Haruskah saya melakukan lebih banyak pencatatan untuk kesalahan? Ya. Tetapi saya ingin menjaga kode ini tetap ringan agar dapat berjalan sangat cepat. Terkadang kode ini akan dipanggil ratusan kali per menit dan harus seefisien mungkin. Dalam pembaruan mendatang, saya akan menambahkan kode tambahan yang akan memproses kegagalan dan mengirim email kegagalan tersebut ke admin untuk pemantauan.
Kami telah mengumpulkan semua data yang diperlukan pada langkah sebelumnya, jadi langkah penyimpanan menjadi mudah. Pada fase pertama ini, saya memilih untuk membuat tabel dengan bidang berikut:
MySQL Metadata Fields
Field | Tujuan |
Tanggal/waktu (otomatis) | Waktu ketika entri dicatat |
RCPT_TO alamat | Alamat email tujuan untuk pesan yang diarsipkan |
Penanda waktu header DATE | Waktu pengiriman email asli |
HEADER SUBJECT | Baris subjek untuk pengindeksan dan pencarian |
HEADER FROM | Pengidentifikasi 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 menjalankan langkah-langkah yang diperlukan untuk membuka tautan ke MySQL, menyuntikkan baris baru, menguji hasilnya, dan menutup tautan. Saya menambahkan satu langkah lain untuk jaga-jaga yaitu mencatat data ini ke dalam file teks. Haruskah saya melakukan lebih banyak pencatatan untuk kesalahan? Ya. Tetapi saya ingin menjaga kode ini tetap ringan agar dapat berjalan sangat cepat. Terkadang kode ini akan dipanggil ratusan kali per menit dan harus seefisien mungkin. Dalam pembaruan mendatang, saya akan menambahkan kode tambahan yang akan memproses kegagalan dan mengirim email kegagalan tersebut ke admin untuk pemantauan.
Kami telah mengumpulkan semua data yang diperlukan pada langkah sebelumnya, jadi langkah penyimpanan menjadi mudah. Pada fase pertama ini, saya memilih untuk membuat tabel dengan bidang berikut:
MySQL Metadata Fields
Field | Tujuan |
Tanggal/waktu (otomatis) | Waktu ketika entri dicatat |
RCPT_TO alamat | Alamat email tujuan untuk pesan yang diarsipkan |
Penanda waktu header DATE | Waktu pengiriman email asli |
HEADER SUBJECT | Baris subjek untuk pengindeksan dan pencarian |
HEADER FROM | Pengidentifikasi 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 menjalankan langkah-langkah yang diperlukan untuk membuka tautan ke MySQL, menyuntikkan baris baru, menguji hasilnya, dan menutup tautan. Saya menambahkan satu langkah lain untuk jaga-jaga yaitu mencatat data ini ke dalam file teks. Haruskah saya melakukan lebih banyak pencatatan untuk kesalahan? Ya. Tetapi saya ingin menjaga kode ini tetap ringan agar dapat berjalan sangat cepat. Terkadang kode ini akan dipanggil ratusan kali per menit dan harus seefisien mungkin. Dalam pembaruan mendatang, saya akan menambahkan kode tambahan yang akan memproses kegagalan dan mengirim email kegagalan tersebut ke admin untuk pemantauan.
Menyelesaikannya
Jadi dalam beberapa langkah yang cukup mudah, kami dapat menjelajahi fase pertama dalam membangun sistem pengarsipan email yang kuat yang menyimpan duplikat email di S3 dan mereferensikan data di tabel MySQL. Ini akan memberi kami fondasi untuk sisa proyek yang akan ditangani dalam beberapa postingan mendatang.
Dalam revisi proyek ini di masa depan, saya berharap untuk:
Menyimpan semua log acara dari email asli
Mengirimkan kesalahan penyimpanan kepada admin ketika terjadi kegagalan untuk mengunggah atau mencatat
Meminimalkan kompleksitas kolektor.
Menambahkan UI untuk melihat semua data
Mendukung kemampuan untuk mengirim ulang email
Sementara itu, saya berharap proyek ini telah menarik dan bermanfaat bagi Anda; selamat mengirim.
Jadi dalam beberapa langkah yang cukup mudah, kami dapat menjelajahi fase pertama dalam membangun sistem pengarsipan email yang kuat yang menyimpan duplikat email di S3 dan mereferensikan data di tabel MySQL. Ini akan memberi kami fondasi untuk sisa proyek yang akan ditangani dalam beberapa postingan mendatang.
Dalam revisi proyek ini di masa depan, saya berharap untuk:
Menyimpan semua log acara dari email asli
Mengirimkan kesalahan penyimpanan kepada admin ketika terjadi kegagalan untuk mengunggah atau mencatat
Meminimalkan kompleksitas kolektor.
Menambahkan UI untuk melihat semua data
Mendukung kemampuan untuk mengirim ulang email
Sementara itu, saya berharap proyek ini telah menarik dan bermanfaat bagi Anda; selamat mengirim.
Jadi dalam beberapa langkah yang cukup mudah, kami dapat menjelajahi fase pertama dalam membangun sistem pengarsipan email yang kuat yang menyimpan duplikat email di S3 dan mereferensikan data di tabel MySQL. Ini akan memberi kami fondasi untuk sisa proyek yang akan ditangani dalam beberapa postingan mendatang.
Dalam revisi proyek ini di masa depan, saya berharap untuk:
Menyimpan semua log acara dari email asli
Mengirimkan kesalahan penyimpanan kepada admin ketika terjadi kegagalan untuk mengunggah atau mencatat
Meminimalkan kompleksitas kolektor.
Menambahkan UI untuk melihat semua data
Mendukung kemampuan untuk mengirim ulang email
Sementara itu, saya berharap proyek ini telah menarik dan bermanfaat bagi Anda; selamat mengirim.



