بناء نظام أرشفة البريد الإلكتروني: تخزين محتوى البريد الإلكتروني
البريد الإلكتروني
·
04/03/2019

النقاط الرئيسية
الهدف: يوضح هذا المنشور المرحلة الأولى من بناء نظام أرشفة البريد الإلكتروني باستخدام SparkPost و Amazon S3 و MySQL. يشرح كيفية تكرار البريد الإلكتروني، والتقاطه، وتخزينه للوصول طويل الأمد والامتثال.
الفكرة الأساسية: يقوم النظام تلقائيًا بتخزين محتوى البريد الإلكتروني الخام (بتنسيق rfc822) في S3 وتسجيل بيانات التعريف (الموضوع، المرسل، الطابع الزمني، إلخ) في MySQL للبحث السريع والاسترجاع.
الأساسيات المغطاة:
إنشاء نسخ للأرشفة: استخدم ميزة الأرشفة في SparkPost لإرسال نسخ متطابقة من الرسائل الصادرة إلى عنوان الأرشيف المحدد، مع التأكد من بقاء المحتوى وروابط التتبع متطابقة.
ربط البيانات عبر UID: قم بتضمين معرف فريد (UID) في كل من محتوى البريد الإلكتروني وبيانات التعريف X-MSYS-API لربط الرسائل الأصلية والمحفوظة.
معالجة الوارد: قم بتكوين نطاق وارد وWebhook في SparkPost لاستقبال أحمال JSON لمراسلات البريد الإلكتروني المؤرشفة عبر جامع التطبيقات.
تخزين الرسائل في S3: قم بتحميل محتوى rfc822 المعالج إلى دلو S3، مع استخدام قواعد دورة الحياة (مثل، الانتقال إلى Glacier بعد عام) لتقليل تكاليف التخزين.
تسجيل بيانات التعريف في MySQL: احتفظ بالمجالات الأساسية مثل RCPT_TO وFROM وSUBJECT واسم ملف S3 لت索索 البيانات واسترجاعها في المستقبل.
اعتبارات الأداء: تضمن كفاءة الكود والتسجيل الحد الأدني أن يتمكن الجامع من التعامل مع مئات الطلبات في الدقيقة مع الحد الأدنى من التأخير.
الصورة الكبيرة: تدعم هذه الأساسيات تحسينات مستقبلية — مثل تخزين أحداث السجل، وتنبيهات الفشل، والتصور في واجهة المستخدم — مما يضع الأساس لحل أرشفة بريد إلكتروني قابل للتطوير وقابل للتدقيق.
أهم النقاط في الأسئلة والأجوبة
ما هو هدف هذا المشروع؟
لإنشاء نظام أرشفة بريد إلكتروني آلي يقوم بتخزين نصوص الرسائل في Amazon S3 مع الحفاظ على بيانات وصفية قابلة للبحث في قاعدة بيانات MySQL.
لماذا تستخدم ميزة الأرشيف في SparkPost؟
يسمح لك بإنشاء نسخ مطابقة تمامًا من رسائل البريد الإلكتروني الصادرة، مع الحفاظ على هيكلها وبيانات تتبعها للامتثال والمراجعة.
كيف يرتبط كل بريد إلكتروني مؤرشف برسالته الأصلية؟
يتم تضمين UID فريد في كل من نص البريد الإلكتروني والبيانات الوصفية، مما يتيح الإشارة الدقيقة بين النسخ الأصلية والأرشفية.
لماذا نستخدم S3 للتخزين؟
تقدم S3 خيارات تخزين قابلة للتوسع وإدارة دورة حياة (مثل Glacier)، مما يجعلها اقتصادية للاحتفاظ بالبريد الإلكتروني على المدى الطويل.
ماذا يخزن قاعدة بيانات MySQL؟
إنه يخزن حقول البيانات الوصفية القابلة للبحث - مثل سطر الموضوع، والمرسل، وختم الوقت، واسم ملف S3 - مما يسمح بالاستفسار والاسترجاع بشكل فعال.
ما هي خطوات التطوير التالية؟
إضافة تتبع أحداث السجل، والإبلاغ عن الأخطاء تلقائيًا، وجامع مبسط، وواجهة لاستخدامها في عرض أو إعادة إرسال الرسائل الإلكترونية المؤرشفة.
في هذه المدونة، سأصف العملية التي مررت بها لتخزين محتوى البريد الإلكتروني على S3 (خدمة التخزين البسيطة من أمازون) والبيانات التكميلية في جدول MySQL لتسهيل الربط المرجعي. في النهاية، هذه هي نقطة البداية لقاعدة الشفرة التي ستتضمن تطبيقًا يتيح سهولة البحث في رسائل البريد الإلكتروني المؤرشفة، ثم عرض تلك الرسائل مع بيانات الحدث (السجل). يمكن العثور على كود هذا المشروع في مستودع GitHub التالي: https://github.com/jeff-goldstein/PHPArchivePlatform.
بينما سأستخدم S3 و MySQL في هذا المشروع، إلا أنه ليست هذه هي التقنيات الوحيدة التي يمكن استخدامها لبناء منصة أرشفة، ولكن نظرًا لشيوعها، اعتقدت أنها خيار جيد لهذا المشروع. في نظام عالي الأداء على نطاق واسع سأستخدم قاعدة بيانات ذات أداء أعلى من MySQL، ولكن لهذا المشروع النموذجي، فإن MySQL مثالية. بالنسبة للمنظمات التي تفكر في PostgreSQL كخيار لقاعدة بيانات الأرشفة لديها، فإن تنفيذ إجراءات النسخ الاحتياطي والاستعادة المناسبة أمر ضروري للحفاظ على سلامة البيانات في أنظمة الإنتاج.
لقد قمت بتفصيل الخطوات التي اتبعتها أدناه في المرحلة الأولى من المشروع:
إنشاء البريد الإلكتروني المكرر للأرشفة
استخدام ميزات الأرشفة وRelay الوارد من SparkPost لإرسال نسخة من البريد الإلكتروني الأصلي إلى SparkPost لمعالجته في هيكل JSON، ثم إرساله إلى مُجمع webhook (تطبيق)
تفكيك هيكل JSON للحصول على المكونات اللازمة
إرسال محتوى البريد الإلكتروني إلى S3 للتخزين
تسجيل إدخال في MySQL لكل بريد إلكتروني للربط المرجعي
إنشاء نسخة مكررة من البريد الإلكتروني
الحصول على نسخة الأرشيف
للحصول على نسخة من بريد إلكتروني للأرشيف، تحتاج إلى اتخاذ الخطوات التالية:
إنشاء نطاق فرعي ستقوم بإرسال جميع رسائل البريد الإلكتروني الأرشيفية (المكررة) إليه
تعيين سجلات DNS المناسبة لجعل جميع رسائل البريد الإلكتروني المرسلة إلى ذلك النطاق الفرعي تذهب إلى SparkPost
إنشاء مجال وارد في SparkPost
إنشاء نقطة وصول واردة في SparkPost
إنشاء تطبيق (جَامِع) لاستلام تدفق بيانات نقطة وصول SparkPost
يمكن استخدام الرابطين التاليين لمساعدتك في توجيهك خلال هذه العملية:
وثيقة SparkPost التقنية: تمكين توجيه البريد الإلكتروني الوارد ونقاط وصول التوجيه
أيضًا، المدونة التي كتبتها العام الماضي، أرشفة رسائل البريد الإلكتروني: دليل حول تتبع البريد المرسل ستساعدك في إنشاء نقطة الوصول الواردة ضمن SparkPost
* ملاحظة: اعتبارًا من أكتوبر 2018، فإن ميزة الأرشفة تعمل فقط عند إرسال رسائل البريد الإلكتروني باستخدام اتصال SMTP إلى SparkPost، واجهة برمجة التطبيقات RESTful لا تدعم هذه الميزة. ومن المحتمل أن لا تكون هذه مشكلة لأن معظم رسائل البريد الإلكتروني التي تحتاج إلى هذا المستوى من التحكم في التدقيق تميل إلى أن تكون رسائل بريد إلكتروني مخصصة تم إنشاؤها بالكامل بواسطة تطبيق خلفي قبل الحاجة إلى تسليم البريد الإلكتروني.
الحصول على البريد الإلكتروني المكرر في هيكل JSON
تخزين البريد الإلكتروني المكرر في S3
تخزين البيانات الوصفية في MySQL
لقد جمعنا جميع البيانات اللازمة في خطوة سابقة، لذا فإن خطوة التخزين سهلة. في هذه المرحلة الأولى، اخترت بناء جدول بالحقول التالية:
حقول بيانات MySQL
الحقل | الغرض |
التاريخ/الوقت (تلقائي) | علامة الوقت عند تسجيل الإدخال |
عنوان RCPT_TO | عنوان البريد الإلكتروني المستهدف للرسالة المؤرشفة |
علامة الوقت لهيئة DATE | وقت إرسال البريد الإلكتروني الأصلي |
عنوان SUBJECT | خط الموضوع للترتيب والبحث |
عنوان FROM | معرف المرسل للبحث |
دليل S3 | مسار الدليل داخل دلو S3 |
اسم ملف S3 | ملف .eml فريد مخزن في S3 |
تقوم الوظيفة المسماة MySQLLog داخل ملف التطبيق upload.php بالمرور عبر الخطوات اللازمة لفتح الرابط إلى MySQL، حقن الصف الجديد، اختبار النتائج وإغلاق الرابط. أضفت واحدة أخرى لمزيد من التأكد، وهي تسجيل هذه البيانات في ملف نصي. هل ينبغي علي القيام بمزيد من تسجيل الأخطاء؟ نعم. لكنني أرغب في الحفاظ على هذا الكود خفيفًا للسماح له بالعمل بسرعة كبيرة. في بعض الأحيان، سيتم استدعاء هذا الكود مئات المرات في الدقيقة ويحتاج إلى أن يكون فعالاً قدر الإمكان. في التحديثات المستقبلية، سأضيف كودًا إضافيًا ستقوم بمعالجة الإخفاقات وإرسال تلك الإخفاقات إلى مدير المراقبة.
اختتام ذلك
لذا في بضع خطوات سهلة إلى حد ما، تمكنا من المرور عبر المرحلة الأولى لبناء نظام أرشفة بريد إلكتروني قوي يحتفظ بنسخ البريد الإلكتروني في S3 ويقوم بالرجوع إلى البيانات في جدول MySQL. سيمنحنا هذا أساسًا لبقية المشروع الذي سيتم التعامل معه في عدة منشورات مستقبلية.
في التعديلات المستقبلية لهذا المشروع، أتوقع أن:
أخزن جميع أحداث سجل البريد الإلكتروني الأصلي
أرسل أخطاء التخزين إلى المدير عندما يحدث فشل في التحميل أو التسجيل
أقلل من تعقيد المجمع.
أضيف واجهة مستخدم لعرض جميع البيانات
أدعم القدرة على إعادة إرسال البريد الإلكتروني
في غضون ذلك، آمل أن يكون هذا المشروع قد كان ممتعًا ومفيدًا لك؛ إرسال سعيد.



