我正在寻找一种方法来解析多部分/替代电子邮件的正文部分。我目前有一个使用Email :: Mime模块的perl脚本,它正确解析text / plain和text / html。虽然我遇到的问题是,当我解析多部分/替代电子邮件时,$ part->正文总是返回空。我尝试过使用$ part-> body_raw,虽然它包含了我需要省略的标题,但它确实返回了文本正文。
--_000_47C8E15E8EEDCB4E94E891F9414C019A0CB5BDEE79DFW1MBX07mex0_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
Text Body
Text Body
PERL代码
my ( $body, $text_body, $html_body, $multi_body );
for my $part (@parts) {
if ( $part->content_type =~ m!text/html! ) {
my $hs = HTML::Strip->new( emit_spaces => 0 );
$html_body .= $hs->parse( $part->body );
print "Found HTML\n";
}
elsif ($part->content_type =~ m!text/plain!
or $part->content_type eq '' )
{
$text_body .= $part->body;
print "Found TEXT\n";
}
elsif ($part->content_type =~ m!multipart/alternative!
or $part->content_type eq '' )
{
print "Found Multipart\n";
$multi_body .= $part->body;
}
来源
Content-Type: multipart/related;
boundary="_004_47C8E15E8EEDCB4E94E891F9414C019A0CB5BDEE79DFW1MBX07mex0_";
type="multipart/alternative"
MIME-Version: 1.0
--_004_47C8E15E8EEDCB4E94E891F9414C019A0CB5BDEE79DFW1MBX07mex0_
Content-Type: multipart/alternative;
boundary="_000_47C8E15E8EEDCB4E94E891F9414C019A0CB5BDEE79DFW1MBX07mex0_"
--_000_47C8E15E8EEDCB4E94E891F9414C019A0CB5BDEE79DFW1MBX07mex0_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
Test Body
答案 0 :(得分:5)
Multiparts包含多个部分。迭代他们:
use strict;
use warnings;
use Email::MIME;
use Data::Printer;
use feature qw/say/;
my $source = <<EOF;
Content-Type: multipart/related;
boundary="_004_47C8E15E8EEDCB4E94E891F9414C019A0CB5BDEE79DFW1MBX07mex0_";
type="multipart/alternative"
MIME-Version: 1.0
--_004_47C8E15E8EEDCB4E94E891F9414C019A0CB5BDEE79DFW1MBX07mex0_
Content-Type: multipart/alternative;
boundary="_000_47C8E15E8EEDCB4E94E891F9414C019A0CB5BDEE79DFW1MBX07mex0_"
--_000_47C8E15E8EEDCB4E94E891F9414C019A0CB5BDEE79DFW1MBX07mex0_
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: quoted-printable
Test Body
EOF
my $msg = Email::MIME->new($source);
for my $part ($msg->parts) {
if ($part->content_type =~ m!multipart/alternative!
or $part->content_type eq '' )
{
say "Found Multipart";
for my $subpart ($part->parts) {
say $subpart->body;
}
}
}
输出:
C:\>perl test_mime.pl
Found Multipart
Test Body
答案 1 :(得分:0)
你需要递减一级。 alternative
部分的“正文”是您需要检索和解析的text/plain
部分。
一般情况下,您不能假设任何特定结构,只有multipart
由一个或多个单独部分组成(它们本身可以multiparts
递归地传递。),这通常是您想要遍历的。
虽然multipart/alternative
非常明确地说明您需要选择其中一个成员部分(可能由您的平台功能和/或用户的偏好引导),但偶尔会multipart/mixed
或{{1}用于同样的目的。