Perl解析多部分/混合电子邮件

时间:2019-05-15 02:48:32

标签: perl email parsing

我正在尝试使用Email :: MIME解析多部分/混合的电子邮件。我可以将其用于许多类型,但是无法弄清楚为什么它不能正确检测到这种类型。

我有一个脚本可以成功处理多种类型的电子邮件,但是这种特定类型的电子邮件不起作用。它失败并显示为“无法将主体作为多部分/混合的字符串;”

我想要的大部分实际内容都在文本/纯文本部分中,但是在此之前,它似乎在多部分/混合部分上令人窒息。

由于我也希望脚本能够处理具有不同编码的电子邮件,所以我也想拥有一个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]

如有必要,我可以提供整个电子邮件的链接

0 个答案:

没有答案