2008-09-24 9 views
22

I ont un objet de courrier électronique de la forme:décoder un en-tête de courrier électronique UTF8

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

Le corps de l'email est UTF-8 codés base64 - et a décodé fin. Je suis en train d'utiliser le module Email :: MIME de Perl pour décoder l'email.

Quelle est la signification du délimiteur =? Utf-8 et comment puis-je extraire des informations de cette chaîne?

Répondre

30

Les jetons encoded-word (selon RFC 2047) peuvent apparaître dans les valeurs de certains en-têtes. Ils sont analysés comme suit:

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

jeu de caractères UTF-8 est dans ce cas, le codage est B qui signifie base64 (l'autre option est Q qui signifie Cité imprimable). Pour le lire, commencez par décoder le base64, puis traitez-le comme des caractères UTF-8.

Lire également les divers RFC Internet Mail pour plus de détails, principalement RFC 2047.

Puisque vous utilisez Perl, Encode::MIME::Header pourraient être utiles:

SYNOPSIS

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

RÉSUMÉ

Ce module implémente RFC 2047 Mime tête d'encodage. Il existe 3 variantes de codage ; En-tête MIME, MIME-B et MIME-Q. La différence est décrit ci-dessous

   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

Check out RFC2047. Le 'B' signifie que la partie entre les deux derniers '?' Est encodée en base64. Le 'utf-8' signifie naturellement que les données décodées doivent être interprétées comme UTF-8.

1

Il s'agit d'une extension standard pour l'étiquetage des en-têtes par charset, spécifiée dans RFC2047.

17

Je pense que le module Encode gère que le codage MIME-Header, alors essayez ceci:

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

Cela a été utile, merci. Btw, j'ai également utilisé l'encodage d'impression ('utf-8', $ headers_decoded) pour afficher correctement les en-têtes décodés, si quelqu'un d'autre le lit en écrivant un script de courrier. –

2

MIME::Words de MIME outils fonctionnent bien trop pour cela. J'ai rencontré un problème avec Encode et trouvé MIME :: Words réussi sur certaines chaînes où Encode n'a pas.

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