我可以解析保存为文本文件的电子邮件并使用Perl检索/保存其附件吗?

时间:2010-11-29 17:02:49

标签: perl parsing imap email-attachments

我正在使用Perl& MAIL::IMAPClient使用IMAPClient方法将来自Gmail的电子邮件保存为.txt个文件:

message_to_file

这些文件似乎包含以文本形式编码的电子邮件附件。

以下是一些文本文件:

--0015174c1274ee7ca60495ca69d5
Content-Type: video/3gpp; name="20101112233055.3gp"
Content-Disposition: attachment; filename="20101112233055.3gp"
Content-Transfer-Encoding: base64
X-Attachment-Id: 1353288501407252480-1

AAAAHGZ0eXAzZ3A0AAADADNncDRtcDQxM2dwNgAFHyltZGF0AAABthAwrMK9/Mue7fM+95wsf9P8
WI7mPzzp/ikijbucv72j7OywVGuh5kBzo89Zra6PihxZg0zadDqihZFpsPJeG36Ihk9qZW+LLQ2u
NEd96vsqgpnLFnhhwGBWgL2Xpt0cXkW....[A LOT MORE CHARS]....AAAQAAAALAAAAAQAAABRzdHN6
AAAAAAAAACAAAAChAAAAIHN0Y28AAAAAAAAABAABHNoAASMaAALYFwAFHeU=
--0015174c1274ee7ca60495ca69d5--

我找不到任何单独保存附件的方法。有没有办法通过解析来做到这一点?

2 个答案:

答案 0 :(得分:2)

您所拥有的是MIME编码的电子邮件的原始文本。大多数语言都有一个通用的MIME库来解析这些。快速搜索CPAN可以发现这一点 MIME::Parser可能会做到这一点:

use MIME::Parser;

open(FH, '/var/tmp/test.txt');
my $parser = new MIME::Parser;
my $entity = $parser->parse(\*FH) or die;

$entity->dump_skeleton;

这会将存储在纯文本文件test.txt中的电子邮件的各个部分转储到/ var / tmp。查看MIME :: Parser文档以获取更多选项。

答案 1 :(得分:1)

这是一种解决方法的建议。在经过标题后,您将使用此逻辑。

use MIME::Base64;

my $attachlines = '';
while ( <$input> ) { 
    last if index( $_, '--0015174c1274ee7ca60495ca69d5--' ) == 0;
    $attachlines .= $_;
}

my $attach = MIME::Base64::decode( $attachlines );

注意:我理所当然地知道MIME多部分表单是如何工作的,所以我不讨论如何以编程方式获取分隔符'--0015174c1274ee7ca60495ca69d5--'