23 ноября 2016      177      0

Поиск письма через IMAP

В системах, занимающихся сбором информации или эмуляцией действий пользователя на сторонних ресурсах — например, автоматическая регистрация аккаунтов, получение доступа к закрытой от гостей части ресурса и т.д., — довольно часто встречается задача получения сообщения электронной почты в качестве подтверждения или уведомления о каком-либо событии. В данной статье я приведу пример реализации проверки почтового ящика на наличие нужного письма. Доступ к почте осуществляется через протокол IMAP. Используемые инструменты: PHP 5.3 и расширение php-imap.

Поиск письма через IMAP

function get($host, $email, $password, $subject) {
    $imap = imap_open($host, $email, $password);

После попытки соединения с ящиком с помощью функции imap_open, необходимо проверить успешность этой операции.

		
    if ($imap === FALSE) {
        $imap_error = imap_last_error();

        trigger_error("IMAP: {$email} connection failed. " . imap_last_error(), E_USER_WARNING);
        imap_errors();

Принудительный вызов функции imap_errors выполняется для очистки буфера сообщений об ошибках. На данный момент расширение Imap в PHP имеет баг, из-за которого даже после уничтожения handler-а $imap, «неочищенные» сообщения об ошибках будут выведены в конце выполнения основного скрипта. При этом вывод будет содержать некорректную информацию о месте возникновения ошибки (нулевые значения номера строки с ошибкой и нулевой же код ошибки).

      if (stripos($imap_error, 'Incorrect username or password') !== FALSE) {
            // authorization problem
        }
        return FALSE;
    }

    if (imap_last_error()) {
        imap_close($imap);
        trigger_error("IMAP: {$email} login failed. " . imap_last_error(), E_USER_WARNING);
        imap_errors();
        return FALSE;
    }

Осуществляем поиск в почтовом ящике среди непрочитанных писем. Сверяем тему письма с нужной нам и в случае успеха возвращаем тело найденного письма.

    $emails = imap_search($imap, 'UNSEEN');

    if (!is_array($emails) || count($emails) <= 0) {
        imap_close($imap);
        return FALSE;
    }

    $emails_numbers = implode(',', $emails);

    $body = FALSE;
    $overview = imap_fetch_overview($imap, $emails_numbers);
    if (is_array($overview) && count($overview) > 0) {
        foreach ($overview as $msg) {
            if ($subject == $msg->subject) {
                $body = imap_body($imap, $msg->msgno);
                break;
            }
        }
    }

    imap_close($imap);

    return $body;
}

Приведенное решение может служить основой для написания автоответчика, который может посылать автоматические отлупы (так называемые «canned response») надоевшим адресатам. В критерии поиска можно включить не только тему письма, но и набор ключевых слов для проверки тела сообщения.

Все темы на сайте

© 2017 BorPost · Копирование материалов сайта без разрешения запрещено