我正在尝试编写一个使用IMAP PHP扩展的PHP程序来运行一个非常大的收件箱(超过70,000封电子邮件),并将属于指定日期范围的所有电子邮件移动到一个文件夹中。我一直遇到试图让邮件落在所需范围内的问题。
首先,我尝试在imap_search()中使用SINCE和BEFORE条件将所有需要的ID号放入一个数组中,然后创建一个字符串,列出这些ID号以输入imap_mail_move()。但我遇到的问题是imap_search()实际上从未返回指定范围内的所有电子邮件。例如,我运行了以下代码:
echo "Beginning search. \n";
$mail = imap_search($this->mbox,
'SINCE "$startDate" BEFORE "$endDate"');
echo "Search complete. \n";
if (!$mail){echo "The inbox is empty. \n"; die();}
$count = 0;
foreach($mail as $i)
{
$count = $count + 1;
}
echo "Found $count emails. \n";
同时指定我知道要保存600条电子邮件的日期范围,而imap_search()仅列出其中的259条。当我将范围扩展到包含大约75,000封电子邮件的整个收件箱时,imap_search()仅返回了25,112封电子邮件。
当这不起作用时,我尝试了一种不同的,较慢的方式来获取所需日期范围内的所有电子邮件。我使用imap_search()来收集收件箱中的所有电子邮件,然后我遍历每封电子邮件,将电子邮件标题中包含的日期与定义我的间隔的日期进行比较,并将ID添加到字符串中(如果它在范围内)。我运行了以下代码:
// Get all mail in the INBOX
$mail = imap_search($this->mbox, "ALL");
if (!$mail){echo "The inbox is empty. \n"; die();}
// Create a string list of all message IDs
//that fall in the specified range
$processed = 0;
$IDsequence = '';
foreach($mail as $messageID)
{
$date = imap_headerinfo($this->mbox, $messageID)->date;
try {$dateObject = new DateTime($date);}
catch (Exception $e) {echo $e->getMessage(); echo "\n";}
$dateObject->setTimezone($TimeZone);
if ($dateObject <= $IntervalEndDate && $dateObject >=
$IntervalStartDate)
{
$IDsequence = $IDsequence . "," . strval($messageID);
}
$processed = $processed + 1;
if ($processed % 100 == 0)
{ echo "Processed $processed emails. \n"; }
}
// If we got at least one message, cut off the first comma.
if (strlen($IDsequence) > 1){
$IDsequence = substr($IDsequence, 1, strlen($IDsequence)-1);
}
else
{
echo "No e-mail to move. \n";
die();
}
echo "Beginning copy. \n";
imap_mail_copy($this->mbox, $IDsequence, $TargetFolder);
echo "Copy complete. \n";
//imap_expunge($this->mbox);
imap_close($this->mbox);
在迭代了超过25,000封电子邮件之后,它开始打印错误消息“对象不存在”,引用我从电子邮件标题收集日期的代码行。我在这里注意到故障仍然发生在大约25,000封电子邮件中,所以可能两种方法都因为同样的原因而中断。我怀疑我对消息ID做错了(例如,我假设75,000封电子邮件的消息ID是'1'到'75,000')。
出了什么问题?有没有办法收集大量日期范围内的电子邮件并移动它们?
答案 0 :(得分:0)
邮箱中可能只有25,112封邮件,而另一封邮箱中只有50,000封邮件。例如,我知道GMail可能会报告收件箱的粗略总数,但这些邮件中有很大一部分实际存档。
此时您可能想要进行健全性检查。 :)