Perl:发送zip作为base64编码的附件会破坏存档

时间:2011-05-17 10:02:12

标签: perl zip sendmail

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

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

我怀疑我可能只是把它写进电子邮件中,这样我就让垃圾或复制,但我看不到它发生在哪里。这是我用来读取/编码/写入的片段;它使用MIME :: Base64,显然有一个打开的Sendmail句柄。

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

即使我在没有任何缓冲的情况下阅读它(我当然应该有足够的内存用于一个微不足道的2mb文件),我仍然收到一个损坏的zip文件。大小肯定是混淆因素,但我正在努力弄清楚为什么或如何补救它。

1 个答案:

答案 0 :(得分:4)

我认为在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发送电子邮件。