Подтвердить что ты не робот

Почему программа не может остановиться после загрузки всех электронных писем?

В моем gmail есть 2465 электронных писем, почему программа не может остановиться после загрузки всех электронных писем? Все код1 и код2 выполняются в режиме командной строки.
code1:

<?php
$mailbox = array(
    'mailbox'  => '{imap.gmail.com:993/imap/ssl}INBOX',
    'username' => '[email protected]',
    'password' => 'yyyy'
);

$stream = imap_open($mailbox['mailbox'], $mailbox['username'], $mailbox['password'])
    or die('Cannot connect to mailbox: ' . imap_last_error());
$emails = imap_search($stream,"ALL");
$nums=imap_num_msg($stream);
echo $nums;
foreach($emails as $email_id) {

            $mime = imap_fetchbody($stream, $email_id, "");
            file_put_contents("/tmp/" . "email_{$email_id}.eml", $mime);
        }

imap_close($stream);
echo "over";
?>

Для кода1:
1. можете загрузить все электронные письма.
2.output 2465 на консоли
3.no over на консоли.
4. Программа не может остановиться, она, кажется, работает вечно.

code2:

<?php
$mailbox = array(
    'mailbox'  => '{imap.gmail.com:993/imap/ssl}INBOX',
    'username' => '[email protected]',
    'password' => 'yyyy'
);

$stream = imap_open($mailbox['mailbox'], $mailbox['username'], $mailbox['password'])
    or die('Cannot connect to mailbox: ' . imap_last_error());
$emails = imap_search($stream,"ALL");
$nums=imap_num_msg($stream);
echo $nums;
foreach($emails as $email_id) {
            echo  $email_id.PHP_EOL;
            $mime = imap_fetchbody($stream, $email_id, "");
            file_put_contents("/tmp/" . "email_{$email_id}.eml", $mime);
        }

imap_close($stream);
echo "over";
?>

Для кода2:
1. можете загрузить все электронные письма.
2.output 2465 на консоли.
3. over вывод на консоли.
4. Программа останавливается после загрузки всех писем.

Есть одна строка echo $email_id.PHP_EOL; в коде2 больше кода1, другие коды одинаковы.
Все код1 и код2 выполняются в режиме командной строки.
Кто может это объяснить?

enter image description here

4b9b3361

Ответ 1

Try

print imap_last_error();

До и после imap_close, чтобы узнать больше о причинах вашей проблемы

Ответ 2

Проверить imap_fetchbody() функцию, эта функция позволяет вам установить ограничение на загрузку, и при этом вы можете остановиться после всех загрузок почты. Проверьте ниже код, я внесла некоторые изменения в ваш код, который остановит процесс загрузки после того, как все письма будут загружены. Пожалуйста, проверьте один раз.

<?php
$mailbox = array(
    'mailbox'  => '{imap.gmail.com:993/imap/ssl}INBOX',
    'username' => '[email protected]',
    'password' => 'yyyy'
);

$stream = imap_open($mailbox['mailbox'], $mailbox['username'], $mailbox['password'])
    or die('Cannot connect to mailbox: ' . imap_last_error());

//Check all mails...
$imap_obj = imap_check($stream);

// Fetch an overview for all messages in INBOX...
$nums=imap_num_msg($stream);
$emails = imap_fetch_overview($stream,"1:{$imap_obj->Nmsgs}",0);

echo $nums;
//Loop until mail data...
foreach($emails as $objEmail_data) {
    $mime = imap_fetchbody($stream, $objEmail_data->msgno, "");
    file_put_contents("/tmp/" . "email_{$objEmail_data->msgno}.eml", $mime);
}

imap_close($stream);
echo "over";
?>

И посмотрите результаты!

Я заменил imap_search() на imap_fetch_overview() и внес некоторые изменения.

Сообщите мне, нужна ли какая-либо дополнительная помощь.

Ответ 3

<?php
$mailbox = array(
    'mailbox'  => '{imap.gmail.com:993/imap/ssl}INBOX',
    'username' => '[email protected]',
    'password' => 'yyyy'
);

$stream = imap_open($mailbox['mailbox'], $mailbox['username'], $mailbox['password'])
    or die('Cannot connect to mailbox: ' . imap_last_error());
$emails = imap_search($stream,"ALL");
$nums=imap_num_msg($stream);
//echo $nums; // removed this
foreach($emails as $email_id) {

            $mime = imap_fetchbody($stream, $email_id, "");
            file_put_contents("/tmp/" . "email_{$email_id}.eml", $mime);
        }
unset($emails); // added this
imap_close($stream);
die ("over"); // changed this
?>

У меня есть reset переменные электронной почты.