Importar mapas mbox charset=windows-1252 a �

Hola,

Al importar el archivo mbox que contiene este mensaje

windows.txt|adjunto (3.7 KB)

se muestra de la siguiente manera:

Probablemente sea un problema de codificación, ya que incluye:

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

Otros mensajes con un conjunto de caracteres distinto a UTF-8, es decir, iso-8859-1, se importan correctamente.

Antes de intentar averiguar la raíz del problema explorando el código comenzando por script/import_scripts/mbox/support/indexer.rb, ¿alguien tiene alguna idea? ¿Podría tratarse de un problema ambiental y no del código en sí? ¿Esto también ocurre cuando un usuario que funciona en modo lista de correo envía una respuesta con esta codificación?

Gracias de antemano :slight_smile:

Hice una prueba rápida y Email::Receiver parece funcionar bien. Convierte la entrada a UTF-8. No se me ocurre ninguna razón por la que la codificación debería estar incorrecta después.

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

Gracias por la prueba rápida: no sabría cómo hacerlo yo mismo :slight_smile: ¿Podría ser que falte algo en el contenedor de importación? Me gustaría mucho reproducir lo que hiciste y explorar desde ahí. Si no encuentro nada, proporcionaré instrucciones para reproducir el problema usando el procedimiento de importación mbox con una bandeja de entrada que contenga solo este correo.

Puedes probarlo ejecutando rails console en el contenedor.

Obtengo los mismos resultados que tú, así que el problema no está ahí. Ejecutaré una importación con este correo electrónico y una nueva categoría para verificar que no se trate de algún efecto secundario.

Esto es lo que hice, en una instalación de 2.5.4:

  • shared/standalone/import/settings.yml sin modificar
  • eliminé shared/standalone/import/data/index.db de la importación anterior
  • cambié la cabecera Message-ID:
  • copié windows.txt a shared/standalone/import/data/windows4/windows.mbox
  • ./launcher enter import
  • ejecuté la importación con
root@forum:/var/www/discourse# import_mbox.sh 
La importación de mbox está comenzando...

Cargando grupos existentes...
Cargando usuarios existentes...
Cargando categorías existentes...
Cargando publicaciones existentes...
Cargando temas existentes...

Creando índice
Indexando archivos en /shared/import/data/windows4
Indexando /shared/import/data/windows4/windows.mbox

Indexando respuestas y usuarios

Creando categorías
        1 / 1 (100.0%)  [8121278 elementos/min]  
Creando usuarios
Omitiendo 1 usuario ya importado

Creando temas y publicaciones
        1 / 1 (100.0%)  [219 elementos/min]  

Actualizando estado del tema

Actualizando bumped_at en temas

Actualizando last_posted_at en usuarios

Actualizando last_seen_at en usuarios

Actualizando first_post_created_at...

Actualizando post_count de usuarios...

Actualizando topic_count de usuarios...

Actualizando usuarios de temas

Actualizando tiempos de publicaciones

Actualizando usuarios de temas destacados

Actualizando temas destacados en categorías
        9 / 9 (100.0%)  [1562 elementos/min]  ]  
Reiniciando contadores de temas


Hecho (00h 00min 09seg)
  • Obtuve el mismo resultado que antes, que puedes ver aquí.

¿Podría ser porque Email::Receiver no se llama de la misma manera por el importador?

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

en lugar de

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

O la diferencia radica en cómo se extrae el mensaje del archivo mbox: aquí es donde difiere la ruta del código. El raw_email = File.read("/tmp/windows.mbox") anterior es diferente de dividir el archivo con expresiones regulares, y quizás sea ahí donde ocurren los errores.

Y de hecho, añadir File.open('/tmp/message.txt', 'w') { |file| file.write(receiver.raw_email) } después de esta línea produce el siguiente archivo, que es diferente del archivo original.

message.txt|adjunto (3.7 KB)

Al ejecutarlo desde la consola de Rails, receiver.raw_email también es diferente del archivo original: está correctamente codificado como UTF-8.

¿Alguna idea de dónde ocurre esta modificación incorrecta?

Es posible que necesites agregar una llamada a .force_encoding después de leer el archivo para indicar a Ruby qué codificación tiene el archivo de correo electrónico.

Disculpa si es una pregunta de principiante, pero no estoy familiarizado con la base de código :slight_smile: ¿Tienes alguna sugerencia sobre dónde sería beneficioso hacer un cambio de este tipo?

Después de delimitar dónde ocurre la transformación no deseada, parece ser aquí:

line.scrub es el responsable de transformar el contenido en algo diferente del original. Si se elimina, la expresión regular falla 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)

Esto se debe a que no es UTF-8, de hecho :slight_smile:

¿Alguna idea sobre cómo debería resolverse esto? ¿Quizás un primer pase solo sobre las cabeceras del correo buscando el conjunto de caracteres? Parece que hay un problema de :chicken: y :egg: aquí.

Reemplazando:


    line = line.scrub

    if line =~ @split_regex

por

    if line.scrub =~ @split_regex

parece que está funcionando:

pero no estoy seguro de si esta es la forma correcta de solucionarlo.

Parece una forma perfecta de solucionar el problema.