【问题标题】:Perl: sending zip as base64-encoded attachment corrupts archivePerl:将 zip 作为 base64 编码的附件发送会损坏存档
【发布时间】:2011-05-17 10:02:12
【问题描述】:

我正在使用 perl 组合一个多部分 MIME 电子邮件,然后在 Windows 环境中使用 sendmail 发送该电子邮件。不理想,我知道。

其中一部分是收集文件,将它们压缩,然后将压缩文件编码为 Base64 并将其作为附件写入电子邮件。我的问题是,每当我发送超过一定大小的文件(我不确切知道那是什么大小;介于 20 KB 和 2 MB 之间)时,zip 文件最终会在收到时损坏。 (在 WinRAR 中打开时,它会提示“存档意外结束”,并且 CRC 值都是零值,如果有任何线索的话)。

我怀疑我可能只是将其写入电子邮件的方式是让垃圾或重复进入,但我看不到它发生在哪里。这是我用来读取/编码/写入的 sn-p;它使用 MIME::Base64,显然有一个开放的 Sendmail 句柄。

    open(FILE, "c:\\temp\\$uid.zip") or die "$!";
    while (read(FILE, $buffer, 60*57)) 
    {
        printf SENDMAIL encode_base64($buffer);
    }  

即使我在没有任何缓冲的情况下读入它(我当然应该有足够的内存来存储一个微不足道的 2mb 文件),我最终仍然会收到一个损坏的 zip 文件。尺寸绝对是令人困惑的因素,但我正在努力弄清楚为什么或如何解决它。

【问题讨论】:

    标签: perl zip sendmail


    【解决方案1】:

    我认为在 Windows 上您需要 binmode 您的文件

    open(FILE, "c:\\temp\\$uid.zip") or die "$!";
    binmode FILE;
    while (read(FILE, $buffer, 60*57)) 
    {
        printf SENDMAIL encode_base64($buffer);
    }  
    

    另外,使用MIME::Lite 发送电子邮件。

    【讨论】:

    • 呃。我真的应该自己发现那个。谢谢。
    • 别担心,用另一双眼睛看东西总是有用的。 MIME::Lite Rock 顺便说一句
    • Email::MIME/Email::Sender 更好:stackoverflow.com/questions/2919493/…
    • @daxim 维护者在哪里说 MIME::Lite 的坏话?另请参阅 cpan 评论:cpanratings.perl.org/dist/MIME-Lite
    • @daxim 哦,您刚刚删除了您声称 MIME::Lite 维护者建议不要使用它的部分。为你感到羞耻:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2013-10-03
    • 1970-01-01
    • 2017-08-13
    相关资源
    最近更新 更多