استيراد خطأ "فشل في تعيين المنشور"

لدي حوالي 1000 منشور يفشل في عملية الاستيراد، وأعتقد أن الخطأ الرئيسي هو “فشل في تعيين المنشور”، مثل:

فشل في تعيين المنشور لـ b9ec0145-e587-c0e2-768d-ad482c3ab928@mmtaylor.net
لا توجد دالة hex لـ nil:NilClass

يبدو أن هذا يتسبب في فشل العديد من المنشورات الأخرى برسائل خطأ مثل:

1109 / 65895 ( 1.7%) [400 عنصر/دقيقة] رسالة الأصل b9ec0145-e587-c0e2-768d-ad482c3ab928@mmtaylor.net غير موجودة. يتم تخطي CAKPLMstp+CaTyfFinM-dHHpVxNHt0fy2vXT9Fx+21mE2RT-ijg@mail.gmail.com: نهج PCT لـ “قانون القوة”

هل لديك أي اقتراحات حول كيفية حل هذه المشكلة؟

لدي منشورات تمتد على مدار 28 عامًا، مع مجلد لكل سنة، وملف mbox لكل شهر. يوجد 66909 رسالة في ملفات mbox. يُظهر الاستيراد 65895. هل الفرق البالغ 1014 ناتج عن حالات الفشل المذكورة في مخرجات الاستيراد؟

تم تحويل المنشورات من ملفات Eudora mbx إلى ملفات mbox قياسية باستخدام Aid4Mail.

بالنسبة لخطأ “رسالة الأصل غير موجودة”، أرى 421 حالة.
وبالنسبة لخطأ “فشل في تعيين المنشور”، أرى 149 حالة.

تعبير split_regex الخاص بي هو “^From .@. [0-9]{4}”، والذي يبدو مناسبًا للعناوين مثل:

From mmt-xxx@somedomain.net Wed Aug 10 12:06:53 2016

مساعدة! هل لديك أي اقتراحات لهذا؟ :وجه_دوار:

لقد رأيت نفس الخطأ الأسبوع الماضي أثناء العمل على مشكلة مختلفة. سأقوم بإصلاحه هذا الأسبوع وسأقوم بنشر تحديث هنا بمجرد إصلاحه.

هذه مجرد تحذيرات وربما تظهر بسبب أخطاء “فشل في تعيين المنشور”. يحدث ذلك عندما تشير رسالة إلى منشور غير موجود. أنا متأكد تمامًا من أن إصلاح المشكلة الأخرى سيصلح معظم هذه التحذيرات، إن لم يكن جميعها.

يجب إصلاح هذا الخطأ عبر FIX: Email attachments with a size of 0 bytes caused error · discourse/discourse@e84d88d · GitHub

لقد قمت بالترقية وإعادة بناء عملية الاستيراد، وتحققت من تحديث receiver.rb، ثم أعيدت تشغيل الاستيراد.

يبدو أن ذلك حلّ مئات الرسائل، شكرًا لك.

لكن لا يزال لدي حوالي 200 رسالة فاشلة، وذلك بسبب نوعين من الأخطاء:

التاريخ مفقود. تم تخطي bbe76bf7a9cab5a2ec2a06e6ef453555

فشل في ربط المنشور لـ 23a86e52-71ba-7435-1c9c-c4f2a134b90d@mmtaylor.net
Discourse::InvalidAccess

ثم هناك العديد من رسائل “الآب لا يوجد”، والتي أفترض أنها ناتجة عن ما سبق.

هل لديك أي فكرة عن سبب هذه الأخطاء؟ في الحالة الأولى، راجعت رسالة mbx ولم أجد التاريخ مفقودًا.

يمكنك إلقاء نظرة على ملف index.db الذي ينشئه برنامج الاستيراد. إنه قاعدة بيانات SQLite3. يمكنك تشغيل الاستعلام التالي لمعرفة ما يعمل عليه المحلل. يقوم هذا الاستعلام باختيار الرسائل الخاصة بمعرفي Message-ID اللذين نشرتهما.

SELECT *
FROM email
WHERE msg_id IN ('bbe76bf7a9cab5a2ec2a06e6ef453555', '23a86e52-71ba-7435-1c9c-c4f2a134b90d@mmtaylor.net')

أعتقد أن عمودي email_date و raw_message سيكونان العمودين الأكثر إثارة للاهتمام بالنسبة لك. ربما يمكنك العثور على ما يربك محلل البريد الإلكتروني…

بالنسبة لأول رسالة، التاريخ هو null، وألاحظ عدم وجود تاريخ لتلك الرسالة في صندوق الوارد (mbx). ألاحظ أن الرد (الذي يحتوي على :Re) يظهر قبل الرسالة “الأصلية”، وهو ما جعلني أظن أن التاريخ غير مفقود. هل يستورد النظام الرسائل الأصلية كأول رسالة في الملف تحمل نفس الموضوع؟

هل يتم أخذ تاريخ البريد الإلكتروني من سطر “Date:”، مثل هذا؟

Date: Wed, 25 Mar 1992 12:23:00 GMT

سأحاول إصلاح الرسائل التي تفتقر إلى التواريخ.

بالنسبة للثاني، لا أرى أي خطأ واضح. هل تمنح هذه الصورة أي تلميح حول المشكلة؟

لا، يستخدم الرأسين In-Reply-To و References للمطابقة والفرز حسب Message-ID ما لم تكن قد غيرت إعداد group_messages_by_subject في المُستورد إلى true.

نعم.

أفضل تخمين لدي هو أن هناك مشكلة في أحد المرفقات. ربما أن امتداد الملف غير مسموح به؟

لقد قمت بتعيين إعداد group_messages_by_subject إلى true لأنه بدونه لم يكن هناك أي تجميع على الإطلاق.

تحتوي هذه الرسالة على صورتين مدمجتين:

Content-Type: application/octet-stream;
name=“Conflict (was … long live Wil”
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=“Conflict (was … long live Wil”

Content-Type: image/jpeg; name=“2.1.3FarmerSideEffectLoop.jpg”
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename=“2.1.3FarmerSideEffectLoop.jpg”

هل يمكن أن يكون السبب في أن اسم الملف الأول لا يحتوي على امتداد؟

هل يمكنني حل مشكلة التاريخ عن طريق إدراج التاريخ في ملف index.db، بدلاً من العبث بملف mbx؟

نعم، هذا يعمل. لقد قمت بنفس الشيء في الماضي. أنصحك بتعيين index_only إلى true في ملف settings.yml، حتى لا يبدأ الاستيراد فورًا بعد فهرسة الرسائل. يمكنك إجراء جميع التغييرات المطلوبة في قاعدة البيانات بعد انتهاء الفهرسة. ثم غيّر index_only إلى false مرة أخرى وأعد تشغيل الاستيراد.

أعتقد أنني أساءت فهم شيء ما هناك. أليس الفهرسة قد اكتملت بالفعل، نظرًا لأن ملف index.db قد تم بناؤه؟

لقد قمت بنقل ملف index.db إلى سطح المكتب. كنت سأقوم بتحديث التواريخ ثم نقل ملف index.db مرة أخرى إلى الخادم وتشغيل الاستيراد مرة أخرى. أليس ذلك صحيحًا؟

لقد قررت اتباع نهج تعديل ملفات mbox وإضافة سطر “Date”، مثل “Date: Wed, 25 Mar 1992 17:43:06”. قمت بنقل الملفات المحدثة وأعدت تشغيل عملية الاستيراد مرتين. ومع ذلك، لم يتم تحديث حقل email_date.

هل يجب عليّ حذف index.db؟

نعم، تحتاج إلى حذفه.