Расшифруйте заголовок письма UTF8 - PullRequest
23 голосов
/ 24 сентября 2008

У меня есть тема электронной почты в форме:

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

Тело письма имеет кодировку utf-8 base64 - и отлично расшифровано. В настоящее время я использую модуль Perl Email :: MIME для декодирования электронной почты.

Что означает разделитель =? Utf-8 и как мне извлечь информацию из этой строки?

Ответы [ 5 ]

35 голосов
/ 24 сентября 2008

Токены encoded-word (согласно RFC 2047 ) могут встречаться в значениях некоторых заголовков. Они анализируются следующим образом:

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

В этом случае кодировка - это UTF-8, кодировка - B, что означает base64 (другой параметр - Q, что означает Quoted Printable).

Чтобы прочитать его, сначала декодируйте base64, а затем обрабатывайте его как символы UTF-8.

Также ознакомьтесь с различными документами RFC по Интернет-почте для получения более подробной информации, в основном RFC 2047 .

Поскольку вы используете Perl, Encode :: MIME :: Header может быть полезен:

1024 * СИНТАКСИС *

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

РЕЗЮМЕ

Этот модуль реализует Mime RFC 2047 Кодировка заголовка. Есть 3 варианта кодирование имен; MIME-заголовок, MIME-B и MIME-Q. Разница в том, описано ниже

              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?....?=
17 голосов
/ 24 сентября 2008

Я думаю, что модуль Encode справляется с этим с кодировкой MIME-Header, поэтому попробуйте это:

use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);
3 голосов
/ 24 сентября 2008

Выезд RFC2047 . «B» означает, что часть между двумя последними символами? Кодируется в base64. UTF-8 естественно означает, что декодированные данные должны интерпретироваться как UTF-8.

2 голосов
/ 21 февраля 2014

MIME :: Words из MIME-tools тоже хорошо работают для этого. Я столкнулся с некоторой проблемой с Encode и обнаружил, что MIME :: Words преуспел в некоторых строках, где Encode не было.

use MIME::Words qw(:all);
$decoded = decode_mimewords(
    'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
);
1 голос
/ 24 сентября 2008

Это стандартное расширение для маркировки заголовков в кодировке, указанное в RFC2047 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...