لقد قمنا مؤخرًا بنقل مثيل Discourse المستضاف ذاتيًا من خادم واحد إلى آخر. تم نقل جميع الإعدادات من النظام القديم إلى الجديد، بما في ذلك “الرد عبر البريد الإلكتروني” و"السماح بنشر منشورات جديدة عبر البريد الإلكتروني". نحن نستخدم إعداد discourse/mail-receiver للتعامل مع جزء البريد الإلكتروني.
كانت كل من وظيفة الرد على البريد ووظيفة البريد الجديد تعملان بشكل ممتاز في النظام القديم، لكننا نواجه مشكلة في الخادم الجديد: وظيفة الرد على البريد لا تعمل بعد الآن.
بصفتي مستخدمًا غير معروف، عندما أرسل بريدًا إلكترونيًا إلى العنوان المخصص لهذا الغرض، يمكنني رؤية البريد الوارد. يتم إنشاء مستخدم جديد مؤقت. يتم نشر الرسالة. رائع!
بصفتي مستخدمًا من فريق العمل، يمكنني الرد على هذه الرسالة، ويتم تسليم الرسالة بشكل صحيح. عظيم!
لكن عند محاولة الرد مرة أخرى على ذلك البريد الإلكتروني، مما يجب أن يؤدي إلى رد في Discourse، يفشل الأمر. عندما تصل الرسالة إلى mail-receiver، يحاول تسليمها عبر واجهة برمجة التطبيقات (API)، لكن ذلك يفشل مع أخطاء السجل التالية.
(لأسباب تتعلق بالخصوصية، قمت بتعديل أسماء المستخدمين والنطاقات)
كما ذكرت، كان هذا التبادل الكامل يعمل بشكل مثالي في الإعداد القديم. الإعداد الجديد مطابق تمامًا للإعداد القديم (local_discourse/app وlocal_discourse/mail-receiver).
هل يمكن لأي شخص أن يخبرني لماذا قد تقوم واجهة برمجة تطبيقات handle_mail بإرجاع خطأ 400 عند استلام بريد إلكتروني رد؟
هل من الممكن جعل التسجيل أكثر تفصيلاً حتى أتمكن من البحث بعمق أكبر؟
أتساءل عن الفرق بين ‘البريد الجديد’ و’بريد الرد’. أعتقد أن الفرق الوحيد ذي الصلة هو المستلم. لكن كلاهما يمر عبر المعالج نفسه (mail-receiver) ويتم نشرهما في نفس الـ API: https://forum.acme.org/admin/email/handle_mail
المشكلة ليست في جزء MX. البريد يصل إلى مستلم البريد، كما تظهر السجلات، ولكن بمجرد إرساله للبريد إلى واجهة برمجة التطبيقات (API)، يتم الرد عليه برمز 400 (وهو ما يعني طلبًا خاطئًا).
هناك فارق في الإعداد، رغم ذلك: لقد وضعت وكيلًا عكسيًا (nginx) أمامه للحصول على وظيفة “التوقف المؤقت”، ولربما استضافة مواقع ويب أخرى على نفس المضيف. ومع ذلك، لا يزال الأمر غير واضح بالنسبة لي لماذا سيكون ذلك مشكلة، حيث يتم قبول موضوع جديد دون أي عائق. ومع ذلك، سأرى ما يحدث إذا أزلت الوكيل العكسي من المعادلة…
تحديث
للأسف! قمت بنقل تثبيت Discourse من خلف الوكيل العكسي لـ nginx (أي إعادة بناء app مع الإعدادات الصحيحة وإيقاف تشغيل nginx)، لكن هذا لم يحل المشكلة على الإطلاق!
الآن، أنا حقًا في حيرة. ما الذي يحدث هنا؟
باختصار:
كان تثبيت Discourse السابق (app و mail-receiver) يقبل الموضوعات الجديدة والردود
بعد الترحيل إلى خادم جديد (نفس الإعدادات تمامًا)، لا تزال الموضوعات الجديدة تُقبل، لكن الردود تُرفض مع خطأ 400 Bad Request.
لقد عثرت على المشكلة التي تسبب هذا الموقف.
أثناء تجربتي مع عدة عملاء بريد إلكتروني، اكتشفت أن الرسائل المرسلة من عميل سطح المكتب الخاص بي (Thunderbird) تواجه خطأ ‘400 Bad Request’، بينما عند استخدام عميل الويب، تصل الردود بنجاح.
وبعد مزيد من التحقيق، تبين أن Thunderbird تحول بطريقة ما إلى ترميز Western (Windows-1252) عند الرد، بينما ظل عميل الويب ملتزمًا بترميز UTF-8. وبعد إجبار Thunderbird على استخدام UTF-8، وصلت الرسالة بنجاح أيضًا.