Импорт mbox карт с кодировкой windows-1252 в

Здравствуйте,

При импорте mbox, содержащего это сообщение

windows.txt|вложение (3.7 КБ)

оно отображается следующим образом:

Скорее всего, это проблема кодировки, так как указано:

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;
cette réflexion me fait penser : y-a-il une obligation/raison (en dehors du coup de maintenannce) à avoir un même outil pour les 2 fonctionnalités (interactions vs galerie) ?

Спасибо за быстрый тест: я бы не знал, как сделать это сам :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 / 1 (100.0%)  [219 элементов/мин]  

Обновление статуса тем

Обновление bumped_at в темах

Обновление last_posted_at у пользователей

Обновление last_seen_at у пользователей

Обновление first_post_created_at...

Обновление post_count у пользователей...

Обновление topic_count у пользователей...

Обновление пользователей тем

Обновление таймингов постов

Обновление пользователей избранных тем

Обновление избранных тем в категориях
        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 отвечает за преобразование содержимого в нечто отличное от оригинала. Если его убрать, регулярное выражение завершится ошибкой:

...
         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:

Есть ли какие-то идеи, как это решить? Возможно, стоит сделать предварительный проход только по заголовкам письма в поисках указанной кодировки? Здесь, кажется, возникает проблема :chicken: и :egg:.

Замена:


    line = line.scrub

    if line =~ @split_regex

на

    if line.scrub =~ @split_regex

кажется, работает:

но я не уверен, что это правильный способ исправить это.

Кажется, это идеальный способ решить проблему.