PHP получить размер файла вложений imap - PullRequest
2 голосов
/ 20 декабря 2011

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

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

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

Спасибо

Ответы [ 2 ]

3 голосов
/ 14 февраля 2015

Этому вопросу чуть больше трех лет, и я не знаю, как на него ответить.

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

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

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

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

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

3 голосов
/ 13 августа 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...