استيراد خرائط mbox charset=windows-1252 إلى �

مرحبًا،

عند استيراد ملف mbox الذي يحتوي على هذه الرسالة

windows.txt (3.7 KB)

يظهر كما يلي:

من المرجح أن المشكلة تتعلق بالترميز لأنه يحتوي على:

Content-Type: text/plain; charset=windows-1252; format=flowed

بينما يتم استيراد الرسائل الأخرى ذات الترميز غير UTF-8، مثل iso-8859-1، بشكل صحيح.

قبل أن أحاول فهم جذر المشكلة من خلال استكشاف الكود بدءًا من script/import_scripts/mbox/support/indexer.rb، هل لدى أحدكم فكرة؟ هل يمكن أن تكون المشكلة بيئية وليست في قاعدة الكود؟ هل يحدث هذا أيضًا عندما يرسل مستخدم يعمل في وضع القائمة البريدية ردًا بهذا الترميز؟

شكرًا مقدّمًا :slight_smile:

لقد أجريت اختبارًا سريعًا ويبدو أن Email::Receiver يعمل بشكل جيد. يقوم بتحويل الإدخال إلى UTF-8. لا أستطيع التفكير في سبب يجعل الترميز خاطئًا بعد ذلك.

[1] pry(main)> raw_email = File.read("/tmp/windows.txt");
[2] pry(main)> receiver = Email::Receiver.new(raw_email, convert_plaintext: true, skip_trimming: false);
[3] pry(main)> body = receiver.select_body;
[4] pry(main)> receiver.mail.charset
=> "windows-1252"
[5] pry(main)> body.first.encoding
=> #<Encoding:UTF-8>
[6] pry(main)> puts body.first;
هذا التفكير يجعلني أتساءل: هل هناك التزام/سبب (بخلاف تكلفة الصيانة) لاستخدام نفس الأداة للفئتين (التفاعلات مقابل المعرض)؟

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

يمكنك تجربتها بتشغيل rails console داخل الحاوية.

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

إليك ما قمت به في تثبيت الإصدار 2.5.4:

  • ملف shared/standalone/import/settings.yml دون تعديلات
  • حذف ملف shared/standalone/import/data/index.db من الاستيراد السابق
  • تغيير رأس Message-ID:
  • نسخ windows.txt إلى shared/standalone/import/data/windows4/windows.mbox
  • تشغيل الأمر ./launcher enter import
  • تنفيذ الاستيراد عبر:
root@forum:/var/www/discourse# import_mbox.sh 
بدء استيراد mbox...

تحميل المجموعات الموجودة...
تحميل المستخدمين الموجودين...
تحميل التصنيفات الموجودة...
تحميل المنشورات الموجودة...
تحميل المواضيع الموجودة...

إنشاء الفهرس
فهرسة الملفات في /shared/import/data/windows4
فهرسة /shared/import/data/windows4/windows.mbox

فهرسة الردود والمستخدمين

إنشاء التصنيفات
        1 / 1 (100.0%)  [8121278 عنصر/دقيقة]  
إنشاء المستخدمين
تخطي مستخدم واحد تم استيراده مسبقًا

إنشاء المواضيع والمنشورات
        1 / 1 (100.0%)  [219 عنصر/دقيقة]  

تحديث حالة الموضوع

تحديث bumped_at في المواضيع

تحديث last posted at في المستخدمين

تحديث last seen at في المستخدمين

تحديث first_post_created_at...

تحديث عدد منشورات المستخدم...

تحديث عدد المواضيع للمستخدم...

تحديث مستخدمو الموضوع

تحديث توقيتات المنشورات

تحديث مستخدمو الموضوع المميز

تحديث المواضيع المميزة في التصنيفات
        9 / 9 (100.0%)  [1562 عنصر/دقيقة]  ]  
إعادة تعيين عدادات المواضيع


تم بنجاح (00س 00د 09ث)
  • حصلت على نفس النتيجة المذكورة أعلاه، والتي يمكنك مشاهدتها هنا.

هل يمكن أن يكون السبب في أن Email::Receiver لا يتم استدعاؤه بنفس الطريقة من قبل أداة الاستيراد؟

Email::Receiver.new(row[‘raw_message’])

بدلاً من

receiver = Email::Receiver.new(raw_email, convert_plaintext: true, skip_trimming: false);

أو أن الاختلاف يكمن في طريقة استخراج الرسالة من ملف mbox: وهنا يكمن الفرق في مسار الكود. السطر raw_email = File.read("/tmp/windows.mbox") المذكور أعلاه يختلف عن تقسيم الملف باستخدام التعبيرات النمطية، وربما يكون هذا هو السبب في حدوث الأخطاء.

وبالفعل، يؤدي إضافة File.open('/tmp/message.txt', 'w') { |file| file.write(receiver.raw_email) } بعد هذا السطر إلى إنشاء ملف التالي، وهو مختلف عن الملف الأصلي.

message.txt (3.7 KB)

عند التشغيل من وحدة تحكم Rails، فإن receiver.raw_email يختلف أيضًا عن الملف الأصلي: فهو مُرمَّز بشكل صحيح كـ UTF-8.

هل لديك أي فكرة عن المكان الذي يحدث فيه هذا التعديل غير الصحيح؟

قد تحتاج إلى إضافة استدعاء لـ .force_encoding بعد قراءة الملف لإخبار Ruby بالتشفير المستخدم في ملف البريد الإلكتروني.

عذراً إذا كان هذا سؤالاً للمبتدئين، لكنني لست على دراية ببنية الكود :slight_smile: هل لديك اقتراح حول المكان الذي سيكون فيه مثل هذا التغيير مفيداً؟

بعد تضييق نطاق مكان حدوث التحول غير المرغوب فيه، يبدو أنه هنا:

دالة line.scrub مسؤولة عن تحويل المحتوى إلى شيء يختلف عن الأصل. إذا تم إزالتها، يفشل التعبير النمطي (regexp) بالخطأ التالي:

...
         1: from /var/www/discourse/script/import_scripts/mbox/support/indexer.rb:174:in `block in each_mail'                                                                         
/var/www/discourse/script/import_scripts/mbox/support/indexer.rb:174:in `=~': invalid byte sequence in UTF-8 (ArgumentError)

لأن المحتوى ليس UTF-8 بالفعل :slight_smile:

هل لديك أي فكرة عن كيفية حل هذه المشكلة؟ ربما المرور الأول على رؤوس البريد الإلكتروني فقط للبحث عن مجموعة الأحرف (charset)؟ يبدو أن هناك مشكلة :chicken: و :egg: هنا.

استبدال:


    line = line.scrub

    if line =~ @split_regex

بـ:

    if line.scrub =~ @split_regex

يبدو أنه يعمل:

لكنني لست متأكدًا مما إذا كانت هذه هي الطريقة الصحيحة لإصلاح هذه المشكلة.

يبدو أنها الطريقة المثلى لحل المشكلة.