2011-05-17 63 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