2011-12-20 3 views
2

Я читаю электронную почту imap с помощью PHP и загружает вложения, используя основные функции PHP imap. Я также подключаюсь через протокол imap (не POP). Я хотел бы иметь возможность знать файлы вложений, прежде чем загружать их в память, чтобы уменьшить использование ресурсов сервера.PHP получить файлы из imap вложений

Например, я хочу ограничение в 5 Мб на приложение, таким образом я могу отбросить любые вложения, которые превышают лимит, прежде чем они будут потреблять ресурсы сервера. Поиск размера электронной почты может помочь, но проблема в том, что я хочу ограничение на вложение, а не по электронной почте.

imap_fetchbody() загружает вложение, которое все работает. Я мог бы, вероятно, прочитать размер результата этой функции, но это означало бы сначала загрузку вложения в память.

Благодаря

ответ

3

Я понимаю, что это старая запись, но в случае, если это помогает, разница в размерах из-за вложений, находящихся в кодировке base64, что приводит к расширению данных в примерно 33%. От RFC3501: «[Размер тела] Число, указывающее размер тела в октетах. Обратите внимание, что этот размер является размером в его кодировке передачи, а не результирующим размером после любого декодирования».

2

Этот вопрос чуть более 3 лет без реального ответа, я удивлен.

Загрузка структуры электронной почты с использованием imap_fetchstructure(); покажет всю информацию, необходимую для выполнения этой задачи. Предположим, вы знаете, как получить конкретный адрес электронной почты, который хотите проверить, перед использованием imap_fetchstructure();.

В любом случае, функция вернет список «частей». Эти части имеют спецификацию IMAP4. Результаты приведены в массиве, и один из индексов массива называется bytes, который указывает количество байтов для этой части. Существует еще один индекс, называемый encoding, который указывает метод кодирования для этой части.

Как ответил Пол, кодировка Base64, как правило, на 33% больше исходного размера, которая должна быть достаточно хорошей, чтобы определить исходную длину данных вложения.

Я считаю, что вы можете избежать хлопот загрузки данных в память, записав данные непосредственно в дескриптор файла с помощью функции imap_savebody();. Вы можете преодолеть проблему кодирования, добавив фильтр потока к этому файловому дескриптору до вызова imap_savebody();. Это достигается с помощью функции stream_filter_append();.

Я могу отредактировать свой ответ и добавить рабочий PHP-код, когда у меня больше времени.

+0

Отличная благодарность полезная, да вся информация вам нужна в части частей конструкции. Для меня это был StdClass, но может быть конкретным. Другой ответ не отвечает на вопрос. – Andrew

 Смежные вопросы

  • Нет связанных вопросов^_^