Decodifica un'intestazione e-mail UTF8
Domanda
Ho un oggetto e-mail nel modulo:
=?utf-8?B?T3.....?=
Il corpo dell'email è codificato in utf-8 base64 - e ha decodificato bene. Attualmente sto usando il modulo Email :: MIME di Perl per decodificare l'e-mail.
Qual è il significato del delimitatore =? utf-8 e come estraggo le informazioni da questa stringa?
Soluzione
I parola codificata
token (as per RFC 2047 ) può verificarsi nei valori di alcune intestazioni. Vengono analizzati come segue:
=?<charset>?<encoding>?<data>?=
Charset è UTF-8 in questo caso, la codifica è B
che significa base64 (l'altra opzione è Q
che significa stampabile tra virgolette).
Per leggerlo, prima decodifica il base64, quindi trattalo come caratteri UTF-8.
Leggi anche i vari RFC di posta Internet per maggiori dettagli, principalmente RFC 2047 .
Dato che stai usando Perl, Encode :: MIME :: Header potrebbe essere utile:
SINOSSI
use Encode qw/encode decode/; $utf8 = decode('MIME-Header', $header); $header = encode('MIME-Header', $utf8);
SOMMARIO
Questo modulo implementa RFC 2047 Mime Codifica intestazione. Ci sono 3 varianti codifica dei nomi; Intestazione MIME, MIME-B e MIME-Q. La differenza è descritto di seguito
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?....?=
Altri suggerimenti
Penso che il modulo Encode lo gestisca con la codifica MIME-Header
, quindi prova questo:
use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);
Scopri RFC2047 . La "B" indica che la parte tra gli ultimi due "?" È codificata in base64. "Utf-8" significa naturalmente che i dati decodificati devono essere interpretati come UTF-8.
MIME :: Words degli strumenti MIME funzionano bene anche per questo. Ho riscontrato un problema con Encode e ho trovato MIME :: Words è riuscito su alcune stringhe in cui Encode no.
use MIME::Words qw(:all);
$decoded = decode_mimewords(
'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
);
Questa è un'estensione standard per l'etichettatura dei set di caratteri delle intestazioni, specificata in RFC2047 .