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

时间:2015-07-14 20:43:15

标签: perl email parsing mime

我使用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 个答案:

答案 0 :(得分:1)

body_string方法不会返回整个电子邮件。正如文档描述的那样,名称暗示,它返回消息的 body ,不包括标题。这就是dump_skeleton除了默认值

之外没有显示任何标题的原因

你可能想要的,虽然我还没有尝试过,但是message_string,其中 会返回整个电子邮件

我看到您使用了message_to_file,但对其进行了评论。如果你有MIME::Parse从文件

中读取,那可能会有用