Есть задача - найти письмо с ссылкой, обойдя все папки почты, т.к. оно может упасть и в спам, и во входящие или еще куда-то.
Я использую библиотеку
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]);