2008-09-24 11 views
22

Ich habe eine E-Mail Betreff der Form:Decode ein UTF-8 E-Mail-Header

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

Der Körper der E-Mail ist UTF-8-Base64-codiert - und decodiert Ordnung. Ich benutze derzeit Perls E-Mail :: MIME-Modul, um die E-Mail zu entschlüsseln.

Was bedeutet der Begrenzer =? Utf-8 und wie extrahiere ich Informationen aus dieser Zeichenkette?

Antwort

30

Die Token encoded-word (gemäß RFC 2047) können in den Werten einiger Header vorkommen. Sie werden wie folgt analysiert:

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

Charset UTF-8 ist in diesem Fall die Codierung B was bedeutet Base64 (Die andere Option ist, die Druckmittel Q Zitiert).

Um es zu lesen, dekodieren Sie zunächst die base64 und behandeln Sie sie dann als UTF-8-Zeichen.

Lesen Sie auch die verschiedenen Internet Mail RFCs für weitere Details, vor allem RFC 2047.

Da Sie Perl verwenden, Encode::MIME::Header von Nutzen sein könnte:

SYNTAX

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

ABSTRACT

Dieses Modul implementiert RFC 2047 Mime Header-Encoding. Es gibt 3 Varianten Kodierungsnamen; MIME-Header, MIME-B und MIME-Q. Die Differenz wird unten beschrieben

   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. Das 'B' bedeutet, dass der Teil zwischen den letzten zwei '?' S base64-codiert ist. Das 'utf-8' bedeutet natürlich, dass die dekodierten Daten als UTF-8 interpretiert werden sollten.

1

Dies ist eine Standarderweiterung für die Zeichensatzkennzeichnung von Headern, die in RFC2047 angegeben ist.

17

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); 
+1

Das war hilfreich, danke. Übrigens habe ich auch print encode ('utf-8', $ headers_decoded) verwendet, um decodierte Header korrekt anzuzeigen, wenn jemand anderes dies liest, während er ein Mail-Skript schreibt. –

2

MIME::Words von MIME-Tool für diesen gut zu funktionieren. Ich stieß auf ein Problem mit Encode und fand heraus, dass MIME :: Words auf einigen Strings erfolgreich war, wo Encode nicht funktionierte.

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