【问题标题】:Perl parsing multipart/alternative emailsPerl 解析多部分/替代电子邮件
【发布时间】:2014-06-21 16:59:05
【问题描述】:

我正在寻找一种方法来解析多部分/替代电子邮件的正文部分。我目前有一个使用 Email::Mime 模块的 perl 脚本,它可以正确解析 text/plain 和 text/html。虽然我遇到的问题是,当我解析多部分/替代电子邮件时,$part->body 总是返回空。我尝试过使用 $part->body_raw 并且它确实返回了文本正文,尽管它包含我需要省略的标题。

使用 $part->data_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

【问题讨论】:

  • body_str (metacpan.org/pod/Email::MIME#body_str) 是做什么的?您能否发布您正在使用的代码和消息源,以便其他人可以复制您的结果?
  • 这是代码,我试过 body_str 并返回 -----> can't get body as a string for multipart/alternative; /Library/Perl/5.16/Email/MIME.pm 第 341 行, 第 1 行的边界 =“000_47C8E15E8EEDCB4E94E891F9414C019A0CB5BDEE79DFW1MBX07mex0”。

标签: perl email mime


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您需要向下递归一级。 alternative 部分的“正文”是您需要检索和解析的text/plain 部分。

    您通常不能假设任何特定的结构,只能假设 multipart 包含一个或多个单独的部分(它们本身可能是 multiparts 递归广告 inf.),通常您会想要遍历这些部分。

    虽然multipart/alternative 非常清楚地记录了您应该选择其中一个成员部分(可能取决于您的平台功能和/或您的用户偏好),但偶尔multipart/mixedmultipart/related 也会用于相同的部分目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-08
      • 2014-01-23
      • 2016-10-05
      • 2019-10-21
      • 1970-01-01
      • 2011-09-24
      • 2014-09-27
      相关资源
      最近更新 更多