從我的經驗來看,爲了讓這項工作以一種可行的方式進行,您需要先看看Web Mail平臺的工作方式。當在頁面上查看電子郵件時,提供者不會在登錄頁面時從電子郵件服務器提取所有電子郵件。如果這是常態,那麼服務器/磁盤將一直在加載。查詢是受控制的,通常在屏幕上一次顯示約50-100項。有些甚至會顯示所有項目正在顯示(Outlook Web Access),但實際上它們會在用戶滾動時開始搜索。我建議您使用下面的腳本進行測試,該腳本限制了提取查詢的結果數量。它是爲了測試類似的問題而構建的,並且非常適合測試。將$mailNumber
更改爲您希望在屏幕上打印的記錄數(INT
)並進行測試。每個電子郵件都可以選擇,你應該看到純文本的視圖(除非電子郵件只能用HTML編寫)。我也禁用了SSL驗證,因爲這也會減慢連接的響應時間。
$imapServ = "imap.server.com";
$imapPort = "993";
$imapUser = "EMAIL";
$imapPass = "PASSWORD";
$mbox = imap_open("{" . $imapServ . ":" . $imapPort . "/imap/ssl/novalidate-cert}INBOX", $imapUser, $imapPass);
if (isset($_GET['email'])) {
$result = imap_fetchbody($mbox, $_GET['email'], 1);
echo "<p>$result</p>";
echo "<br>";
echo "<b><a href=\"" . $_SERVER['SCRIPT_NAME'] . "\">Back To List</a></b>";
} else {
$mc = imap_check($mbox); //Total count of mail in inbox
$mailNumber = $mc->Nmsgs/20; //Set Number for Email List Here
$result = imap_fetch_overview($mbox,"1:" . round($mailNumber) . "",0);
foreach ($result as $v) {
echo "<a href=\"" . $_SERVER['SCRIPT_NAME'] . "?email=" . $v->uid . "\"><b>From:</b>" . $v->from . " <b>Subject: </b>" . $v->subject . " <b>Date: </b>" . $v->date . "</a>";
echo "<br>";
}
}
迴應評論:
由於這僅與Gmail發生了,我猜你有一個穩定的互聯網連接,我懷疑這個問題是到Gmail的限制帶寬外部IMAP連接。爲了證明這一點,請在其他提供商處進行測試並調查結果。不要忘了大多數人要麼使用Gmail門戶(毫無疑問,直接連接到無節流IMAP數據服務器直接)的緩存IMAP數據,這樣他們就只新郵件進行檢查,然後在客戶端中存儲郵件,因此和電子郵件客戶端爲什麼這些症狀不會引人注目。
這也可能是值得考慮的一個DB的解決方案來存儲IMAP數據,然後頻繁與Gmail的IMAP服務器進行比較。這樣你唯一的瓶頸就是你的數據庫。咆哮,你需要與谷歌直接提出這一點,但我懷疑他們會提供免費服務的很多幫助。
你最後的選擇是使用一個完全不同的解決方案。谷歌有一個Gmail API,所以你可以看到這是否更快從給定的郵箱拉數據。
進一步的評論迴應:
正如你所提到的鬆散,是否使用API或IMAP,您的訪問通過,你有沒有真正的控制了與問候,如果你的代碼速度的協議的服務已經優化。上面的示例刪除了用於測試的Javascript/HTML語言版本。由於這沒有表現出任何真正的速度提升,你已經證實,IMAP工作大大加快您的託管平臺,則問題與Gmail或您的ISP,所以你需要,如果你有解決的任何機會,直接與他們聯繫。我非常懷疑這是您的ISP,但如果您不在Google的位置,它仍然是一個呼叫點。我會建議DNS的變化,但我可以看到你已經做出了相關的改變,希望解決(特別是通過IP進行測試)。
好了,該腳本同時取每個電子郵件之一。批量提取速度要快得多。 – Max
你如何做批量取材? –
我不知道PHP庫,但您需要一次獲取多條消息。在IMAP協議中,這看起來像'A FETCH 1,2,3,4,5,6,7,8,9,23,45,28(UID FLAGS ....)',它給你響應所有請求的消息在同一時間。檢查你的文件'序列集'等。通過這種方式,你可以每次往返取50個郵件,而不是1個。 – Max