Perl 解析 Outlook 收件箱中的电子邮件和附件

Posted

技术标签:

【中文标题】Perl 解析 Outlook 收件箱中的电子邮件和附件【英文标题】:Perl parse email and attachments from Outlook inbox 【发布时间】:2015-10-03 16:45:05 【问题描述】:

我正在使用Mail::IMAPClient 连接到我们的 Outlook 邮件服务器。我可以很好地收到邮件并将该邮件的文本版本打印到文件中。但我无法使用MIME::Parser 解析电子邮件。

我已尝试为解析器提供一个文件句柄,该句柄指向我写电子邮件的文本文件。我试过只给解析器电子邮件的文本,但它不会像我期望的那样工作。实体部分始终等于 0。

当我转储实体骨架时,我得到

  Content-type: text/plain
  Effective-type: text/plain
  Body-file: NONE
  --

我可以看到文件中电子邮件的所有部分。附加的两个 PDF 文件都在那里,以 base64 编码,所以我知道脚本实际上是在检索电子邮件和附件。我也试过parseparse_data

my $msgCount = 0;    
$msgCount = $imap->message_count();    
#or abortMission("", "Could not get message count: ". $imap->LastError );

if ( $msgCount > 0 )      

    #get all the messages from the inbox folder    
    my @msgseqnos = $imap->messages
            or abortMission("", "Could not retreive messages:". $imap->LastError);

    my ($x, $bh, $attachment, $attachmentName);

    foreach my $seqno ( @msgseqnos ) 

        my $input_file;
        my $parser = new MIME::Parser;
        my $emailText = $imap->body_string($seqno)   # should be the entire email as text. 
                or abortMission("", "Could not get message string: " . $imap->LastError);

        $parser->ignore_errors(1);
        $parser->output_to_core(1);

        open my $emailFileHandle, ">", "invoiceText.txt";
        print $emailFileHandle $emailText;
        #$imap->message_to_file($emailFileHandle, $seqno);

        my $entity = $parser->parse_data($emailText);
        $entity->dump_skeleton;

        if ( $entity->parts > 0 ) 

            for ( my $i = 0; $i < $entity->parts; $i++ ) 

                my $subentity = $entity->parts($i);

                # grab attachment name and contents
                foreach $x ( @attypes ) 

                    if ( $subentity->mime_type =~ m/$x/i ) 

                        $bh = $subentity->bodyhandle;
                        $attachment = $bh->as_string;
                        $attachmentName = $subentity->head->mime_attr('content-disposition.filename');

                        open FH, ">$attachmentName";
                        print FH $attachment;
                        close FH;

                        #push @attachment, $attachment;
                        #push @attname, $subentity->head->mime_attr('content-disposition.filename');
                    
                
            
        
        else 
            stillAGo("eData VehicleInvoices problem", "Perl can't find an attachment in an email in the VehicleInvoices folder of eData email address");
        

        close $emailFileHandle;

        # say $emailText;
        # next;

        #open OUT_FILE, ">invoiceText.txt";
        #print OUT_FILE $emailText;
        #print OUT_FILE $imap->bodypart_string($seqno,1);
        #close OUT_FILE;

        #print $emailText;
    

我正在尝试自动从电子邮件中检索附件并将它们保存到磁盘以供其他作业处理。

我想包含 invoiceText.txt 文件,以便人们可以看到实际输出,但它有 1200 行长。我不确定在哪里上传要链接的文件。

【问题讨论】:

【参考方案1】:

body_string 方法不会返回整个电子邮件。正如文档描述和名称所暗示的那样,它返回消息的 body,不包括标头。这就是为什么dump_skeleton 除了默认值之外没有显示任何标题

您可能想要的是message_string,虽然我还没有尝试过,但它确实会返回整个电子邮件

我看到您使用了message_to_file,但已将其注释掉。如果你让MIME::Parse 从文件中读取,那可能会起作用

【讨论】:

我尝试使用 message_to_file 然后将文件句柄交给解析器,但这似乎不起作用。我可能错误地使用了解析器。使用 message_string 和 parser->parse_data 正在工作。感谢您的帮助。 不客气。不起作用的原因可能是因为您没有关闭 $emailFileHandle 以将数据刷新到磁盘(或者您可以 flush $emailFileHandle 但没有什么意义)。您当前的代码有同样的错误,但您没有使用该文件。但是无论如何您都不需要将信息保存到磁盘-您可以写$parser-&gt;parse_data($imap-&gt;message_string($seqno)) 哦,你也可以$imap-&gt;message_to_file('invoiceText.txt'),然后$parser-&gt;parse_open('invoiceText.txt'),效果一样

以上是关于Perl 解析 Outlook 收件箱中的电子邮件和附件的主要内容,如果未能解决你的问题,请参考以下文章

获取收件人的电子邮件地址(Outlook)

让 VBA 循环遍历 Outlook 中的所有收件箱,包括共享收件箱

将Outlook邮件从一个邮箱收件箱移动到同一邮箱中的不同文件夹

Outlook Express收件箱怎样增加“收件人”栏

收件箱中的Outlook日历事件视图

在 Access 中创建 Outlook 收件箱电子邮件表