Perl парсинг многочастной / смешанной электронной почты - PullRequest
0 голосов
/ 15 мая 2019

Я пытаюсь разобрать составное / смешанное письмо с Email :: MIME.У меня он работает для многих типов, но я не могу понять, почему он не может правильно определить этот тип.

У меня есть скрипт, который успешно работает со многими типами электронных писем, но этот конкретный тип не работает,Он завершается с ошибкой «не могу получить тело как строку для multipart / mixed;»

Основная часть реального содержимого, которое мне нужно, находится в текстовой / простой части, но, похоже, задыхается от multipart /смешанная часть до этого.

Поскольку мне также хотелось бы, чтобы скрипт мог обрабатывать электронные письма с различной кодировкой, мне также хотелось бы иметь if / else, который пытается декодировать все различные типы, ибыть в состоянии идентифицировать наиболее значимую часть каждого электронного письма.

Я считаю, что у меня есть это право заказа, но все равно не удается декодировать текстовую / обычную часть, которая появляется перед составной / смешанной частью.

my @mailData;
my $msg = Email::MIME->new($buf);

 $msg->walk_parts(sub {
     my ($part) = @_;
     warn($part->content_type . ": " . $part->subparts);
     if (($part->content_type =~ /text\/plain$/i) && !@mailData) {
        #print $part->body;
        @mailData = split( '\n', $part->body_str);
     }
     elsif (($part->content_type =~ m/multipart\/mixed\;/i) && !@mailData) {
        print $part->body;
        @mailData = split( '\n', $part->body_str);
     }
     elsif (($part->content_type =~ /text\/plain; charset=\"?utf-8\"?/i) && !@mailData) {
        #print $part->body;
        @mailData = split( '\n', $part->body_str);
     }
     elsif (($part->content_type =~ /text\/plain; charset=\"?us-ascii\"?/i) && !@mailData) {
        #print $part->body;
        @mailData = split( '\n', $part->body_str);
     }
     elsif (($part->content_type =~ /text\/plain; charset=\"?windows-1252\"?/i) && !@mailData) {
        #print $part->body;
        @mailData = split( '\n', $part->body_str);
     }
     elsif (($part->content_type =~ /text\/plain; charset=\"?iso-8859-1\"?/i) && !@mailData) {
        print $part->body;
        @mailData = split( '\n', $part->body_str);
     } else { print "failed: $subject\n"; exit 0; }
 });

Когда я передаю ему полное электронное письмо, оно печатает:

        Email::MIME::body_str(Email::MIME=HASH(0x55dccceb9510)) called at alert11a.pl line 157
        main::__ANON__(Email::MIME=HASH(0x55dccceb9510)) called at /usr/share/perl5/vendor_perl/Email/MIME.pm line 845
        Email::MIME::__ANON__(Email::MIME=HASH(0x55dccceb9510)) called at /usr/share/perl5/vendor_perl/Email/MIME.pm line 875
        Email::MIME::walk_parts(Email::MIME=HASH(0x55dccceb9510), CODE(0x55dcccf101a0)) called at alert11a.pl line 175
multipart/signed; micalg=pgp-sha512; protocol="application/pgp-signature"; boundary="n1iI6MeELQa9IOaF"text/plain; charset="utf-8"

Я также попробовал несколько способов распечатать все части письма, но "warn ($ part->content_type. ":". $ part-> subparts); "кажется, задыхается от этого.

Вот они, как я вижу их визуально:

Content-Type: multipart/mixed; boundary="===============0130613217382308956=="

--===============0130613217382308956==
Content-Type: multipart/signed; micalg=pgp-sha512;
        protocol="application/pgp-signature"; boundary="n1iI6MeELQa9IOaF"
Content-Disposition: inline


--n1iI6MeELQa9IOaF
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

--n1iI6MeELQa9IOaF
Content-Type: application/pgp-signature; name="signature.asc"

-----BEGIN PGP SIGNATURE-----

iQIzBAABCgAdFiEEpgY7tWAjCaQ8jrvULwmejQBegfQFAlzbUr0ACgkQLwmejQBe
gfQbvQ//RvytLvg0+M2YxHs7Pnw0etafzK7NcQ5mSH9V+WYNXCLCs9aOdYbS8JvA
...[trimmed]

--===============0130613217382308956==
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Disposition: inline

LS0gCnVidW50dS1zZWN1cml0eS1hbm5vdW5jZSBtYWlsaW5nIGxpc3QKdWJ1bnR1LXNlY3VyaXR5... [trimmed]

Я могу предоставить ссылку на целое письмо, если необходимо

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