Perl: отправка zip-файла в виде base64-вложения повреждает архив - PullRequest
3 голосов
/ 17 мая 2011

Я использую Perl для сборки электронной почты из нескольких частей MIME, которую затем отправляю с помощью sendmail в среде Windows. Не знаю, я знаю.

Часть этого - сбор файлов, архивирование их, затем кодирование zip-файла в формате Base64 и запись его в электронное письмо в виде вложения. Моя проблема заключается в том, что всякий раз, когда я отправляю файлы определенного размера (я точно не знаю, какой это размер; где-то между 20 КБ и 2 МБ), 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);
    }  

Даже когда я читаю его без какой-либо буферизации (у меня наверняка должно быть достаточно памяти для мизерного файла 2 МБ), я все равно получаю поврежденный zip-файл. Размер, безусловно, является мешающим фактором, но я изо всех сил пытаюсь понять, почему или как это исправить.

1 Ответ

4 голосов
/ 17 мая 2011

Я думаю, что в 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 для отправки писем.

...