Importiere mbox-Karten charset=windows-1252 nach �

Hallo,

beim Importieren des mbox, das diese Nachricht enthält

windows.txt (3,7 KB)

wird es so angezeigt:

Es handelt sich wahrscheinlich um ein Kodierungsproblem, da es Folgendes enthält:

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

Andere Nachrichten mit einem Nicht-UTF-8-Zeichensatz, z. B. iso-8859-1, werden korrekt importiert.

Bevor ich versuche, die Ursache des Problems zu finden, indem ich den Quellcode untersuche, beginnend mit script/import_scripts/mbox/support/indexer.rb, hat jemand eine Idee? Könnte es ein Umgebungsproblem sein und nicht im Code vorhanden? Tritt dies auch auf, wenn ein Benutzer im Mailinglisten-Modus eine Antwort mit dieser Kodierung sendet?

Vielen Dank im Voraus :slight_smile:

Ich habe einen kurzen Test durchgeführt, und Email::Receiver scheint einwandfrei zu funktionieren. Es wandelt die Eingabe in UTF-8 um. Ich kann mir keinen Grund vorstellen, warum die Kodierung danach falsch sein sollte.

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

Danke für den schnellen Test: Ich wüsste selbst nicht, wie ich das machen soll :slight_smile: Könnte es sein, dass im Import-Container etwas fehlt? Ich würde sehr gerne nachvollziehen, was du gemacht hast, und von dort aus weiterforschen. Falls ich nichts finde, werde ich Anweisungen bereitstellen, um das Problem mit dem mbox-Importverfahren zu reproduzieren, wobei der Posteingang nur diese eine E-Mail enthält.

Sie können es ausprobieren, indem Sie rails console im Container ausführen.

Ich erhalte die gleichen Ergebnisse wie du, also liegt das Problem nicht dort. Ich führe einen Import nur mit dieser E-Mail und einer neuen Kategorie durch, um zu überprüfen, ob dies keine Nebenwirkung ist.

Hier ist, was ich bei einer Installation von 2.5.4 getan habe:

  • unveränderte shared/standalone/import/settings.yml
  • entfernte shared/standalone/import/data/index.db aus dem vorherigen Import
  • änderte den Message-ID:-Header
  • kopierte windows.txt nach shared/standalone/import/data/windows4/windows.mbox
  • ./launcher enter import
  • führte den Import mit folgendem Befehl aus:
root@forum:/var/www/discourse# import_mbox.sh 
Der Mbox-Import startet...

Lade vorhandene Gruppen...
Lade vorhandene Benutzer...
Lade vorhandene Kategorien...
Lade vorhandene Beiträge...
Lade vorhandene Themen...

Erstelle Index
Indexiere Dateien in /shared/import/data/windows4
Indexiere /shared/import/data/windows4/windows.mbox

Indexiere Antworten und Benutzer

Erstelle Kategorien
        1 / 1 (100,0%)  [8121278 Einträge/min]  
Erstelle Benutzer
Überspringe 1 bereits importierten Benutzer

Erstelle Themen und Beiträge
        1 / 1 (100,0%)  [219 Einträge/min]  

Aktualisiere Themenstatus

Aktualisiere bumped_at bei Themen

Aktualisiere last_posted_at bei Benutzern

Aktualisiere last_seen_at bei Benutzern

Aktualisiere first_post_created_at...

Aktualisiere user post_count...

Aktualisiere user topic_count...

Aktualisiere topic users

Aktualisiere post timings

Aktualisiere featured topic users

Aktualisiere featured topics in Kategorien
        9 / 9 (100,0%)  [1562 Einträge/min]  ]  
Setze Themenzähler zurück


Fertig (00h 00min 09sek)
  • Erhielt dasselbe Ergebnis wie oben, das du hier sehen kannst.

Könnte es daran liegen, dass Email::Receiver vom Importer nicht auf die gleiche Weise aufgerufen wird?

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

anstatt

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

Oder der Unterschied liegt darin, wie die Nachricht aus der mbox-Datei extrahiert wird: Hier weicht der Codepfad ab. Das oben gezeigte raw_email = File.read("/tmp/windows.mbox") unterscheidet sich vom Aufteilen der Datei mit regulären Ausdrücken, und vielleicht liegt hier der Fehler.

Und tatsächlich erzeugt das Hinzufügen von File.open('/tmp/message.txt', 'w') { |file| file.write(receiver.raw_email) } nach dieser Zeile die folgende Datei, die sich von der Originaldatei unterscheidet.\n\nmessage.txt (3,7 KB)\n\nBeim Ausführen in der Rails-Konsole ist receiver.raw_email ebenfalls von der Originaldatei verschieden: Sie ist korrekt als UTF-8 kodiert.\n\nHaben Sie eine Idee, wo diese falsche Änderung stattfindet?

Es kann sein, dass Sie nach dem Lesen der Datei einen Aufruf von .force_encoding hinzufügen müssen, um Ruby mitzuteilen, welche Kodierung die E-Mail-Datei hat.

Entschuldigung, falls das eine Anfängerfrage ist, aber ich bin mit der Codebasis nicht vertraut :slight_smile: Hast du einen Vorschlag, wo eine solche Änderung sinnvoll wäre?

Nachdem wir eingegrenzt haben, wo die unerwünschte Transformation stattfindet, scheint es hier zu sein:

line.scrub ist dafür verantwortlich, den Inhalt in etwas zu verwandeln, das sich vom Original unterscheidet. Wenn dies entfernt wird, schlägt der reguläre Ausdruck mit folgendem Fehler fehl:

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

Denn es ist nicht UTF-8, tatsächlich :slight_smile:

Haben Sie eine Idee, wie dies gelöst werden sollte? Vielleicht ein erster Durchgang nur durch die E-Mail-Header, um nach dem Zeichensatz zu suchen? Hier scheint ein :chicken:-und-:egg:-Problem vorzuliegen.

Ersetzen:


    line = line.scrub

    if line =~ @split_regex

durch

    if line.scrub =~ @split_regex

scheint zu funktionieren:

aber ich bin mir nicht sicher, ob dies der richtige Weg ist, dies zu beheben.

Das sieht nach einer perfekten Lösung für das Problem aus.