2011-05-17 76 views
3

我正在使用perl在Windows环境中组装一个multipart-MIME电子邮件,然后使用sendmail发送该电子邮件。我不明白,我知道。Perl:发送zip为base64编码的附件损坏存档

其中的一部分是收集文件,将其压缩,然后将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文件。大小无疑是混杂因素,但我很难找出为什么或如何补救它。

回答

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用于发送电子邮件。

+0

D'呃。我真的应该自己发现那一个。谢谢。 – 2011-05-17 10:24:35

+0

不用担心,让另一双眼睛看东西总是有用的。 MIME ::精简版岩石btw – Raoul 2011-05-17 10:28:52

+0

电子邮件:: MIME /电子邮件::发件人是更好的:http://stackoverflow.com/questions/2919493/which-package-from-cpan-should-i-use-to-send-mail/2919777#2919777 – daxim 2011-05-17 15:42:31