当前位置: 首页 > 知识库问答 >
问题:

Perl解析多部分/可选电子邮件

鱼阳伯
2023-03-14

我正在寻找一种方法来解析多部分/可选电子邮件的正文部分。目前,我有一个使用Email::Mime模块的perl脚本,它可以正确解析text/plain和text/html。尽管我的问题是,当我解析一个多部分/可选电子邮件时,$part-

--_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

共有2个答案

许展鹏
2023-03-14

您需要向下递归一级。可选部分的“主体”是需要检索和解析的文本/普通部分。

一般来说,您不能假设任何特定的结构,只是Multipart由一个或多个单独的部分组成(它们本身可能是Multipart递归广告。),通常您需要遍历这些部分。

虽然多部分/替代非常清楚地表明您需要选择其中一个成员部分(可能是由您的平台的功能和/或您的用户的首选项引导),但偶尔多部分/混合多部分/相关会用于相同的目的。

李经国
2023-03-14

多部件包含多个部件。反复浏览它们:

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
 类似资料:
  • 问题内容: 如何在多部分电子邮件中使用html标签。当我使用它时,不能将其识别为粗体标签。 问题答案: 嗯,您正在使用Java。 请注意,我认为您应该始终在HTML电子邮件中设置纯文本替代项。 此代码还允许您内嵌图像(通过HTML从引用,但并非所有电子邮件客户端都支持此功能。

  • 我有一个perl脚本,使用MIME::E邮件来解析从stdin收到的电子邮件,但它不适用于没有部件的电子邮件。我没有能力在电子邮件发送前修改它们。 我希望能够识别电子邮件的重要部分,不管它是超文本标记语言还是文本,并将其存储在缓冲区中以便以后处理。这些电子邮件中的许多来自自动生成的邮件列表。 有时,它们似乎只有一个“内容类型”:没有边界的标题。 其他时候,它们有多个文本/普通部分,其中一个是电子邮

  • 问题内容: 前一段时间,我写了Python程序来处理电子邮件,经常遇到的一件事就是知道电子邮件是否是“多部分的”。 经过一番研究,我知道它与包含HTML或附件等的电子邮件有关…但是我并不太了解。 我对它的使用仅限于2个实例: 1.当我不得不从原始电子邮件中保存附件时 我刚刚在互联网上找到了它(可能是在这里-抱歉,您没有记下编写它的人,但是我似乎再也找不到他了:/),并将其粘贴到我的代码中 2.当我

  • 问题内容: 是否有人熟悉Java库,该库有助于解析以下电子邮件的字段(日期,主题,从,到)? 问题答案: JavaMail是一个Oracle库,它在javax.mail软件包中提供邮件服务和与邮件相关的服务(例如解析常规邮件和MIME邮件)。另外,Apache有一个用于处理邮件的Commons Email 库。 在JavaMail API中,解析包含电子邮件消息的字符串(可能是或可能不是明确的MI

  • 问题内容: 我正在编写一个Python脚本来处理Procmail返回的电子邮件。如该问题中所建议,我正在使用以下Procmail配置: 我的process_mail.py脚本正在通过stdin接收电子邮件,如下所示: 我正在尝试以这种方式解析消息: 我想获取诸如“发件人”,“收件人”和“主题”之类的消息字段。但是,消息对象不包含任何这些字段。 我究竟做错了什么? 问题答案: 您必须确保这些行不会意

  • 我已经尝试了整整一周使用antlr构建一个语法,允许我解析电子邮件消息。 我的目标不是将整个电子邮件彻底解析为令牌,而是将其分解为相关部分。 这是我必须处理的文档格式。描述不属于消息一部分的内联注释: 我面临的问题如下: 我没有想出一个好方法来跳过消息开头的文本,并在找到标记后才开始应用解析规则。截面类型1 捕获节开始和句子标记之间节内的所有文本 在SECTION\u结束标记之后,忽略后面的所有文