Как не загружать / загружать уже существующие IMAP-сообщения? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть скрипт с циклом, который загружает сообщения с одного сервера и загружает их на другой.Я бы не хотел тратить время на вызовы imap_fetchbody и imap_append, если сообщение уже существует в получателе.Есть ли что-то, что я могу использовать в "message_not_existing_in_target"?

$source_imap = imap_open(...);
$target_imap = imap_open(...);
...
if (message_not_existing_in_target) {
    $message = imap_fetchbody($source_imap, $i, '', FT_PEEK);
    imap_append($target_imap, $mbox, $message);
}

Как минимум, мне нужно:

$message = imap_fetchbody($source_imap, $i, '', FT_PEEK);
if (message_not_existing_in_target)
    imap_append($target_imap, $mbox, $message);

Поскольку загрузка имеет тенденцию быть медленнее, чем загрузка.

Я хотел бы упомянуть, что некоторые службы IMAP, такие как Gmail, по-видимому, имеют свою собственную внутреннюю проверку на дублирование - они просто возвращают TRUE без фактического сохранения дублированного сообщения.Но сообщение должно быть загружено, чтобы быть обнаруженным как дубликат, поэтому оно все еще неэффективно.

1 Ответ

0 голосов
/ 14 мая 2019
$sourceImap = imap_open('...');
$targetImap = imap_open('...');

$sourceMessages = $targetMessages = array();

$checkSourceImap = imap_check($sourceImap);
$checkTargetImap = imap_check($targetImap);

if (
    $checkSourceImap !== false &&
    $checkTargetImap !== false
) {
    $sourceImapOverview = imap_fetch_overview($checkSourceImap, "1:{$checkSourceImap->Nmsgs}");
    $targetImapOverview = imap_fetch_overview($checkTargetImap, "1:{$checkTargetImap->Nmsgs}");

    foreach ($sourceImapOverview as $sourceMessage) {
        $sourceMessages[$sourceMessage->msgno] = strtolower(urlencode($sourceMessage->subject) . '_' . urlencode($sourceMessage->from) . '_' . urlencode($sourceMessage->to)) . '_' . $sourceMessage->udate;
    }

    foreach ($targetImapOverview as $targetMessage) {
        $targetMessages[$targetMessage->msgno] = strtolower(urlencode($targetMessage->subject) . '_' . urlencode($targetMessage->from) . '_' . urlencode($targetMessage->to)) . '_' . $targetMessage->udate;
    }

    $newMessages = array_diff($sourceMessages, $targetMessages);

    if (!empty($newMessages)) {
        foreach ($newMessages as $messageNumber => $newMessage) {
            $message = imap_fetchbody($sourceImap, $messageNumber, '', FT_PEEK);
            imap_append($targetImap, $checkTargetImap->Mailbox, $message);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...