代码之家  ›  专栏  ›  技术社区  ›  CheeseConQueso

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

  •  1
  • CheeseConQueso  · 技术社区  · 15 年前

    我使用的是Perl& MAIL::IMAPClient 将来自Gmail的电子邮件另存为 .txt 使用IMapClient方法的文件:

    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 回复  |  直到 15 年前
        1
  •  2
  •   Simon Whitaker    15 年前

    你得到的是一封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文档以了解更多选项。

        2
  •  1
  •   Axeman maxelost    15 年前

    这是一个解决方法的建议。当您通过报头之后,您将使用这个逻辑。

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

    注释 :我想当然地认为您知道mime多部分表单是如何工作的,所以我不讨论如何以编程方式获取分隔符。 '--0015174c1274ee7ca60495ca69d5--' .