为什么程序在下载完所有电子邮件后无法停止?
在我的Gmail中有2465封电子邮件,为什么下载所有电子邮件后程序无法停止? 所有的code1和code2都以命令行模式运行。
代码1:
<?php $mailbox = array( 'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 'username' => 'xxxx@gmail.com', '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"; ?>
对于code1:
1.可以下载所有的电子邮件。
2.在控制台上输出2465
3.不要over
控制台over
输出。
程序不能停下来,似乎永远在运行。
码2:
<?php $mailbox = array( 'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 'username' => 'xxxx@gmail.com', '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.在控制台上输出2465。
3. over
控制台over
输出。
4.下载完所有电子邮件后,程序停止。
有一行echo $email_id.PHP_EOL;
在代码2中多于代码1,其他代码相同。
所有的code1和code2都以命令行模式运行。
谁能解释一下?
尝试
print imap_last_error();
在imap_close
之前和之后,更多地了解导致问题的原因
检查imap_fetchbody()
函数,这个函数允许你设置下载限制,用这个你可以在所有邮件下载后停止。 检查下面的代码,我做了一些更改到您的代码,将停止所有邮件下载后的下载过程。 请检查一次。
<?php $mailbox = array( 'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 'username' => 'xxxx@gmail.com', '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()
replace了imap_fetch_overview()
并做了一些相关的修改。
让我知道是否需要进一步的帮助。
<?php $mailbox = array( 'mailbox' => '{imap.gmail.com:993/imap/ssl}INBOX', 'username' => 'xxxx@gmail.com', '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 ?>
我已经重置了电子邮件variables。