PHP получает размер файла вложений imap


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

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

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

Спасибо

Author: MrCode, 2011-12-20

2 answers

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

.
 3
Author: pauljm, 2012-08-12 23:41:25

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

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

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

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

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

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

 2
Author: nxasdf, 2015-02-13 21:10:00