PHP: входящая почта через IMAP

php imap get mail inbox

В записи описан пример 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);

Полезные ссылки:

Понравилось? =) Поделись с друзьями:

Обсуждение записи “PHP: входящая почта через IMAP”

  1. Валерий says:

    Спасибо, дружище

  2. MSVCP140 says:

    :-) OK !

  3. Дима says:

    По примеру для yandex делал и всё ок, спасибо!

  4. Тарас says:

    Пишет Class ‘PhpImap\Mailbox’ not found (0)

Обсудить