الرسالة الأصلية غير موجودة

عند استيراد ملفات mbxs، أواجه خطأً يشير إلى أن الرسالة الأصلية غير موجودة، على الرغم من أنها تبدو موجودة في قاعدة البيانات، index.db.

إليك نص الخطأ:

الرسالة الأصلية 9205270657.AB03850@ben.dciem.dnd.ca غير موجودة. يتم تخطي الرسالة 9206031720.AA22567@ben.dciem.dnd.ca: نداء للمساعدة

وهذا هو مدخل قاعدة البيانات:

Annotation 2020-02-16 155700

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

ربما يكون ترتيب الفرز خاطئًا لأنك تقوم بتجميع رسائل البريد الإلكتروني حسب الموضوع؟ قد يستحق الأمر التحقيق. تُرتَّب الرسائل فقط حسب الموضوع وبنظام ترتيب الرسائل داخل ملف mbox.

هل أنت متأكد حقًا من حاجتك لتجميع رسائل البريد الإلكتروني حسب الموضوع؟ بناءً على لقطة الشاشة الخاصة بك، يبدو أن رسائل البريد الإلكتروني تحتوي على Message-ID صحيح بالإضافة إلى رؤوس In-Reply-To و References.

شكرًا لك. عند النظر إلى جدول email_order، يبدو أنها مرتبة بالترتيب الصحيح:

msg_id rowid
9205270657.AB03850@ben.dciem.dnd.ca 874
9206031720.AA22567@ben.dciem.dnd.ca 875

هل يمكن أن يكون هناك شيء آخر يفشل في استيراد هذه الرسائل الأصلية؟

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

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

لا، لا أعتقد أن هناك خطأ.

حسناً، رغم أنني لست معتاداً على Ruby أو سكربت الاستيراد، إلا أنني قد أتمكن من المحاولة.

هل يمكنك إخباري بالسكربتات التي يجب أن ألقي نظرة عليها، وأين توجد؟ هل يعني “التصحيح” إضافة عبارات طباعة، أم توجد وظائف أكثر تطوراً؟

https://github.com/discourse/discourse/tree/master/script/import_scripts/mbox

حسنًا، لقد أضفت بعض عمليات التصحيح المطبوعة إلى دالة map_first_post

def map_first_post(row)
  puts "Mapping parent #{row['msg_id']} #{row['subject'][0..40]}"
  mapped = map_post(row)
  mapped[:category] = category_id_from_imported_category_id(row['category'])
  mapped[:title] = row['subject'].strip[0...255]
  mapped
  puts "Mapped message #{row['msg_id']} #{row['subject'][0..40]}"
end  

def map_reply(row)
  parent = @lookup.topic_lookup_from_imported_post_id(row['in_reply_to'])
  if parent.blank?
    puts "Parent message #{row['in_reply_to']} doesn't exist. Skipping #{row['msg_id']}: #{row['subject'][0..40]}"
    return nil
  end

  mapped = map_post(row)
  mapped[:topic_id] = parent[:topic_id]
  mapped
end

تعمل هذه الطباعة بشكل جيد وتشير إلى أن العنصر الأب تم تعيينه (أو استيراده).

873 / 65936 ( 1.3%) [3895 items/min]
Mapping parent 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
Mapped message 9205270657.AB03850@ben.dciem.dnd.ca A CALL FOR HELP
874 / 65936 ( 1.3%) [3900 items/min]
Parent message 9205270657.AB03850@ben.dciem.dnd.ca doesn’t exist. Skipping 9206031720.AA22567@ben.dciem.dnd.ca: A CALL FOR HELP

لذلك، لا أرى سببًا لكون العنصر الأب فارغًا في دالة map_reply. الشيء الوحيد الذي ألاحظه هو أن الأرقام (873/874) أقل بواحد من rowid أعلاه.

لكنني لا أعتقد أنني يمكنني المضي قدمًا كثيرًا لأنني لا أعرف ما الذي تفعله الدالة @lookup.topic_lookup_from_imported_post_id، كما أن التعديل باستخدام vi وإعادة تشغيل الاستيراد عملية شاقة للغاية، حيث تستغرق كل دورة حوالي 30 دقيقة.

إنه موجود في ملف base.rb في نفس الدليل. وهو يقوم بالضبط بما يقترحه اسم الدالة، حيث يبحث عن معرف الموضوع (topic_id) عن طريق العثور على معرف الاستيراد (import_id) (الذي أفترض أنه معرف الرسالة في هذه الحالة) في حقل مخصص للموضوع (أو ربما حقل مخصص للرسالة؟).

هذا أفضل من تلك التي تستغرق أسبوعًا. :wink: (في بعض الأحيان يمكنك القيام ببعض الأمور لجعل سكريبت الاستيراد يستورد فقط الأشياء التي تحاول تصحيحها؛ ترك كيفية القيام بذلك كممارسة للقارئ.)

يمكنك محاولة النظر إلى قاعدة البيانات لمعرفة ما إذا كانت الرسالة الأصلية يتم استيرادها وما إذا كان لديها حقل مخصص للموضوع/الرسالة باسم import_id.

أين يبحث؟ هل topic_id هو الموضوع؟

هل تقصد بـ ‘قاعدة البيانات’ ملف index.db؟ وهل تقصد بـ ‘تم استيراده’ إدخاله في جدول البريد الإلكتروني في index.db؟ نعم، هو موجود هناك. لكن لا يوجد عمود يُسمى ‘import_id’.

بخصوص قاعدة البيانات، أعني قاعدة بيانات Discourse. يتم تخزين معرف الاستيراد في جداول topic_custom_field و post_custom_field.

أهلاً!

لقد قمت باستيراد إضافة مستكشف البيانات ونظرت في قاعدة بيانات discourse. اكتشفت أن import_id للرسالة الأصلية كان موجودًا في جداول topic_custom_field و post_custom_field. كما أن الرسالة كانت موجودة بالفعل.

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

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

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

شكرًا على التوجيهات.

لماذا؟ ومن قام بذلك؟

هذا لا يحدث أثناء عملية الاستيراد.

يبدو ذلك صحيحًا. والحذف لا يمحو المنشورات فعليًا، بل يُحدّد حالتها كمحذوفة.