Membangun Sistem Pengarsipan Email: Menyimpan Isi Email

Burung

4 Mar 2019

Email

1 min read

Membangun Sistem Pengarsipan Email: Menyimpan Isi Email

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:

      1. 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.

      2. Pemrograman data melalui UID: Sertakan pengidentifikasi unik (UID) ke dalam tubuh email dan metadata X-MSYS-API untuk menghubungkan pesan asli dan yang diarsipkan.

      3. Proses masuk: Konfigurasikan domain masuk dan webhook di SparkPost untuk menerima payload JSON email yang diarsipkan melalui pengumpul aplikasi.

      4. 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.

      5. Mencatat metadata di MySQL: Simpan bidang kunci seperti RCPT_TO, FROM, SUBJECT, dan nama file S3 untuk pengindeksan pencarian dan pengambilan di masa mendatang.

      6. 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:

  1. Membuat email duplikat untuk pengarsipan

  2. 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)

  3. Membongkar struktur JSON untuk mendapatkan komponen yang diperlukan

  4. Kirim isi email ke S3 untuk penyimpanan

  5. Catat entri ke MySQL untuk setiap email untuk referensi silang

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:

  1. Membuat email duplikat untuk pengarsipan

  2. 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)

  3. Membongkar struktur JSON untuk mendapatkan komponen yang diperlukan

  4. Kirim isi email ke S3 untuk penyimpanan

  5. Catat entri ke MySQL untuk setiap email untuk referensi silang

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:

  1. Membuat email duplikat untuk pengarsipan

  2. 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)

  3. Membongkar struktur JSON untuk mendapatkan komponen yang diperlukan

  4. Kirim isi email ke S3 untuk penyimpanan

  5. Catat entri ke MySQL untuk setiap email untuk referensi silang

Membuat Duplikat Email

Di SparkPost, cara terbaik untuk mengarsipkan email adalah dengan membuat salinan identik dari email yang dirancang khusus untuk tujuan arsip. Ini dilakukan dengan menggunakan fitur Arsip SparkPost. Fitur Arsip SparkPost memberikan kemampuan kepada pengirim untuk mengirim duplikat email ke satu atau lebih alamat email.  Duplikat ini menggunakan tautan pelacakan dan buka yang sama seperti yang asli. Dokumentasi SparkPost mendefinisikan fitur Arsip sebagai berikut:

Penerima dalam daftar arsip akan menerima replika tepat dari pesan yang dikirim ke alamat RCPT TO. Secara khusus, setiap tautan yang dikodekan yang dimaksudkan untuk penerima RCPT TO akan identik dalam pesan arsip

Satu-satunya perbedaan antara salinan arsip ini dan email RCPT TO yang asli adalah bahwa beberapa header akan berbeda karena alamat target untuk email pengarsipan berbeda, tetapi badan email akan menjadi replika yang tepat!

Jika Anda ingin penjelasan yang lebih mendalam, berikut adalah tautan ke dokumentasi SparkPost tentang cara membuat salinan duplikat (atau arsip) dari sebuah email. Contoh header X-MSYS-API untuk proyek ini ditampilkan kemudian dalam blog ini.

Ada satu peringatan untuk pendekatan ini; sementara semua informasi peristiwa dalam email asli terikat bersama oleh baik transmission_id dan message_id, tidak ada informasi dalam peristiwa relay masuk (mekanisme untuk memperoleh dan menyebarkan email arsip) untuk email duplikat yang terhubung kembali ke salah satu dari dua id itu dan karenanya informasi untuk email asli. Ini berarti kita perlu menempatkan data di dalam badan email dan header dari email asli sebagai cara untuk menghubungkan semua data SparkPost dari email asli dan email arsip.

Untuk menciptakan kode yang dimasukkan ke dalam badan email, saya menggunakan proses berikut dalam aplikasi pembuatan email.

  1. Di suatu tempat di dalam badan email, saya menempatkan entri input berikut:<input name="ArchiveCode" type="hidden" value="<<UID>>">

  2. Kemudian saya membuat kode unik dan mengganti field <<UID>>: $uid = md5(uniqid(rand(), true)); $emailBody = str_replace(“<<UID>>,$uid,$emailBody);

    Berikut adalah contoh keluaran:

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

  3. Selanjutnya, saya memastikan bahwa saya menambahkan $UID ke blok meta_data dari header X-MSYS-API. Langkah ini memastikan bahwa UID tertanam ke dalam setiap keluaran 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 menghubungkan semua data dari email asli ke badan email arsip.

Di SparkPost, cara terbaik untuk mengarsipkan email adalah dengan membuat salinan identik dari email yang dirancang khusus untuk tujuan arsip. Ini dilakukan dengan menggunakan fitur Arsip SparkPost. Fitur Arsip SparkPost memberikan kemampuan kepada pengirim untuk mengirim duplikat email ke satu atau lebih alamat email.  Duplikat ini menggunakan tautan pelacakan dan buka yang sama seperti yang asli. Dokumentasi SparkPost mendefinisikan fitur Arsip sebagai berikut:

Penerima dalam daftar arsip akan menerima replika tepat dari pesan yang dikirim ke alamat RCPT TO. Secara khusus, setiap tautan yang dikodekan yang dimaksudkan untuk penerima RCPT TO akan identik dalam pesan arsip

Satu-satunya perbedaan antara salinan arsip ini dan email RCPT TO yang asli adalah bahwa beberapa header akan berbeda karena alamat target untuk email pengarsipan berbeda, tetapi badan email akan menjadi replika yang tepat!

Jika Anda ingin penjelasan yang lebih mendalam, berikut adalah tautan ke dokumentasi SparkPost tentang cara membuat salinan duplikat (atau arsip) dari sebuah email. Contoh header X-MSYS-API untuk proyek ini ditampilkan kemudian dalam blog ini.

Ada satu peringatan untuk pendekatan ini; sementara semua informasi peristiwa dalam email asli terikat bersama oleh baik transmission_id dan message_id, tidak ada informasi dalam peristiwa relay masuk (mekanisme untuk memperoleh dan menyebarkan email arsip) untuk email duplikat yang terhubung kembali ke salah satu dari dua id itu dan karenanya informasi untuk email asli. Ini berarti kita perlu menempatkan data di dalam badan email dan header dari email asli sebagai cara untuk menghubungkan semua data SparkPost dari email asli dan email arsip.

Untuk menciptakan kode yang dimasukkan ke dalam badan email, saya menggunakan proses berikut dalam aplikasi pembuatan email.

  1. Di suatu tempat di dalam badan email, saya menempatkan entri input berikut:<input name="ArchiveCode" type="hidden" value="<<UID>>">

  2. Kemudian saya membuat kode unik dan mengganti field <<UID>>: $uid = md5(uniqid(rand(), true)); $emailBody = str_replace(“<<UID>>,$uid,$emailBody);

    Berikut adalah contoh keluaran:

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

  3. Selanjutnya, saya memastikan bahwa saya menambahkan $UID ke blok meta_data dari header X-MSYS-API. Langkah ini memastikan bahwa UID tertanam ke dalam setiap keluaran 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 menghubungkan semua data dari email asli ke badan email arsip.

Di SparkPost, cara terbaik untuk mengarsipkan email adalah dengan membuat salinan identik dari email yang dirancang khusus untuk tujuan arsip. Ini dilakukan dengan menggunakan fitur Arsip SparkPost. Fitur Arsip SparkPost memberikan kemampuan kepada pengirim untuk mengirim duplikat email ke satu atau lebih alamat email.  Duplikat ini menggunakan tautan pelacakan dan buka yang sama seperti yang asli. Dokumentasi SparkPost mendefinisikan fitur Arsip sebagai berikut:

Penerima dalam daftar arsip akan menerima replika tepat dari pesan yang dikirim ke alamat RCPT TO. Secara khusus, setiap tautan yang dikodekan yang dimaksudkan untuk penerima RCPT TO akan identik dalam pesan arsip

Satu-satunya perbedaan antara salinan arsip ini dan email RCPT TO yang asli adalah bahwa beberapa header akan berbeda karena alamat target untuk email pengarsipan berbeda, tetapi badan email akan menjadi replika yang tepat!

Jika Anda ingin penjelasan yang lebih mendalam, berikut adalah tautan ke dokumentasi SparkPost tentang cara membuat salinan duplikat (atau arsip) dari sebuah email. Contoh header X-MSYS-API untuk proyek ini ditampilkan kemudian dalam blog ini.

Ada satu peringatan untuk pendekatan ini; sementara semua informasi peristiwa dalam email asli terikat bersama oleh baik transmission_id dan message_id, tidak ada informasi dalam peristiwa relay masuk (mekanisme untuk memperoleh dan menyebarkan email arsip) untuk email duplikat yang terhubung kembali ke salah satu dari dua id itu dan karenanya informasi untuk email asli. Ini berarti kita perlu menempatkan data di dalam badan email dan header dari email asli sebagai cara untuk menghubungkan semua data SparkPost dari email asli dan email arsip.

Untuk menciptakan kode yang dimasukkan ke dalam badan email, saya menggunakan proses berikut dalam aplikasi pembuatan email.

  1. Di suatu tempat di dalam badan email, saya menempatkan entri input berikut:<input name="ArchiveCode" type="hidden" value="<<UID>>">

  2. Kemudian saya membuat kode unik dan mengganti field <<UID>>: $uid = md5(uniqid(rand(), true)); $emailBody = str_replace(“<<UID>>,$uid,$emailBody);

    Berikut adalah contoh keluaran:

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

  3. Selanjutnya, saya memastikan bahwa saya menambahkan $UID ke blok meta_data dari header X-MSYS-API. Langkah ini memastikan bahwa UID tertanam ke dalam setiap keluaran 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 menghubungkan semua data dari email asli ke badan email arsip.

Mendapatkan versi Arsip

Untuk mendapatkan salinan email untuk arsip, Anda perlu melakukan langkah-langkah berikut:

  1. Buat subdomain yang akan Anda kirim semua email arsip (duplikat) ke

  2. Atur catatan DNS yang tepat agar semua email yang dikirim ke subdomain tersebut diarahkan ke SparkPost

  3. Buat domain masuk di SparkPost

  4. Buat webhook masuk di SparkPost

  5. Buat aplikasi (pengumpul) untuk menerima aliran data webhook SparkPost

Dua tautan berikut dapat digunakan untuk membantu memandu Anda melalui proses ini:

  1. Dokumen teknis SparkPost: Mengaktifkan Pengalihan Email Masuk & Webhook Pengalihan

  2. 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.

Untuk mendapatkan salinan email untuk arsip, Anda perlu melakukan langkah-langkah berikut:

  1. Buat subdomain yang akan Anda kirim semua email arsip (duplikat) ke

  2. Atur catatan DNS yang tepat agar semua email yang dikirim ke subdomain tersebut diarahkan ke SparkPost

  3. Buat domain masuk di SparkPost

  4. Buat webhook masuk di SparkPost

  5. Buat aplikasi (pengumpul) untuk menerima aliran data webhook SparkPost

Dua tautan berikut dapat digunakan untuk membantu memandu Anda melalui proses ini:

  1. Dokumen teknis SparkPost: Mengaktifkan Pengalihan Email Masuk & Webhook Pengalihan

  2. 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.

Untuk mendapatkan salinan email untuk arsip, Anda perlu melakukan langkah-langkah berikut:

  1. Buat subdomain yang akan Anda kirim semua email arsip (duplikat) ke

  2. Atur catatan DNS yang tepat agar semua email yang dikirim ke subdomain tersebut diarahkan ke SparkPost

  3. Buat domain masuk di SparkPost

  4. Buat webhook masuk di SparkPost

  5. Buat aplikasi (pengumpul) untuk menerima aliran data webhook SparkPost

Dua tautan berikut dapat digunakan untuk membantu memandu Anda melalui proses ini:

  1. Dokumen teknis SparkPost: Mengaktifkan Pengalihan Email Masuk & Webhook Pengalihan

  2. 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

Dalam fase pertama proyek ini, yang saya simpan hanyalah format email rfc822 di S3 dan beberapa bidang deskripsi tingkat tinggi ke dalam tabel SQL untuk pencarian.  Karena SparkPost akan mengirimkan data email dalam struktur JSON ke platform pengarsipan saya melalui aliran data webhook, saya membangun sebuah aplikasi (sering disebut sebagai pengumpul) yang menerima aliran data Relay_Webhook.

Setiap paket dari SparkPost Relay_Webhook akan berisi informasi dari satu email duplikat pada satu waktu, jadi memecah struktur JSON menjadi komponen yang ditargetkan untuk proyek ini cukup sederhana.  Dalam kode PHP saya, mendapatkan email dalam format 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 terdapat dalam array bidang header.  Jadi saya menulis sebuah fungsi kecil yang menerima array header dan melakukan iterasi melalui array tersebut untuk mendapatkan data yang ingin saya simpan:

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 setelah saya memiliki data tersebut, saya siap untuk menyimpan isi ke S3.

Dalam fase pertama proyek ini, yang saya simpan hanyalah format email rfc822 di S3 dan beberapa bidang deskripsi tingkat tinggi ke dalam tabel SQL untuk pencarian.  Karena SparkPost akan mengirimkan data email dalam struktur JSON ke platform pengarsipan saya melalui aliran data webhook, saya membangun sebuah aplikasi (sering disebut sebagai pengumpul) yang menerima aliran data Relay_Webhook.

Setiap paket dari SparkPost Relay_Webhook akan berisi informasi dari satu email duplikat pada satu waktu, jadi memecah struktur JSON menjadi komponen yang ditargetkan untuk proyek ini cukup sederhana.  Dalam kode PHP saya, mendapatkan email dalam format 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 terdapat dalam array bidang header.  Jadi saya menulis sebuah fungsi kecil yang menerima array header dan melakukan iterasi melalui array tersebut untuk mendapatkan data yang ingin saya simpan:

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 setelah saya memiliki data tersebut, saya siap untuk menyimpan isi ke S3.

Dalam fase pertama proyek ini, yang saya simpan hanyalah format email rfc822 di S3 dan beberapa bidang deskripsi tingkat tinggi ke dalam tabel SQL untuk pencarian.  Karena SparkPost akan mengirimkan data email dalam struktur JSON ke platform pengarsipan saya melalui aliran data webhook, saya membangun sebuah aplikasi (sering disebut sebagai pengumpul) yang menerima aliran data Relay_Webhook.

Setiap paket dari SparkPost Relay_Webhook akan berisi informasi dari satu email duplikat pada satu waktu, jadi memecah struktur JSON menjadi komponen yang ditargetkan untuk proyek ini cukup sederhana.  Dalam kode PHP saya, mendapatkan email dalam format 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 terdapat dalam array bidang header.  Jadi saya menulis sebuah fungsi kecil yang menerima array header dan melakukan iterasi melalui array tersebut untuk mendapatkan data yang ingin saya simpan:

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 setelah saya memiliki data tersebut, saya siap untuk menyimpan isi ke S3.

Menyimpan email duplikat di S3

Saya minta maaf karena mengecewakan Anda, tetapi saya tidak akan memberikan tutorial langkah demi langkah tentang cara membuat bucket S3 untuk menyimpan email, juga saya tidak akan menjelaskan cara membuat kunci akses yang diperlukan dalam aplikasi Anda untuk mengunggah konten ke bucket Anda; ada tutorial yang lebih baik tentang topik ini daripada yang bisa saya tulis.  Berikut adalah beberapa artikel yang mungkin 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 yang berkaitan dengan proyek seperti ini.

  1. Pengendalian 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 untuk pembacaan publik karena data contoh tidak bersifat pribadi dan saya ingin akses mudah ke data tersebut.  Anda mungkin ingin serangkaian kebijakan ACL yang jauh lebih ketat. Berikut adalah artikel yang bagus tentang pengaturan ACL: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html

  2. Arsip Mengarsipkan. Di S3 ada sesuatu yang disebut Manajemen Siklus Hidup.  Ini memungkinkan Anda memindahkan data dari satu jenis kelas penyimpanan S3 ke kelas lainnya.  Kelas penyimpanan yang berbeda merepresentasikan jumlah akses yang Anda butuhkan ke data yang disimpan dengan biaya lebih rendah terkait dengan penyimpanan yang Anda akses paling sedikit. Penjelasan yang baik tentang kelas yang berbeda dan transisi di antara mereka dapat ditemukan dalam panduan AWS yang disebut, Menampilkan Objek. Dalam kasus saya, saya memilih untuk membuat siklus hidup 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 bucket S3 dan pengaturan saya siap, S3 siap untuk saya unggah email yang sesuai dengan rfc822 yang saya peroleh dari aliran data Webhook SparkPost Relay. Tetapi sebelum mengunggah muatan 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 tubuh email untuk id tersembunyi yang ditempatkan aplikasi pengirim ke dalam email dan menggunakan id itu sebagai nama file. Ada cara yang lebih elegan untuk menarik connectorId dari tubuh html, tetapi untuk 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);
        }
    }
}

* kita mengasumsikan 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 hanya diperlukan sedikit kode untuk mengunggah file.

Langkah terakhir saya adalah mencatat entri ini ke dalam tabel MYSQL.

Saya minta maaf karena mengecewakan Anda, tetapi saya tidak akan memberikan tutorial langkah demi langkah tentang cara membuat bucket S3 untuk menyimpan email, juga saya tidak akan menjelaskan cara membuat kunci akses yang diperlukan dalam aplikasi Anda untuk mengunggah konten ke bucket Anda; ada tutorial yang lebih baik tentang topik ini daripada yang bisa saya tulis.  Berikut adalah beberapa artikel yang mungkin 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 yang berkaitan dengan proyek seperti ini.

  1. Pengendalian 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 untuk pembacaan publik karena data contoh tidak bersifat pribadi dan saya ingin akses mudah ke data tersebut.  Anda mungkin ingin serangkaian kebijakan ACL yang jauh lebih ketat. Berikut adalah artikel yang bagus tentang pengaturan ACL: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html

  2. Arsip Mengarsipkan. Di S3 ada sesuatu yang disebut Manajemen Siklus Hidup.  Ini memungkinkan Anda memindahkan data dari satu jenis kelas penyimpanan S3 ke kelas lainnya.  Kelas penyimpanan yang berbeda merepresentasikan jumlah akses yang Anda butuhkan ke data yang disimpan dengan biaya lebih rendah terkait dengan penyimpanan yang Anda akses paling sedikit. Penjelasan yang baik tentang kelas yang berbeda dan transisi di antara mereka dapat ditemukan dalam panduan AWS yang disebut, Menampilkan Objek. Dalam kasus saya, saya memilih untuk membuat siklus hidup 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 bucket S3 dan pengaturan saya siap, S3 siap untuk saya unggah email yang sesuai dengan rfc822 yang saya peroleh dari aliran data Webhook SparkPost Relay. Tetapi sebelum mengunggah muatan 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 tubuh email untuk id tersembunyi yang ditempatkan aplikasi pengirim ke dalam email dan menggunakan id itu sebagai nama file. Ada cara yang lebih elegan untuk menarik connectorId dari tubuh html, tetapi untuk 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);
        }
    }
}

* kita mengasumsikan 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 hanya diperlukan sedikit kode untuk mengunggah file.

Langkah terakhir saya adalah mencatat entri ini ke dalam tabel MYSQL.

Saya minta maaf karena mengecewakan Anda, tetapi saya tidak akan memberikan tutorial langkah demi langkah tentang cara membuat bucket S3 untuk menyimpan email, juga saya tidak akan menjelaskan cara membuat kunci akses yang diperlukan dalam aplikasi Anda untuk mengunggah konten ke bucket Anda; ada tutorial yang lebih baik tentang topik ini daripada yang bisa saya tulis.  Berikut adalah beberapa artikel yang mungkin 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 yang berkaitan dengan proyek seperti ini.

  1. Pengendalian 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 untuk pembacaan publik karena data contoh tidak bersifat pribadi dan saya ingin akses mudah ke data tersebut.  Anda mungkin ingin serangkaian kebijakan ACL yang jauh lebih ketat. Berikut adalah artikel yang bagus tentang pengaturan ACL: https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html

  2. Arsip Mengarsipkan. Di S3 ada sesuatu yang disebut Manajemen Siklus Hidup.  Ini memungkinkan Anda memindahkan data dari satu jenis kelas penyimpanan S3 ke kelas lainnya.  Kelas penyimpanan yang berbeda merepresentasikan jumlah akses yang Anda butuhkan ke data yang disimpan dengan biaya lebih rendah terkait dengan penyimpanan yang Anda akses paling sedikit. Penjelasan yang baik tentang kelas yang berbeda dan transisi di antara mereka dapat ditemukan dalam panduan AWS yang disebut, Menampilkan Objek. Dalam kasus saya, saya memilih untuk membuat siklus hidup 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 bucket S3 dan pengaturan saya siap, S3 siap untuk saya unggah email yang sesuai dengan rfc822 yang saya peroleh dari aliran data Webhook SparkPost Relay. Tetapi sebelum mengunggah muatan 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 tubuh email untuk id tersembunyi yang ditempatkan aplikasi pengirim ke dalam email dan menggunakan id itu sebagai nama file. Ada cara yang lebih elegan untuk menarik connectorId dari tubuh html, tetapi untuk 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);
        }
    }
}

* kita mengasumsikan 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 hanya diperlukan sedikit kode untuk mengunggah file.

Langkah terakhir saya adalah mencatat entri ini ke dalam tabel MYSQL.

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.

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.

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:

  1. Menyimpan semua log peristiwa dari email asli

  2. Mengirimkan kesalahan penyimpanan kepada admin ketika terjadi kegagalan dalam mengunggah atau mencatat

  3. Meminimalkan kompleksitas pengumpul.

  4. Menambah antarmuka pengguna untuk melihat semua data

  5. Mendukung kemampuan untuk mengirim ulang email

Sementara itu, saya berharap proyek ini menarik dan bermanfaat bagi Anda; selamat mengirim.

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:

  1. Menyimpan semua log peristiwa dari email asli

  2. Mengirimkan kesalahan penyimpanan kepada admin ketika terjadi kegagalan dalam mengunggah atau mencatat

  3. Meminimalkan kompleksitas pengumpul.

  4. Menambah antarmuka pengguna untuk melihat semua data

  5. Mendukung kemampuan untuk mengirim ulang email

Sementara itu, saya berharap proyek ini menarik dan bermanfaat bagi Anda; selamat mengirim.

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:

  1. Menyimpan semua log peristiwa dari email asli

  2. Mengirimkan kesalahan penyimpanan kepada admin ketika terjadi kegagalan dalam mengunggah atau mencatat

  3. Meminimalkan kompleksitas pengumpul.

  4. Menambah antarmuka pengguna untuk melihat semua data

  5. Mendukung kemampuan untuk mengirim ulang email

Sementara itu, saya berharap proyek ini menarik dan bermanfaat bagi Anda; selamat mengirim.

Berita lainnya

Baca lebih lanjut dari kategori ini

A person is standing at a desk while typing on a laptop.

Platform AI-native lengkap yang dapat berkembang seiring dengan bisnis Anda.

© 2025 Burung

A person is standing at a desk while typing on a laptop.

Platform AI-native lengkap yang dapat berkembang seiring dengan bisnis Anda.

© 2025 Burung