Question

J'ai un objet de courrier électronique sous la forme suivante:

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

Le corps de l'email est encodé en utf-8 base64 - et a été décodé correctement. J'utilise actuellement le module Email :: MIME de Perl pour décoder l'e-mail.

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

Était-ce utile?

La solution

Les mot codé (comme La RFC 2047 ) peut apparaître dans les valeurs de certains en-têtes. Ils sont analysés comme suit:

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

Le jeu de caractères est UTF-8 dans ce cas, le codage est B , ce qui signifie base64 (l'autre option est Q , qui signifie "cotes imprimables").

Pour le lire, commencez par décoder le base64, puis traitez-le comme un caractère UTF-8.

Lisez également les différents RFC Internet Mail pour plus de détails, principalement RFC 2047 .

Puisque vous utilisez Perl, Encode :: MIME :: En-tête pourrait être utile:

  

SYNOPSIS

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

RÉSUMÉ

     

Ce module implémente la RFC 2047 Mime   Encodage d'en-tête. Il y a 3 variantes   coder les noms; 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?....?=

Autres conseils

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

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

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

MIME :: Mots de MIME-tools fonctionne également très bien pour cela. J'ai rencontré un problème avec Encode et découvert que MIME :: Words a réussi sur certaines chaînes alors qu'Encode ne le faisait pas.

use MIME::Words qw(:all);
$decoded = decode_mimewords(
    'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
);

Il s'agit d'une extension standard pour l'étiquetage de jeux de caractères des en-têtes, spécifiée dans RFC2047 .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top