Библиотека PHP IMAP для чтения и обработки электронной почты по протоколу IMAP, построенная на надежной объектно-ориентированной архитектуре.
Для этой библиотеки требуется PHP >= 8.3 с установленными расширениями IMAP, iconv и Multibyte String.
Рекомендуемый способ установки библиотеки IMAP — через Composer:
$композитору требуется ddeboer/imap
Для этой команды требуется, чтобы Composer был установлен глобально, как описано в главе об установке документации Composer.
используйте DdeboerImapServer;$server = new Server('imap.gmail.com');// $connection является экземпляром DdeboerImapConnection$connection = $server->authenticate('my_username', 'my_password');
Вы можете указать порт, флаги и параметры сервера:
$server = new Server($hostname, // требуемый $port, // по умолчанию используется '993' $flags, // по умолчанию используется '/imap/ssl/validate-cert'$parameters);
Получите почтовые ящики (также известные как почтовые папки) с почтового сервера и выполните итерацию по ним:
$mailboxes = $connection->getMailboxes();foreach ($mailboxes как $mailbox) {// Пропустить почтовые ящики, предназначенные только для контейнеров// @see https://secure.php.net/manual/en/function.imap-getmailboxes .phpif ($mailbox->getAttributes() и LATT_NOSELECT) {продолжить; }// $mailbox является экземпляром DdeboerImapMailboxprintf('Почтовый ящик "%s" содержит сообщения %s', $mailbox->getName(), $mailbox->count()); }
Или получить конкретный почтовый ящик:
$mailbox = $connection->getMailbox('INBOX');
Удалить почтовый ящик:
$connection->deleteMailbox($mailbox);
Вы можете массово установить или снять любой флаг сообщений почтового ящика (по UID):
$mailbox->setFlag('Seen Flagged', ['1:5', '7', '9']);$mailbox->setFlag('Seen', '1,3,5,6: 8');$mailbox->clearFlag('Flagged', '1,3');
ПРЕДУПРЕЖДЕНИЕ. В случае массового изменения флагов необходимо получить новые экземпляры сообщений, чтобы обновить отдельные флаги сообщений.
Получить сообщения (электронные письма) из почтового ящика и перебрать их:
$messages = $mailbox->getMessages();foreach ($messages as $message) {// $message — это экземпляр DdeboerImapMessage}
Чтобы вставить новое сообщение (которое только что было отправлено) в почтовый ящик «Отправленные» и пометить его как просмотренное:
$mailbox = $connection->getMailbox('Отправлено'); $mailbox->addMessage($messageMIME, 'Seen');
Обратите внимание, что сообщение должно представлять собой строку в формате MIME (как описано в RFC2045).
используйте DdeboerImapSearchExpression; используйте DdeboerImapSearchEmailTo; используйте DdeboerImapSearchTextBody; $search = new SearchExpression(); $search->addCondition(new To('[email protected]'));$search->addCondition(new Body('contents')) ;$messages = $mailbox->getMessages($search);
ВНИМАНИЕ В настоящее время мы не можем использовать одновременное экранирование пробелов и двойных кавычек. В настоящее время корректно экранируются только пробелы. Вы можете использовать DdeboerImapSearchRawExpression
, чтобы самостоятельно написать полное условие поиска.
Сообщения также можно отсортировать с помощью функции imap_sort:
$today = new DateTimeImmutable();$thirtyDaysAgo = $today->sub(new DateInterval('P30D'));$messages = $mailbox->getMessages(new DdeboerImapSearchDateSince($thirtyDaysAgo),SORTDATE, // Критерий сортировки true // По убыванию);
Обратите внимание, что библиотека PHP imap использует библиотеку c-client
, доступную по адресу https://www.washington.edu/imap/, которая не полностью поддерживает некоторые критерии поиска IMAP4, такие как OR
. Если вам нужны эти неподдерживаемые критерии, вам необходимо вручную исправить последнюю версию ( imap-2007f
от 23 июля 2011 г. на момент фиксации) и перекомпилировать PHP в исправленную библиотеку c-client
.
Кстати, большинство общих критериев поиска доступны и работают, просмотрите их в ./src/Search
.
Ссылки:
https://stackoverflow.com/questions/36356715/imap-search-unknown-search-criterion-or
imap-2007f.tar.gz: ./src/c-client/mail.c
и ./docs/internal.txt
Получите номер сообщения и уникальный идентификатор сообщения в виде <...>:
$message->getNumber();$message->getId();
Получите другие свойства сообщения:
$message->getSubject();$message->getFrom(); // MessageEmailAddress$message->getTo(); // массив MessageEmailAddress$message->getDate(); // DateTimeImmutable$message->isAnswered();$message->isDeleted();$message->isDraft();$message->isSeen();
Получите заголовки сообщений как объект DdeboerImapMessageHeaders:
$message->getHeaders();
Получите тело сообщения в формате HTML или обычный текст (только первая часть):
$message->getBodyHtml(); // Содержимое текстовой/html-части, если она присутствует $message->getBodyText(); // Содержимое текстовой/простой части, если присутствует
Получите полное тело (все части):
$body = $message->getCompleteBodyHtml(); // Содержимое части text/html, если присутствуетif ($body === null) { // Если body имеет значение null, частей HTML нет, поэтому давайте попробуем получить текст body$body = $message->getCompleteBodyText() ; // Содержимое текстовой/простой части, если присутствует}
Чтение тела сообщения сохраняет сообщение невидимым. Если вы хотите пометить сообщение как прочитанное:
$message->markAsSeen();
Или вы можете установить или снять любой флаг:
$message->setFlag('Seen Flagged'); $message->clearFlag('Flagged'); $message->clearFlag('Flagged');
Переместить сообщение в другой почтовый ящик:
$mailbox = $connection->getMailbox('другой почтовый ящик');$message->move($mailbox);
Удаление сообщений:
$mailbox->getMessage(1)->delete();$mailbox->getMessage(2)->delete();$connection->expunge();
Получите вложения к сообщению (как встроенные, так и прикрепленные) и переберите их:
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {// $attachment — это экземпляр DdeboerImapMessageAttachment}
Загрузите вложение сообщения в локальный файл:
// getDecodedContent() автоматически декодирует содержимое вложения:file_put_contents('/my/local/dir/' . $attachment->getFilename(),$attachment->getDecodedContent() );
Проверьте, является ли вложение встроенным сообщением, и получите его:
$attachments = $message->getAttachments();foreach ($attachments as $attachment) {if ($attachment->isEmbeddedMessage()) {$embeddedMessage = $attachment->getEmbeddedMessage();// $embeddedMessage является экземпляром DdeboerImapMessageEmbeddedMessage } }
EmbeddedMessage имеет тот же API, что и обычное сообщение, за исключением флагов и операций, таких как копирование, перемещение или удаление.
Расширение IMAP предоставляет функцию imap_timeout для настройки времени ожидания в секундах для различных операций.
Однако реализация расширения не связывает функциональность с конкретным контекстом или соединением, а является глобальным. Поэтому, чтобы не влиять на функциональность за пределами этой библиотеки, нам пришлось выбирать, оборачивать ли каждый вызов imap_*
необязательным тайм-аутом, предоставленным пользователем, или оставить эту задачу пользователю.
Из-за неоднородности мира серверов IMAP и высокой сложности нагрузки при таком небольшом выигрыше от первого мы выбрали второе.
Мокируемость обеспечивается интерфейсами, присутствующими для каждого API. Покопайтесь в MockabilityTest, чтобы увидеть пример имитируемого рабочего процесса.
Docker необходим для запуска сборки на вашем компьютере.
Первая команда, которую вам нужно запустить, — это make start-imap-server
, которая локально запускает сервер IMAP.
Затем локальную сборку можно запустить с помощью простого make
.
Когда вы закончите разработку, остановите локальный сервер IMAP командой make stop-imap-server
.