ظهرت مشكلة غريبة في إعداد الاختبار الخاص بي حيث أقوم بنسخ رسائل البريد الإلكتروني إلى خادم Discourse الخاص بي وتشغيل import_mbox.sh لدمج رسائل البريد الإلكتروني هذه. رسائل البريد الإلكتروني الأصلية من قائمة بريدية.
لقد وجدت أنه إذا كان الأشخاص يستخدمون هواتف Samsung، ويردون على بريد إلكتروني سابق من قائمة بريدية، وإذا حاولت استيراد البريد الإلكتروني الناتج إلى Discourse، فإنه لا يستخرج المحتوى الجديد ولكنه يعرض نسخة مكررة من البريد الإلكتروني الأصلي ولكن تم تمييزه كما لو أن الشخص الذي رد قد كتبه.
إذا قمت بنسخ ولصق البريد الإلكتروني الخام الذي يسبب المشكلة في مربع اختبار البريد الإلكتروني المتقدم، فإن نفس المشكلة موجودة. إذا قمت باقتطاع البريد الإلكتروني وإزالة العديد من الأجزاء المضافة بواسطة Samsung، فيبدو أنه يعمل.
لا يمكنني وضع نسخ من رسائل البريد الإلكتروني التي تسبب هذه المشكلة هنا لأنها سرية. رسائل البريد الإلكتروني التي لا يتم استيرادها تحتوي على أقسام مثل هذه (ولا يوجد محتوى قابل للقراءة البشرية - كل شيء مشفر بترميز base64):
لذلك ستحتاج إلى تعديل import_mbox.sh لاقتطاع البريد الإلكتروني وإزالة هراء سامسونج.
يمكن أن تكون مشكلة يمكن حلها في النواة، حيث من المحتمل أن تفشل تلك الرسائل عند معالجتها عن طريق إرسالها بالبريد الإلكتروني (لكنني لم ألق نظرة على الكود مؤخرًا، لذلك لا أعرف). في أي حال، من المحتمل أن يكون الحل الأكثر فعالية هو تعديل البرنامج النصي للاستيراد لتلك الرسائل.
أو ربما سيتعرف شخص ما على هذه المشكلة في النواة ويصلحها.
بعد المزيد من البحث، يبدو أن تطبيق البريد الإلكتروني من سامسونج يقوم بترميز نص عادي وجزء HTML، كل منهما مشفر بـ base64. لقد وجدت أنه إذا أضفت سطرًا فارغًا بين الترميزين، فإن مرشح البريد يعمل بشكل صحيح. قد لا تضيف سامسونج سطرًا فارغًا حيث ينبغي، أو قد لا يحدد مرشح البريد بشكل صحيح جزء النص العادي/نص HTML ولا يدرك أنه بمجرد العثور على جزء HTML، فإنه يعرف أين ينتهي رأس هذا الجزء ويبدأ محتوى الرسالة.
لقد حاولت نسخ البريد الإلكتروني الأصلي من Gmail (عبر عرض الأصل) وكذلك تصدير نفس الرسالة من Thunderbird، مع نفس النتائج.
يبدو أن رسائل البريد الإلكتروني التي تم إنشاؤها بواسطة سامسونج تحتوي على هذا في أسفل الرؤوس:
Content-Type: multipart/alternative;
boundary="--_com.samsung.android.email_396413402758380"
----_com.samsung.android.email_396413402758380
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=UTF-8
WWVz[يتم هنا ترميز نص الرسالة العادي بـ base64]
وينتهي هذا بـ
[المزيد من البيانات المشفرة بـ base64 هنا]19fDQo=
----_com.samsung.android.email_396413402758380
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=UTF-8
PGh0b[ترميز base64 مرة أخرى، هذه المرة ترميز النسخة HTML من نفس الرسالة]
وينتهي هذا بـ
[المزيد من البيانات المشفرة بـ base64]NCg==
----_com.samsung.android.email_396413402758380--
الآن إذا قمت بتغيير الجزء الأوسط بإضافة سطر فارغ (بعد جزء “email_396413402758380”)، فإن كل شيء يعمل بشكل مثالي!
[المزيد من البيانات المشفرة بـ base64 هنا]19fDQo=
----_com.samsung.android.email_396413402758380
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=UTF-8
PGh0b[ترميز base64 مرة أخرى، هذه المرة ترميز النسخة HTML من نفس الرسالة]
حسنًا، في هذه الحالة، أقول إنها إما مشكلة في gem البريد الذي نستخدمه لتحليل رسائل البريد الإلكتروني أو مشكلة في تطبيق Samsung. بعد نظرة سريعة على RFCs، أقول إنها على الأرجح مشكلة في المحلل.
هل يمكنك بأي حال من الأحوال تقديم مثال كامل لمثل هذا البريد الإلكتروني الإشكالي؟ ربما يمكنك أن تطلب من أحد مؤلفي رسائل البريد الإلكتروني السرية الخاصة بك إرسال بريد إلكتروني غير سري إليك؟
هذا بريد إلكتروني مصطنع قمت بإنشائه وأعتقد أنه يوضح المشكلة. إذا نظرت إلى جزء HTML، فإنه يحتوي على رد على رسالة سابقة. يبدو أن المستورد غير قادر على رؤية مكان بدء الرسالة الأصلية.
يبدو أن هذه المشكلة تؤثر أيضًا على الرسائل من عملاء بريد إلكتروني آخرين، أكتشف الآن. لا يمكنني نشر رسائل البريد الإلكتروني التي تولد الأخطاء للجميع للنظر فيها علنًا، ولكن يسعدني أن أسمح لشخص ما برؤيتها على انفراد.
إعدادي الحالي هو أنني قمت بتثبيت Discourse على خادم منزلي، ويتم إرسال رسائل البريد الإلكتروني إلى قائمة بريدية (والتي تذهب إلى حساب Gmail). إذا تطابق فلتر “إلى:” مع اسم القائمة البريدية، فقد قمت بتعيين Gmail لإعادة توجيه نسخة من البريد الإلكتروني إلى mailinglist@mydiscoursedomain.org.uk. لدى Discourse فئة معدة لتعكس قائمة بريدية تبحث عن هذا البريد الإلكتروني.
تأتي نفس المشكلة أيضًا إذا استخدمت البرنامج النصي import_mbox.sh بعد نسخ رسائل البريد الإلكتروني يدويًا، لذلك يجب أن يكون الجزء من التعليمات البرمجية الذي يبحث عن الجزء الجديد من الرسالة هو الذي يربك.
هل هناك أي طريقة لجعل Discourse يمر بسرعة عبر جميع رسائل البريد الإلكتروني المستوردة المخزنة مسبقًا ويحاول إعادة تنسيقها باستخدام الجزء النصي العادي من رسائل البريد الإلكتروني الأصلية في حالة كان ذلك حلاً مؤقتًا للمشكلة المذكورة أعلاه؟ قبل الاستيراد، تم ضبطه لاستخدام جزء HTML. من خلال إلقاء نظرة خاطفة باستخدام ‘rails c’، يمكنني رؤية أن كل مشاركة تبدو وكأنها تحتوي على النص الكامل للرسائل الواردة المخزنة (بما في ذلك رؤوس البريد الإلكتروني). لقد حاولت تشغيل ‘rake posts:rebuild’ بعد إيقاف تشغيل خيار HTML وبينما يمضي ببطء عبر جميع الرسائل، لست متأكدًا مما إذا كان أي شيء قد تغير، على سبيل المثال، حاولت تشغيل وإيقاف تشغيل خيار عرض المحتوى المقصوص أيضًا ولكن الصندوق الصغير بثلاث نقاط لا يزال يبدو موجودًا في المشاركات بعد انتهاء الـ rake.