
В записи описан пример PHP-кода, который позволит получить письма с указанными фильтрами из почтового ящика gmail или yandex по imap протоколу. Мне это пригодилось в модуле, который проходит верификацию через присылаемую ссылку на почтовый ящик.
Для этого используется популярная библиотека PhpImap.
Для полноценной работы PHP с протоколом IMAP рекомендуют подключить расширение php_imap.dll/imap.so в файле php.ini для полноценной работы PHP с протоколом IMAP. Но мне эта рекомендация не понадобилась. Все заработало и так.
Содержание
Подключение к почтовому серверу
Подключение к почтовому ящику от Yandex
Начнем с него, так в Яндексе нужно делать меньше предварительных настроек: проверьте что в настройках Yandex почты разрешенно подключение по IMAP.
//Подключаем библиотеки include('/phpImap/Mailbox.php'); include('/phpImap/IncomingMail.php'); //Для удобства создам константы для подключения к почтовому серверу. define('MAIL_IMAP_SERVER', 'imap.yandex.ru'); define('MAIL_IMAP_SERVER_PORT', 993); define('MAIL_IMAP_LOGIN', 'example@yandex.ru'); define('MAIL_IMAP_PASS', 'example_pass'); define('MAIL_IMAP_PATH', '{'.MAIL_IMAP_SERVER.':'.MAIL_IMAP_SERVER_PORT.'/imap/ssl}INBOX'); $mailbox = new PhpImap\Mailbox(MAIL_IMAP_PATH, MAIL_IMAP_LOGIN, MAIL_IMAP_PASS, __DIR__); try { $mailbox->getImapStream(); } catch (Exception $e) { die($e->getMessage()); }
Конструктор класса Mailbox принимает следующие аргументы:
- MAIL_IMAP_PATH - адрес сервера (MAIL_IMAP_SERVER), порт подключения (MAIL_IMAP_SERVER_PORT), тип соединения (imap) и показываем что соединение будет зашифровано (ssl). После фигурных скобок указываем папку к которой будем подключаться, в данном случае к входящим сообщениям (INBOX).
- MAIL_IMAP_LOGIN - Почтовый ящик
- MAIL_IMAP_PASS - Пароль (чаще всего это пароль от почтового ящика).
- __DIR__ - Это путь к папке в которой будут сохраняться вложенные файлы и почтовые сообщения.
После этого мы проверим, создалось ли наше подключение через метод getImapStream() если по какой-то причине подключения не создастся то приложение выбрасывает исключения с причиной не удачного подключения.
Подключение к почтовому ящику от Gmail
PHP-код:
define('MAIL_IMAP_SERVER', 'imap.gmail.com'); define('MAIL_IMAP_SERVER_PORT', 993); define('MAIL_IMAP_LOGIN', 'example@gmail.com'); define('MAIL_IMAP_PASS', 'example_pass'); define('MAIL_IMAP_PATH', '{'.MAIL_IMAP_SERVER.':'.MAIL_IMAP_SERVER_PORT.'/imap/ssl}INBOX');
Перед этим в Gmail нужно сделать следующее:
- разрешить IMAP - он по умолчанию отключен: Настройки -> Пересылка и POP/IMAP -> блок Доступ по протоколу IMAP -> Включить IMAP
- активировать двух факторную авторизацию для данного профиля
- создать пароль приложение, вот тут
- созданный пароль для приложения необходимо вписать в константу MAIL_IMAP_PASS
После создания пароля приложений возможно понадобится подождать 5-60 минут пока он начнет работать.
Выборка данных
После успешного подключения, можно выполнить запрос для получения потовых сообщений. Для этого используется метод searchMailBox(string $criteria) который по сути является оберткой метода imap_search. Тут важно понять что аргумент $criteria является неким критерием поиска нужных нам сообщений, сам метод возвращает идентификаторы элементов которые в последствии нам пригодятся для получения детальной информации почтового сообщения.
Получаем все сообщения:
$mailsIds = $mailbox->searchMailBox('ALL');
Еще примеры:
//Все сообщения за 3 дня. $mailsIds = $mailbox->searchMailBox('SINCE "'.date('d-M-Y',strtotime("-3 day")).'"'); //Непрочитанные сообщения за 3 дня. $mailsIds = $mailbox->searchMailBox('UNSEEN SINCE "'.date('d-M-Y',strtotime("-3 day")).'"'); //Поиск сообщений с таким соответствием в заголовке TEXT. $mailsIds = $mailbox->searchMailBox('TEXT "Новостная рассылка"'); //Поиск сообщений с таким соответствием в заголовке BODY. $mailsIds = $mailbox->searchMailBox('BODY "Информационное сообщение"'); //Поиск по емейлу отправителя. $mailsIds = $mailbox->searchMailBox('FROM "news@site.ru"'); //Получить сообщения по заголовку SUBJECT $mailsIds = $mailbox->searchMailBox('SUBJECT "Выпущены обновления для вашего телефона"');
Получение информации
Теперь когда у нас есть массив идентификаторов сообщений мы готовы его обработать:
//Получаем идентификатор последнего сообщения из массива. $id = end($mailsIds); //Получаем экземпляр объекта класса IncomingMail который содержит информацию о сообщении. $mail = $mailbox->getMail($id); //Получаем файлы вложенные к данному сообщению если он есть. $mail->getAttachments(); //Выводим сообщения. echo $mail->textHtml;
Дополнительные возможности
В данной библиотеке также присутствие ряд полезных методов для более удобной работы с почтовыми сообщениями:
#Сохраняем сообщения по его ид: $mailbox->saveMail($id,$id.'.eml'); #Устанавливаем сообщения как непрочитанное по его id: $mailbox->markMailAsUnread($id); #Устанавливаем сообщения как прочитанное по его id: $mailbox->markMailAsRead($id); #Устанавливаем на сообщение пометку по его id: $mailbox->markMailAsImportant($id); #Удаляем сообщения по его id: $mailbox->deleteMail($id);
Спасибо, дружище
:-) OK !
По примеру для yandex делал и всё ок, спасибо!
Пишет Class ‘PhpImap\Mailbox’ not found (0)