2012-08-15 16 views
5

Cómo codificar el asunto del correo en Perl?Cómo codificar el asunto del correo en Perl?

Ahora por fin encontró algo, pero todavía no está funcionando:

use MIME::Words qw/encode_mimewords/; 
$recipientsubject = encode_mimewords('Votre fichier a bien été envoyé'); 

Pero el (pinchado) resultado es:

Asunto:? Votre fichier a bien = ISO-8859-1? Q = E9t = E9 = = ISO-8859-1 Q enviado = E9 =

que muestra:??????

Votre fichier un busque étéenvoyé

(Se alimenta de algunos espacios)

+1

Actualice su versión MIME :: Palabras. Este es [error # 5462 en MIME: Herramientas] (https://rt.cpan.org/Public/Bug/Display.html?id=5462), que se ha corregido en MIME :: Tools 5.504 a principios de 2013. – Palec

Respuesta

16

Uso Encode, es un módulo de núcleo.

perl -Mutf8 -MEncode -E 'say encode("MIME-Header", "Votre fichier a bien été envoyé")' 

... de salida, o bien uno de:

=?UTF-8?Q?Votre=20fichier=20a=20bien=20?= =?UTF-8?Q?=C3=A9t=C3=A9=20envoy=C3=A9?= 
=?UTF-8?B?Vm90cmUgZmljaGllciBhIGJpZW4gw6l0w6kgZW52b3nDqQ==?= 

y decodificar con:

perl -C -MEncode -E 'say decode("MIME-Header", "=?UTF-8?Q?Votre=20fichier=20a=20bien=20?= =?UTF-8?Q?=C3=A9t=C3=A9=20envoy=C3=A9?=")' 
perl -C -MEncode -E 'say decode("MIME-Header", "=?UTF-8?B?Vm90cmUgZmljaGllciBhIGJpZW4gw6l0w6kgZW52b3nDqQ==?=")' 

que imprimirá:

Votre fichier a bien été envoyé 

Si todavía tiene los mismos resultados , deberías dar más información sobre su entorno Perl. La versión es un buen comienzo.

+4

Nota pedante: con 'decode' a menos que haya una razón específica en contra, es mejor usar' MIME-Header', ya que puede manejar las codificaciones MIME Q y B. [RFC 2047] (http://www.ietf.org/rfc/rfc2047.txt) establece que "un lector de correo que dice reconocer 'palabras codificadas' DEBE poder aceptar cualquier codificación para cualquier juego de caracteres que admita". –

+1

Genial, muchas gracias! Utilicé Encode y usé encode ("MIME-q", "Votre fichier a bien été envoyé") –

+0

En realidad, Encode :: MIME :: Header tiene errores y, por lo que vi en el bugtracker, el autor es incompetente. Repetidamente cerró los informes correctos de errores, incluso cuando se le presentaron referencias válidas a los RFC. En realidad, debido a que Encode :: MIME :: Header es un módulo central, muchos otros módulos dependen de él y las secuencias de comandos de Perl en todo el Internet envían correos electrónicos rotos. – Palec

2

Otro módulo que maneja la codificación MIME de cadenas que no son ASCII es Email::MIME::RFC2047. Por ejemplo

use strict; 
use warnings; 
use utf8; 

use Email::MIME::RFC2047::Encoder; 
use Email::MIME::RFC2047::Decoder; 

binmode(STDOUT, ':utf8'); 

my $encoder = Email::MIME::RFC2047::Encoder->new; 
my $encoded = $encoder->encode_text('Votre fichier a bien été envoyé'); 
print "$encoded\n"; 

my $decoder = Email::MIME::RFC2047::Decoder->new; 
my $decoded = $decoder->decode_text($encoded); 
print "$decoded\n"; 

impresiones

Votre fichier a bien =?utf-8?Q?=c3=a9t=c3=a9_envoy=c3=a9?= 
Votre fichier a bien été envoyé 

Algunos de los beneficios de correo electrónico MIME :: :: RFC2047 más Codificar:

  • Se trata difícil de usar codificación MIME para tan pocas palabras como sea posible, también mediante el uso de cadenas entre comillas en frases.
  • Admite la decodificación correcta de frases MIME utilizadas en los encabezados To, From o Cc (imposible con Encode).
  • Es compatible con otros juegos de caracteres que UTF-8.
  • Codifica el espacio como guion bajo en palabras codificadas MIME-Q.
  • Tiene menos errores que Encode (ninguno que yo sepa).

Divulgación: soy el autor del módulo.

+0

En la descripción del módulo, escribe sobre RFC 822. Es el más antiguo, obsoleto por RFC 2822, que a su vez está obsoleto por RFC 5322. El más reciente (desde 2008) no es compatible, AFAIK, pero RFC 2822 (de 2001) es compatible y corrige al menos el plegado de líneas, que se rompe en RFC 822. ¿Tiene alguna razón para preferir 822 a más de 2822? – Palec

+0

@Palec Debo admitir que no tengo ni idea de las diferencias entre los RFC. Pero creo que mi módulo cumple con RFC 2822 y posiblemente con RFC 5322 también. Las clases principales para codificación y decodificación no doblan líneas, y solo funcionan con producciones 'phrase' y' text'. – nwellnhof

+0

Lo investigaré más en algún momento. Tienes que realizar el plegado de líneas en alguna parte, porque las RFC imponen un límite fuerte a la longitud de una línea que contiene una palabra codificada. Si no se retira, no puede codificar texto arbitrariamente largo. – Palec

Cuestiones relacionadas