如何从电子邮件附件中提取压缩的xls文件?

时间:2015-04-21 07:27:45

标签: excel perl email zip email-attachments

我有一个模块应该提取电子邮件附件并将其放在特定位置。代码创建POP3客户端以获取邮件,并使用 EMAIL :: MIME :: Attachment :: Stripper 模块提取附件,如下所示。

     my $mail=$pop->HeadAndBody($i);
     my $parsed = Email::MIME->new($mail);
     my $stripper = Email::MIME::Attachment::Stripper->new($parsed);
     my @attachments = $stripper->attachments;

     foreach my $a(@attachments)
     {
        next if $a->{content_type} !~ /octet-stream/i;
        my $f = new IO::File "C:/MAIL_PARSING_DATA/" . "<filename>.<file-extension>", "w" or die "Can not create file!";
        print $f $a->{payload};
        goto EXITPOINT;
     }

代码适用于Perl模块标识的标准文件,如电子表格等。但不适用于具有压缩的Excel文件作为附件的特定邮件。在提取文件时,此文件的Perl脚本标识的 content_type application / octet-stream 。在使用上述代码提取文件时,文件似乎被破坏了,因为:

  1. 该文件未通过WinZip,WinRAR或7-Zip打开。
  2. 通过此脚本提取的文件的文件大小与使用Outlook提取的文件略有不同。
  3. 请就此问题提供一些意见。

3 个答案:

答案 0 :(得分:0)

问题出在这里

next if $a->{content_type} !~ /octet-stream/i;

zip的内容类型为application / zip

答案 1 :(得分:0)

@NeoNox,感谢您的回复。但是perl系统只将文件标识为八位字节流,而不是应用程序/ zip。

无论如何,我可以找到解决方案。

我可以通过以二进制模式编写文件来解决问题(明确提到如下:

    binmode $fh;

此处文件正在以二进制模式写入所以我不会将输出作为损坏的文件。

答案 2 :(得分:0)

我发现了同样的问题。

XLSX文件不被视为附件。 我正在使用IMAP。

它会下载电子邮件正文,任何jpgs或png等,但即使在包含已下载附件的电子邮件中也找不到附加的xlsx。