Проблема с закодированным в Perl / MIME текстом - PullRequest
0 голосов
/ 26 октября 2010

У меня есть сообщения в кодировке MIME (в Maildir), в которых есть оба заголовка в кодировке base64 (решено с помощью скрытого вопроса ( Декодировать заголовок письма UTF8 ), декодировать ('MIME-заголовок', $ val), основной текст в виде простого текста и данные в текстовом / обычном формате base64 в теле;

Говорят, что данные base64 кодируются в utf-8. Однако, когда я делаю:

use MIME::Base4;
..
$decoded = decode_base64($block_from_line_array); # MIME body extracted from message's
$msgtext .= $decoded;
..
print decode('utf-8', $msgtext);

Кажется, что блок декодирован неправильно.

print decode('utf-8', $msgtext); works ok, when message body is in utf-8

Attach:

X-Priority: 3
X-Mailer: PHPMailer (phpmailer.sourceforge.net) [version 2.0.4]
X-Mailer: http://www.we.praise.buggy.php.scripts.what.we.do.when.we.dont.do.us
X-MessageID: 140
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="b1_16819d4d69564bfc0185ed5b9508ad31"

<Here the body begins -- mhambra>
--b1_16819d4d69564bfc0185ed5b9508ad31
Content-Type: text/plain; charset = "utf-8"
Content-Transfer-Encoding: base64
<MIME BLOCK>

Известно, что сообщение правильно отображается в GMail.

Ответы [ 3 ]

1 голос
/ 13 сентября 2016

FWIW Email :: MIME показался мне хрупким в некоторых примерах электронных писем, которые я тестировал.Email :: Parser работал лучше для меня, пытаясь извлечь сегменты текста / html или text / plain, которые могли бы быть в base64 (и обычно имели кодирование передачи base64 / utf-8

use MIME::Parser;
use MIME::Base64;

sub flatten_parts {
    my ($mimePart, $fh) = @_;
    $fh or $fh = select;
    my $part;
    no strict 'refs';
    if($mimePart->mime_type =~ /text\/(plain|html)/i){
        my $base64=join('',@{$mimePart->body}); # This will be the base64 we're after.
        my $encoding = $mimePart->head->mime_encoding;
        if($encoding eq 'base64'){
                my $plainContent=MIME::Base64::decode_base64($base64);
                print $plainContent;
        }
    }   
    ### walk the parts:
    my @parts = $mimePart->parts;
    foreach $part (@parts) {
        flatten_parts($part, $fh);
    }
}
### Create a new parser object:
our $parser = new MIME::Parser;
### Parse an input filehandle:
$entity = $parser->parse(\*STDIN);
flatten_parts($entity);
0 голосов
/ 06 февраля 2017

К сожалению, если вам случится написать греческую лямбду в отформатированном письме UTF8, MIME::Parser barfs, и, кажется, нет никакого известного обходного пути - даже редактирование всех файлов *.pm, добавление use utf8; и т.д.

Попробуйте открыть новое сообщение в Thunderbird, прикрепите несколько файлов, напишите этот символ юникода в теле и сохраните его как .eml файл. MIME::Parser выдаст ошибку.

См. Также Ошибка CPAN # 105377 .

0 голосов
/ 02 ноября 2010

Используйте такой модуль, как Email :: MIME , чтобы выполнить тяжелую работу.

use strict;
use warnings;
use Email::MIME;

my $msg = Email::MIME->new($message_text);
print $msg->body;
...