2012-06-14 12 views
9

Estoy tratando de analizar las cadenas de correo electrónico con el Ruby mail gem, y estoy teniendo un diablo de tiempo con codificaciones de caracteres. Tome el siguiente correo electrónico:Codificación de caracteres con Ruby 1.9.3 y la gema de correo

MIME-Version: 1.0 
Sender: [email protected] 
Received: by 10.142.239.17 with HTTP; Thu, 14 Jun 2012 06:00:18 -0700 (PDT) 
Date: Thu, 14 Jun 2012 09:00:18 -0400 
Delivered-To: [email protected] 
X-Google-Sender-Auth: MxfFrMybNjBoBt4O4GwAn9cMsko 
Message-ID: <[email protected]om> 
Subject: Re: [Lorem Ipsum] Foo updated the forum topic 'Reply by email test' 
From: Foo Bar <[email protected]> 
To: Foo <[email protected]> 
Content-Type: text/plain; charset=ISO-8859-1 
Content-Transfer-Encoding: quoted-printable 

This email has accents:=A0R=E9sum=E9 
> 
> --------- Reply Above This Line ------------ 
> 
> Email parsing with accents: R=E9sum=E9 
> 
> Click here to view this post in your browser 

El cuerpo del correo electrónico, cuando se codifica correctamente, debería ser:

This reply has accents: Résumé 
> 
> --------- Reply Above This Line ------------ 
> 
> Email parsing with accents: Résumé 
> 
> Click here to view this post in your browser 

Sin embargo, estoy teniendo un diablo de un tiempo realmente conseguir las tildes para salir adelante. Esto es lo que he intentado:

message = Mail.new(email_string) 
body = message.body.decoded 

que me pone una cadena que comienza así:

This reply has accents:\xA0R\xE9sum\xE9\r\n>\r\n> --------- Reply Above This Line ------------ 

Por último, intento esto:

body.encoding # => <Encoding:ASCII-8BIT> 
body.encode("UTF-8") # => Encoding::UndefinedConversionError: "\xA0" from ASCII-8BIT to UTF-8 

¿Alguien tiene alguna sugerencia sobre ¿Como lidiar con esto? Estoy bastante seguro de que tiene que ver con la configuración "charset = ISO-8859-1" en el correo electrónico, pero no estoy seguro de cómo usar eso, o si hay una forma de extraerlo fácilmente usando la gema del correo.

Respuesta

17

Después de jugar un poco, me encontré esto:

body.decoded.force_encoding("ISO-8859-1").encode("UTF-8") # => "This reply has accents: Résumé..." 
message.parts.map { |part| part.decoded.force_encoding("ISO-8859-1").encode(part.charset) } # multi-part 

puede extraer el juego de caracteres del mensaje como tal.

message.charset #=> for simple, non-multipart 
message.parts.map { |part| part.charset } #=> for multipart, each part can have its own charset 

tener cuidado con no multiparte, como el siguiente puede causar problemas:

body.charset #=> returns "US-ASCII" which is WRONG! 
body.force_encoding(body.charset).encode("UTF-8") #=> Conversion error... 

body.force_encoding(message.charset).encode("UTF-8") #=> Correct conversion :) 
+1

Impresionante. Estado buscando esto Terminó haciendo esto: body = message.text_part.encode ('UTF-8', message.text_part.charset,: invalid =>: replace,: undef =>: replace) –

+0

Impresionante ...... Gracias tun ... – Jyothu

+0

Algunas partes parecen tener un juego de caracteres nil. Todavía no estoy seguro de cómo manejarlos. –

0

Esto no funcionó para mí, así que pensé que se adhieren a la solución que me dieron en el caso ayuda a cualquier persona ...

Básicamente tuvo que agregar valores predeterminados de codificación y modificar la salida en cadenas sensibles. https://stackoverflow.com/a/26604049/2386548

Cuestiones relacionadas