Décoder un en-tête de courrier électronique UTF8
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?
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 .