Dekodieren einen UTF8 E-Mail-Header
Frage
Ich habe einen E-Mail-Betreff der Form:
=?utf-8?B?T3.....?=
Der Körper der E-Mail ist utf-8 Base64 codiert - und decodiert in Ordnung. Ich aktuelle Perl E-Mail :: MIME-Modul der E-Mail zu entschlüsseln.
Was ist die Bedeutung des = utf-8-Begrenzer und wie kann ich extrahieren Informationen aus dieser Zeichenfolge?
Lösung
Die encoded-word
Token (per RFC 2047 ) in Werte einiger Header auftreten können. Sie analysiert werden, wie folgt:
=?<charset>?<encoding>?<data>?=
Charset UTF-8 ist in diesem Fall die Codierung B
ist, was bedeutet, Base64 (Die andere Option ist, die Druckmittel Q
Zitiert).
Um es zu lesen, zuerst die Base64 dekodieren, dann behandeln sie als UTF-8-Zeichen.
Lesen Sie auch die verschiedenen RFCs Internet Mail für weitere Informationen, vor allem RFC 2047 .
Da Sie Perl verwenden, Encode :: MIME :: Kopf könnte von nutzen sein:
SYNTAX
use Encode qw/encode decode/; $utf8 = decode('MIME-Header', $header); $header = encode('MIME-Header', $utf8);
ABSTRACT
Dieses Modul implementiert RFC 2047 Mime Header-Codierung. Es gibt 3-Variante Codierungsnamen; MIME-Header-, MIME-B und MIME-Q. Der Unterschied ist unter
beschriebendecode() 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?....?=
Andere Tipps
Ich denke, dass der Encode-Modul behandelt, dass mit der MIME-Header
Codierung, dies so versuchen:
use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);
Schauen Sie sich RFC2047 . Die ‚B‘ bedeutet, dass der Teil zwischen den letzten zwei ‚?‘ S ist Base64-kodiert. Die ‚UTF-8‘ natürlich bedeutet, dass die decodierten Daten sollten als UTF-8 interpretiert werden.
MIME :: Wörter von MIME-Tools arbeiten zu gut für diese. Ich lief in einige Probleme mit Encode und fand MIME :: Wörter auf einigen Streichern gelang es dem Encode nicht.
use MIME::Words qw(:all);
$decoded = decode_mimewords(
'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
);
Dies ist eine Standard-Erweiterung für charset Kennzeichnung von Headern, angegeben in RFC2047 .