Importer des cartes mbox charset=windows-1252 vers �

Bonjour,

Lors de l’importation du fichier mbox contenant ce message

windows.txt|pièce jointe (3,7 Ko)

il s’affiche comme ceci :

Il s’agit probablement d’un problème d’encodage, car il contient :

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

D’autres messages avec un jeu de caractères non UTF-8, par exemple iso-8859-1, sont importés correctement.

Avant d’essayer de trouver la cause racine du problème en explorant le code source en commençant par script/import_scripts/mbox/support/indexer.rb, quelqu’un a-t-il une idée ? Cela pourrait-il être lié à l’environnement et non au code ? Cela se produit-il également lorsqu’un utilisateur fonctionnant en mode liste de diffusion répond avec cette encodage ?

Merci d’avance :slight_smile:

J’ai fait un test rapide et Email::Receiver semble fonctionner correctement. Il convertit l’entrée en UTF-8. Je ne vois aucune raison pour laquelle l’encodage devrait être incorrect par la suite.

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

Merci pour le test rapide : je ne saurais pas comment le faire moi-même :slight_smile: Est-il possible qu’il manque quelque chose dans le conteneur d’importation ? J’aimerais beaucoup reproduire ce que vous avez fait et explorer à partir de là. Si je ne trouve rien, je fournirai des instructions pour reproduire le problème en utilisant la procédure d’importation mbox avec une boîte de réception contenant uniquement ce seul e-mail.

Vous pouvez l’essayer en exécutant rails console dans le conteneur.

J’obtiens les mêmes résultats que vous, donc le problème ne vient pas de là. Je vais lancer une importation avec uniquement cet e-mail et une nouvelle catégorie pour vérifier qu’il ne s’agit pas d’un effet secondaire.

Voici ce que j’ai fait, sur une installation de 2.5.4 :

  • shared/standalone/import/settings.yml non modifié
  • suppression de shared/standalone/import/data/index.db provenant de l’import précédent
  • modification de l’en-tête Message-ID
  • copie de windows.txt dans shared/standalone/import/data/windows4/windows.mbox
  • ./launcher enter import
  • exécution de l’import avec
root@forum:/var/www/discourse# import_mbox.sh 
L'importation du fichier mbox commence...

Chargement des groupes existants...
Chargement des utilisateurs existants...
Chargement des catégories existantes...
Chargement des messages existants...
Chargement des sujets existants...

Création de l'index
Indexation des fichiers dans /shared/import/data/windows4
Indexation de /shared/import/data/windows4/windows.mbox

Indexation des réponses et des utilisateurs

Création des catégories
        1 / 1 (100,0 %)  [8121278 éléments/min]  
Création des utilisateurs
1 utilisateur déjà importé ignoré

Création des sujets et des messages
        1 / 1 (100,0 %)  [219 éléments/min]  

Mise à jour du statut des sujets

Mise à jour de bumped_at sur les sujets

Mise à jour de last_posted_at sur les utilisateurs

Mise à jour de last_seen_at sur les utilisateurs

Mise à jour de first_post_created_at...

Mise à jour du nombre de messages des utilisateurs...

Mise à jour du nombre de sujets des utilisateurs...

Mise à jour des utilisateurs associés aux sujets

Mise à jour des horaires des messages

Mise à jour des utilisateurs des sujets en vedette

Mise à jour des sujets en vedette dans les catégories
        9 / 9 (100,0 %)  [1562 éléments/min]  ]  
Réinitialisation des compteurs de sujets


Terminé (00h 00min 09sec)
  • J’ai obtenu le même résultat que ci-dessus, que vous pouvez voir ici.

Cela pourrait-il être dû au fait que Email::Receiver n’est pas appelé de la même manière par l’importateur ?

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

au lieu de

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

Ou la différence réside dans la façon dont le message est extrait du fichier mbox : c’est là que le chemin d’exécution du code diffère. L’instruction raw_email = File.read("/tmp/windows.mbox") ci-dessus n’est pas identique à la division du fichier à l’aide d’expressions régulières, et c’est peut-être là que les choses tournent mal.

Et effectivement, l’ajout de File.open('/tmp/message.txt', 'w') { |file| file.write(receiver.raw_email) } après cette ligne produit le fichier suivant, qui est différent du fichier original.

message.txt|pièce jointe (3,7 ko)

Lors de l’exécution depuis la console Rails, receiver.raw_email est également différent du fichier original : il est correctement encodé en UTF-8.

Une idée de l’endroit où cette modification incorrecte se produit ?

Vous devrez peut-être ajouter un appel à .force_encoding après la lecture du fichier pour indiquer à Ruby l’encodage du fichier d’e-mail.

Désolé si c’est une question de débutant, mais je ne connais pas bien la base de code :slight_smile: Avez-vous une suggestion sur l’endroit où un tel changement serait bénéfique ?

Après avoir réduit la zone où la transformation indésirable se produit, il semble que ce soit ici :

line.scrub est responsable de la transformation du contenu en quelque chose de différent de l’original. Si on l’enlève, l’expression régulière échoue avec :

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

Car ce n’est pas en UTF-8, en effet :slight_smile:

Une idée sur la façon de résoudre cela ? Peut-être un premier passage sur les en-têtes du courriel uniquement pour rechercher le jeu de caractères ? Il semble y avoir un problème :chicken: et :egg: ici.

Le remplacement :


    line = line.scrub

    if line =~ @split_regex

par

    if line.scrub =~ @split_regex

semble fonctionner :

mais je ne suis pas sûr que ce soit la bonne façon de corriger cela.

Ça ressemble à une façon parfaite de résoudre le problème.