rails ruby-on-rails ruby email unicode utf-8

ruby-on-rails - rails action mailer



¿Cómo manejar los encabezados de correo UTF-8(como Asunto:) usando Ruby? (3)

Como ninguna de las respuestas dice sobre el mensaje completo con Ruby puro, aquí está.

Net::SMTP.start("localhost") do |smtp| smtp.open_message_stream opts[:sender_address], opts[:receiver_address] do |f| f.puts "Content-type: text/plain; charset=UTF-8" f.puts from f.puts to f.puts subject f.puts message end end

Aquí abre la conexión a localhost. También es posible utilizar un servidor SMTP externo, consulte la documentación de net / smtp.

La primera línea establece el juego de caracteres utilizado en el mensaje. El resto de las líneas son variables definidas por separado:

from es una dirección en forma de From: Name here <[email protected]> . Si no se quiere un nombre, solo se puede especificar la dirección, como From: [email protected] .

to usa la misma sintaxis, con la excepción From: changed to To:

el sujeto está en forma de Sujeto: sujeto aquí. Para UTF-8, debe estar codificado en Base64 para que se muestre correctamente para los clientes.

subject = "Subject: =?UTF-8?B?" + Base64.strict_encode64(subject) + "?="

El mensaje es un mensaje de texto sin formato codificado en UTF-8, sin ningún prefijo. net / smtp se encargará de formar el correo correcto.

Soy un correo electrónico n00b, pero estoy trabajando en una aplicación que envía correos electrónicos HTML con caracteres Unicode (como mi amigo señaló "disfrutar el infierno de la codificación").

El encabezado Subject: proviene de la entrada del usuario y, por lo tanto, puede contener caracteres Unicode. Algunos clientes de correo (como GMail y Outlook 2007) están de acuerdo con esto, pero según mi lectura, parece que la forma correcta de hacerlo es usar la codificación MIME Encoded-Word para los encabezados.

No puedo encontrar una biblioteca de Ruby para hacer esto. ¿Hay alguno?

Además, ¿hay un encabezado para agregar que indique a los clientes de correo que utilicen UTF-8 cuando muestren el mensaje? Estamos enviando correo electrónico de varias partes para que nuestro tipo de Content-Type sea multipart/mixed . Apple Mail.app en particular no está usando la codificación correcta, a pesar de que se especifica en las partes individuales como UTF-8.


¡Ah ah! ActionMailer::Quoting tiene un método quoted_printable .

Entonces esto es lo que hice:

def my_email(foo) ... @subject = quoted_printable(foo.some_subject_with_accented_chars, ''utf-8'') ... end

Haciendo esto, Mail.app convencido para mostrar el resto del correo electrónico usando UTF-8. ¡Ahora para probar el resto!


Opcionalmente, puede hacer lo mismo con la codificación Base64:

require "base64" value = Base64.encode64("Your UTF-8 string") header = "=?UTF-8?B?" + value + "?="

Tenga en cuenta la "B", que marca la carga útil codificada en Base64, a diferencia de la "Q" que marca la carga útil "codificada en Q". Este último podría ser falsificado mediante la codificación URL de la cadena y reemplazando todos los caracteres "%" por "=".

Al "falsear" me refiero a esto: produciría un resultado válido, pero tal vez se codifiquen más caracteres de los que serían necesarios. La especificación permite codificar cada carácter que hay con "=" + ByteCodeAsHex , simplemente perjudica la legibilidad humana de los encabezados sin formato. UrlEncode es + .gsub(/%/, "=") no es un mal compromiso cuando no hay nada disponible.