2016-12-11 245 views
3

我使用David Walsh中的腳本,它通過IMAP連接到Gmail並在屏幕上輸出電子郵件數據。與Gmail的IMAP連接速度很慢

我已經運行兩個測試用例:

  1. 使用IMAP從我自己的域名讀郵件。
  2. 使用IMAP從Gmail中讀取電子郵件。

閱讀120封電子郵件的時間非常不同。 對於Gmail,整個腳本大約需要5秒,1.2連接和3.8讀電子郵件和0.1629連接和0.0238。

這些值與我的預期非常不同。

我迄今所做的:

  1. 我已經爲谷歌配置的DNS服務器。
  2. 我已經打過電話兩種方式的服務器:

    • 直接:imap.gmail.com
    • 直接通過IP

在這兩種情況下,它只是工作同樣,它非常緩慢。

任何人都可以幫助我嗎?

以後編輯:

如果我使用Gmail的API有些人問。是的,我使用過它,比Google IMAP解決方案慢。 我需要每1秒用IMAP掃描我的Google郵箱。 我知道它可以完成,因爲我正在複製另一個應用程序,我確定這是在執行此操作。

+0

好了,該腳本同時取每個電子郵件之一。批量提取速度要快得多。 – Max

+1

你如何做批量取材? –

+0

我不知道PHP庫,但您需要一次獲取多條消息。在IMAP協議中,這看起來像'A FETCH 1,2,3,4,5,6,7,8,9,23,45,28(UID FLAGS ....)',它給你響應所有請求的消息在同一時間。檢查你的文件'序列集'等。通過這種方式,你可以每次往返取50個郵件,而不是1個。 – Max

回答

1

從我的經驗來看,爲了讓這項工作以一種可行的方式進行,您需要先看看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進行測試)。

+0

你的回答很有幫助,通常可以加快這個過程。不過,我的問題更具體。我的問題是關於Google郵件閱讀速度(通過IMAP)和我自己的域中常規IMAP之間的差異。 gmail的速度差異是慢10倍。爲什麼? –

+0

響應時間過長,無法寫入評論框。見答案。 – Kitson88

+0

我已使用Gmail API。它不比gmail imap快。事實上它很慢。發生這種情況有兩個原因。 1),因爲我每秒都會讀它,谷歌會引入一些延遲。所以一讀電子郵件需要1秒,2分鐘需要更長的時間,3分鐘更長,等等。和2)減緩的原因是Oauth進程...這對IMAP沒有發生。 –