Я использую 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-файл. Размер, безусловно, является мешающим фактором, но я изо всех сил пытаюсь понять, почему или как это исправить.