Importa mappe mbox charset=windows-1252 a �

Ciao,

Quando importi il file mbox contenente questo messaggio

windows.txt (3,7 KB)

viene visualizzato così:

È probabile che si tratti di un problema di codifica, dato che contiene:

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

Altri messaggi con charset non UTF-8, ad esempio iso-8859-1, vengono importati correttamente.

Prima di cercare di individuare la causa del problema esplorando il codice partendo da script/import_scripts/mbox/support/indexer.rb, qualcuno ha un’idea? Potrebbe essere un problema ambientale e non nel codice? Accade anche quando un utente che opera in modalità mailing list invia una risposta con questa codifica?

Grazie in anticipo :slight_smile:

Ho fatto un test rapido e Email::Receiver sembra funzionare correttamente. Converte l’input in UTF-8. Non riesco a pensare a un motivo per cui la codifica dovrebbe essere errata in seguito.

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

Grazie per il test veloce: non saprei come farlo da solo :slight_smile: Potrebbe essere che manchi qualcosa nel container di importazione? Mi farebbe molto piacere riprodurre ciò che hai fatto ed esplorare da lì. Se non trovo nulla, fornirò le istruzioni per riprodurre il problema utilizzando la procedura di importazione mbox con una casella di posta contenente solo questa singola email.

Puoi provarlo eseguendo rails console nel contenitore.

Otengo gli stessi risultati che hai ottenuto tu, quindi il problema non è lì. Eseguirò un’importazione con questa sola email e una nuova categoria per verificare che non si tratti di un qualche effetto collaterale.

Ecco cosa ho fatto, su un’installazione di 2.5.4:

  • shared/standalone/import/settings.yml non modificato
  • rimosso shared/standalone/import/data/index.db dall’importazione precedente
  • modificato l’intestazione Message-ID:
  • copiato windows.txt in shared/standalone/import/data/windows4/windows.mbox
  • eseguito ./launcher enter import
  • avviata l’importazione con
root@forum:/var/www/discourse# import_mbox.sh 
L'importazione del mbox sta iniziando...

Caricamento dei gruppi esistenti...
Caricamento degli utenti esistenti...
Caricamento delle categorie esistenti...
Caricamento dei post esistenti...
Caricamento degli argomenti esistenti...

Creazione dell'indice
Indicizzazione dei file in /shared/import/data/windows4
Indicizzazione di /shared/import/data/windows4/windows.mbox

Indicizzazione delle risposte e degli utenti

Creazione delle categorie
        1 / 1 (100.0%)  [8121278 elementi/min]  
Creazione degli utenti
Saltati 1 utenti già importati

Creazione degli argomenti e dei post
        1 / 1 (100.0%)  [219 elementi/min]  

Aggiornamento dello stato degli argomenti

Aggiornamento di bumped_at sugli argomenti

Aggiornamento di last posted at sugli utenti

Aggiornamento di last seen at sugli utenti

Aggiornamento di first_post_created_at...

Aggiornamento del conteggio dei post per utente...

Aggiornamento del conteggio degli argomenti per utente...

Aggiornamento degli utenti degli argomenti

Aggiornamento dei tempi dei post

Aggiornamento degli utenti degli argomenti in evidenza

Aggiornamento degli argomenti in evidenza nelle categorie
        9 / 9 (100.0%)  [1562 elementi/min]  ]  
Reimpostazione dei contatori degli argomenti


Completato (00h 00min 09sec)
  • Ho ottenuto lo stesso risultato di prima, che puoi vedere qui.

Potrebbe essere perché Email::Receiver non viene chiamato nello stesso modo dall’importatore?

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

invece di

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

Oppure la differenza risiede nel modo in cui il messaggio viene estratto dal file mbox: è qui che il percorso del codice cambia. L’istruzione raw_email = File.read("/tmp/windows.mbox") mostrata sopra è diversa dal dividere il file con espressioni regolari, e forse è proprio qui che si verificano gli errori.

E in effetti, aggiungendo File.open('/tmp/message.txt', 'w') { |file| file.write(receiver.raw_email) } dopo questa riga si ottiene il seguente file, che è diverso dal file originale.

message.txt (3.7 KB)

Quando si esegue dalla console di Rails, anche receiver.raw_email è diverso dal file originale: è correttamente codificato in UTF-8.

Avete qualche idea su dove avvenga questa modifica errata?

Potrebbe essere necessario aggiungere una chiamata a .force_encoding dopo aver letto il file per indicare a Ruby la codifica del file email.

Scusa se è una domanda da principiante, ma non conosco bene il codice :slight_smile: Hai un suggerimento su dove un cambiamento del genere potrebbe essere utile?

Dopo aver individuato dove avviene la trasformazione indesiderata, sembra che sia qui:

line.scrub è responsabile della trasformazione del contenuto in qualcosa di diverso dall’originale. Se rimosso, l’espressione regolare fallisce con:

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

Perché non è affatto UTF-8, in effetti :slight_smile:

Hai qualche idea su come risolvere questo problema? Forse un primo passaggio sui soli intestazioni delle email per cercare il charset? Sembra esserci qui un problema :chicken: e :egg:.

Sostituendo:


    line = line.scrub

    if line =~ @split_regex

con

    if line.scrub =~ @split_regex

sembra funzionare:

ma non sono sicuro che questo sia il modo corretto per risolvere il problema.

Sembra un modo perfetto per risolvere il problema.