imap_thread() 會傳回郵件主題,但僅限於您在 imap_open() 中定義的目前開啟的信箱。這對於獲取完整主題(例如從「已傳送郵件」和「收件匣」中獲取,這花了我一天時間才弄清楚)來說並不好用。
如果您比較 Outlook 和 gmail.com 上的主題,您會發現 Outlook 是根據主旨標題來判斷主題,而不是實際的父>子關係。
然而,Gmail 似乎正確地取得了主題,但沒有將您使用其網頁介面傳送的郵件包含在 {imap.google.com:993/imap/ssl}已傳送郵件中。這表示使用 PHP imap 的主題對於 Gmail 來說並不完美。
如果您使用 Outlook(或任何郵件用戶端)傳送郵件,gmail.com 會將其放入「已傳送郵件」中。
總而言之,PHP imap 的主題處理並不完美。但我認為這更多是 imap 規範的問題(親愛的 IMAP 開發人員,請新增更好的 uid 和父 id。謝謝,Chris),而不是 PHP 的問題。
所以我建立了以下使用 Outlook 方法(比較主旨)來處理主題的程式碼
<?php
$imap = imap_open('{imap.gmail.com:993/imap/ssl}INBOX', 'youremail@gmail.com', 'yourpassword');
$subject = 'Item b';
$threads = array();
$subject = trim(preg_replace("/Re\:|re\:|RE\:|Fwd\:|fwd\:|FWD\:/i", '', $subject));
$results = imap_search($imap, 'SUBJECT "'.$subject.'"', SE_UID);
if(is_array($results)) {
$emails = imap_fetch_overview($imap, implode(',', $results), FT_UID);
foreach ($emails as $email) {
$threads[strtotime($email->date)] = $email;
}
}
imap_reopen($imap, '{imap.gmail.com:993/imap/ssl}Sent Messages');
$results = imap_search($imap, 'SUBJECT "'.$subject.'"', SE_UID);
if(is_array($results)) {
$emails = imap_fetch_overview($imap, implode(',', $results), FT_UID);
foreach ($emails as $email) {
$threads[strtotime($email->date)] = $email;
}
}
ksort($threads);
echo '<pre>'.print_r($threads, true).'</pre>';
exit;
?>
因此,如果您要有效地使用 imap_thread(),這可能是我能想到的最佳方法。
<?php
$imap = imap_open('{imap.gmail.com:993/imap/ssl}INBOX', 'youremail@gmail.com', 'password');
$threads = $rootValues = array();
$thread = imap_thread($imap);
$root = 0;
foreach ($thread as $i => $messageId) {
list($sequence, $type) = explode('.', $i);
if($type != 'num' || $messageId == 0
|| ($root == 0 && $thread[$sequence.'.next'] == 0)
|| isset($rootValues[$messageId])) {
continue;
}
if($root == 0) {
$root = $messageId;
}
$rootValues[$messageId] = $root;
if($thread[$sequence.'.next'] == 0) {
$root = 0;
}
}
$emails = imap_fetch_overview($imap, implode(',', array_keys($rootValues)));
foreach ($emails as $email) {
$root = $rootValues[$email->msgno];
$threads[$root][] = $email;
}
echo '<pre>'.print_r($threads, true).'</pre>';
imap_close($imap);
exit;
?>