Perl:发送base64编码的zip附件会损坏压缩文件

3
我正在使用perl组装一个multipart-MIME邮件,并在Windows环境下使用sendmail发送。 我知道这不是最理想的选择。
其中一部分是收集文件,将它们压缩成zip文件,然后将该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个回答

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


嗯,我真的应该自己发现那个问题。谢谢。 - R Hill
别担心,让另一双眼睛审查总是很有用的。顺便说一下,MIME::Lite非常棒。 - Raoul
@daxim,维护者在哪里说了MIME::Lite的坏话?另请参阅CPAN评论:http://cpanratings.perl.org/dist/MIME-Lite - Raoul
@daxim 哦,你刚刚删除了声称 MIME::Lite 维护者建议不要使用它的部分。真可惜 :P - Raoul
抱歉,时间冲突了。我太晚才注意到我不能支持我的主张。 - daxim
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接