Pregunta sobre email, utf-8, encoding, subject, perl – ¿Cómo codificar asunto del correo en perl?

5

¿Cómo codificar asunto del correo en perl?

Ahora finalmente encontré algo pero todavía no funciona:

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

Pero el resultado (con error) es:

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

Que muestra:

Votre fichier a bien étéenvoyé

(Come algunos espacios)

Actualiza tu versión MIME :: Palabras. Esto esbug # 5462 en MIME: Herramientas, que se ha corregido en MIME :: Tools 5.504 a principios de 2013. Palec

Tu respuesta

2   la respuesta
16

UtilizarCodificar, es un módulo básico.

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

... producirá uno de los siguientes:

=?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 se imprimirá:

Votre fichier a bien été envoyé

Si aún tiene los mismos resultados, debe proporcionar más información sobre su entorno Perl. La versión es un buen arranque.

Genial, muchas gracias! Usé Encode y usé Encode ("MIME-q", "Votre fichier a bien été envoyé") Denis BUCHER
¿Podría proporcionar un enlace a esos informes / ejemplos y también tal vez una alternativa que funcione mejor para usted? matthias krull
Nota pedante: condecode a menos que haya una razón específica para lo contrario, es mejor usarMIME-Header, ya que puede manejar tanto las codificaciones MIME Q como las BRFC 2047 indica que "un lector de correo que afirma reconocer 'la palabra codificada DEBE poder aceptar cualquiera de las codificaciones para cualquier conjunto de caracteres que admita". Ven'Tatsu
En realidad, Encode :: MIME :: Header tiene errores y, por lo que vi en el bugtracker, el autor es incompetente. Él cerró repetidamente los informes de errores correctos, 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 se basan en él y el script Perl en todo el Internet envía un correo electrónico roto. Palec
2

Otro módulo que maneja la codificación MIME de cadenas que no son ASCII esCorreo electrónico :: 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";

huellas dactilares

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

Algunos beneficios de Email :: MIME :: RFC2047 sobre Encode:

Intenta usar la codificación MIME para la menor cantidad de palabras posible, también mediante el uso de cadenas entre comillas en las frases.Admite la decodificación correcta de las frases MIME utilizadas en los encabezados A, De o Cc (imposible con Encode).Es compatible con otros conjuntos de caracteres que UTF-8.Codifica el espacio como guión bajo en palabras codificadas MIME-Q.Tiene menos errores que Encode (ninguno que yo sepa).

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

Lo miraré más en algún momento. Debe realizar el plegado de líneas en algún lugar, ya que las RFC imponen un fuerte límite en cuanto a la duración de una línea que contiene una palabra codificada. Si no se pliega, no puede codificar texto largo y arbitrario. Palec
@Palec Solo me aseguro de que las palabras codificadas MIME no sean más largas que la longitud máxima (75 caracteres aproximadamente). El plegado de líneas se realiza mediante un módulo que gestiona los encabezados comoEmail::Simple. nwellnhof
En la descripción del módulo escribes 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 está bien soportado, AFAIK, pero sí RFC 2822 (desde 2001 ) es compatible y corrige al menos el plegado de líneas, que está roto en RFC 822. ¿Tiene alguna razón para preferir 822 sobre 2822? Palec
@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 la codificación y decodificación no doblan líneas, y solo funcionan conphrase ytext producciones nwellnhof

Preguntas relacionadas