Как оптимизировать получение писем IMAP?

Есть задача - найти письмо с ссылкой, обойдя все папки почты, т.к. оно может упасть и в спам, и во входящие или еще куда-то.

Я использую библиотеку PHP IMAP

Проблема заключается в том, что иногда очень долго ищет письмо. Скорее всего из-за array_reduce, но как иначе сделать не знаю.

Подскажите оптимизированный вариант решения моей задачи. Вот кусочек кода

// Additional search parameters
$searchParams = [
    'FROM'    => getPostField('from'),
    'TO'      => getPostField('to'),
    'SUBJECT' => getPostField('subject'),
    'BODY'    => getPostField('body'),
];

$mailbox = connect($host, $port, $login, $password, $type, $ssl);

// get the list of folders/mailboxes
$folders = $mailbox->getMailboxes();

$mails_ids = array_reduce($folders, function ($sum, $folder) use ($mailbox, $searchParams) {
    // switch to particular mailbox
    $mailbox->switchMailbox($folder['fullpath']);

    $ids = $mailbox->searchMailbox(getSearch($searchParams));

    if ($ids) {
        $sum[$folder['fullpath']] = $ids;
    }
    return $sum;
}, []);

if (empty($mails_ids)) {
    exit(json_encode(['status' => 'mails not found']));
}

$emails = [];

foreach($mails_ids as $folder => $mail_folder_ids) {
    $mailbox->switchMailbox($folder);

    foreach ($mail_folder_ids as $mail_id) {
        $email = $mailbox->getMail($mail_id);

        $mailbox->markMailAsRead($mail_id);
        $emails[$email->date] = $email;
    }
}

krsort($emails);
$email = array_shift($emails);

$pattern = '~[a-z]+://[^"]+~';
preg_match_all($pattern, $email->textHtml, $matches);
echo json_encode($matches[0]);
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы