2008-09-24 25 views
22

I tiene un asunto del correo electrónico de la forma:Decode un encabezado de correo electrónico UTF8

=?utf-8?B?T3.....?= 

El cuerpo del correo electrónico es UTF-8 base64 codificados - y ha decodificado bien. Estoy al día usando el módulo Perl's Email :: MIME para decodificar el correo electrónico.

¿Cuál es el significado del delimitador =? Utf-8 y cómo extraigo información de esta cadena?

Respuesta

30

Los tokens encoded-word (según RFC 2047) pueden aparecer en los valores de algunos encabezados. Ellos se analizan como sigue:

=?<charset>?<encoding>?<data>?= 

Charset es UTF-8 en este caso, la codificación es B que significa base64 (la otra opción es Q que significa Citado imprimible).

Para leerlo, primero decodifique la base64, luego trátela como caracteres UTF-8.

Lea también varios RFC de Internet Mail para obtener más detalles, principalmente RFC 2047.

dado que está utilizando Perl, Encode::MIME::Header podría ser de utilidad:

SINOPSIS

use Encode qw/encode decode/; 
$utf8 = decode('MIME-Header', $header); 
$header = encode('MIME-Header', $utf8); 

RESUMEN

Este módulo implementa RFC 2047 Mime cabecera de codificación. Hay 3 variantes de nombres de codificación ; MIME-Header, MIME-B y MIME-Q. La diferencia se describe a continuación

   decode()   encode() 
MIME-Header Both B and Q  =?UTF-8?B?....?= 
MIME-B  B only; Q croaks =?UTF-8?B?....?= 
MIME-Q  Q only; B croaks =?UTF-8?Q?....?= 
3

Salida RFC2047. La 'B' significa que la parte entre los dos últimos '' '' está codificada en base64. El 'utf-8' naturalmente significa que los datos decodificados deben interpretarse como UTF-8.

1

Esta es una extensión estándar para el etiquetado de encabezados de conjunto de caracteres, especificado en RFC2047.

17

creo que el módulo Encode se encarga de que con la codificación MIME-Header, a fin de tratar esto:

use Encode qw(decode); 
my $decoded = decode("MIME-Header", $encoded); 
+1

Eso fue útil, gracias. Por cierto, también utilicé la codificación de impresión ('utf-8', $ headers_decoded) para mostrar correctamente los encabezados decodificados, si alguien más está leyendo esto mientras escribe algún script de correo. –

2

MIME::Words de MIME-herramientas también funcionan bien para esto. Me encontré con algún problema con Encode y encontré que MIME :: Words tuvo éxito en algunas cadenas donde Encode no lo hizo.

use MIME::Words qw(:all); 
$decoded = decode_mimewords(
    'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <[email protected]>', 
); 
Cuestiones relacionadas