Importar mapas mbox charset=windows-1252 para �

Olá,

Ao importar o mbox contendo esta mensagem

windows.txt|anexo (3,7 KB)

ele aparece assim:

Provavelmente é um problema de codificação, pois contém:

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

Outras mensagens com charset não UTF-8, ou seja, iso-8859-1, são importadas corretamente.

Antes de tentar descobrir a raiz do problema explorando o código-fonte começando por script/import_scripts/mbox/support/indexer.rb, alguém tem alguma ideia? Poderia ser algo ambiental e não no código-base? Isso também acontece quando um usuário no modo de lista de e-mails envia uma resposta com essa codificação?

Obrigado desde já :slight_smile:

Fiz um teste rápido e Email::Receiver parece funcionar bem. Ele converte a entrada para UTF-8. Não consigo pensar em nenhuma razão pela qual a codificação estaria errada depois.

[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\) ?

Obrigado pelo teste rápido: eu não saberia como fazer isso sozinho :slight_smile: Será que algo está faltando no contêiner de importação? Eu gostaria muito de reproduzir o que você fez e explorar a partir daí. Se eu não encontrar nada, fornecerei instruções para reproduzir o problema usando o procedimento de importação mbox com uma caixa de entrada contendo apenas este único e-mail.

Você pode testar executando rails console no container.

Eu obtenho os mesmos resultados que você, então o problema não está aí. Vou executar uma importação com apenas este e-mail e uma nova categoria para verificar se isso não é algum efeito colateral.

Aqui está o que fiz, em uma instalação da versão 2.5.4:

  • shared/standalone/import/settings.yml sem modificações
  • Removi shared/standalone/import/data/index.db da importação anterior
  • Alterei o cabeçalho Message-ID:
  • Copiei windows.txt para shared/standalone/import/data/windows4/windows.mbox
  • Executei ./launcher enter import
  • Executei a importação com:
root@forum:/var/www/discourse# import_mbox.sh 
A importação do mbox está iniciando...

Carregando grupos existentes...
Carregando usuários existentes...
Carregando categorias existentes...
Carregando posts existentes...
Carregando tópicos existentes...

Criando índice
Indexando arquivos em /shared/import/data/windows4
Indexando /shared/import/data/windows4/windows.mbox

Indexando respostas e usuários

Criando categorias
        1 / 1 (100.0%)  [8121278 itens/min]  
Criando usuários
Ignorando 1 usuário já importado

Criando tópicos e posts
        1 / 1 (100.0%)  [219 itens/min]  

Atualizando status do tópico

Atualizando bumped_at nos tópicos

Atualizando last posted at nos usuários

Atualizando last seen at nos usuários

Atualizando first_post_created_at...

Atualizando post_count do usuário...

Atualizando topic_count do usuário...

Atualizando usuários do tópico

Atualizando tempos dos posts

Atualizando usuários de tópicos em destaque

Atualizando tópicos em destaque nas categorias
        9 / 9 (100.0%)  [1562 itens/min]  ]  
Reiniciando contadores de tópicos


Concluído (00h 00min 09s)
  • Obtive o mesmo resultado que acima, que você pode ver aqui.

Será que é porque Email::Receiver não é chamado da mesma maneira pelo importador?

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

em vez de

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

Ou a diferença está na forma como a mensagem é extraída do arquivo mbox: é aqui que o caminho do código difere. O raw_email = File.read("/tmp/windows.mbox") acima é diferente de dividir o arquivo com expressões regulares, e talvez seja aí que as coisas deem errado.

E de fato, adicionar File.open('/tmp/message.txt', 'w') { |file| file.write(receiver.raw_email) } após esta linha produz o seguinte arquivo, que é diferente do arquivo original.

message.txt (3.7 KB)

Ao executar pelo console do Rails, receiver.raw_email também é diferente do arquivo original: está corretamente codificado como UTF-8.

Alguma ideia de onde ocorre essa modificação incorreta?

Pode ser necessário adicionar uma chamada a .force_encoding após ler o arquivo para informar ao Ruby qual é a codificação do arquivo de e-mail.

Desculpe se for uma pergunta de iniciante, mas não estou familiarizado com a base de código :slight_smile: Você tem alguma sugestão sobre onde uma mudança desse tipo seria benéfica?

Depois de identificar onde ocorre a transformação indesejada, parece ser aqui:

O line.scrub é responsável por transformar o conteúdo em algo diferente do original. Se removido, a expressão regular falha com:

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

Isso ocorre porque o conteúdo não é UTF-8, de fato :slight_smile:

Alguma ideia de como isso deve ser resolvido? Talvez uma primeira passagem apenas nos cabeçalhos do e-mail, procurando pelo charset? Parece haver um problema de :chicken: e :egg: aqui.

Substituindo:


    line = line.scrub

    if line =~ @split_regex

por

    if line.scrub =~ @split_regex

parece estar funcionando:

mas não tenho certeza se esta é a maneira correta de corrigir isso.

Parece uma maneira perfeita de resolver o problema.