Я пытаюсь разобрать составное / смешанное письмо с 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]
Я могу предоставить ссылку на целое письмо, если необходимо