2015-03-25 34 views
0

我使用ImapX 2我的C#程序來檢查Gmail帳戶的郵件,但整個過程似乎花太多時間,我會在代碼解釋:C#ImapX 2電子郵件校驗碼似乎很慢

public static string checkForSubject() { 
    ImapX.ImapClient client = new ImapX.ImapClient(); 
    client.Port = 993; 
    client.UseSsl = true; 
    client.Host = "imap.gmail.com"; 
    if (client.Connect()) { 
     client.Login(Constants.EMAIL_SENDER, Constants.EMAIL_SENDER_PASSWORD); 
     var messages = client.Folders.Inbox.Search("ALL"); // THIS LINE takes like 5-10 seconds to complete 
     foreach (var item in messages) { 
      if (item.Subject.StartsWith("HELLO_")) { 
       string s = item.Subject; 
       return s; 
      } 
     } 
    } 
    return null; 
} 

我的代碼有什麼問題,或者IMAP訪問正常嗎?

回答

2

那麼,你要求的文件夾中的所有消息的UID或索引。如果文件夾中有很多消息,並且IMAP服務器不支持ESEARCH擴展(並且/或者ImapX沒有利用ESEARCH擴展),那麼服務器將發回大量文本,這會花費很長時間時間傳送。

文本的牆,我指的會是這個樣子:

* SEARCH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 9999 10000 

你會得到每一個消息數量。

隨着ESEARCH,你會得到:

* ESEARCH 1:10000 

但是,這是一種跑題,因爲它看起來像ImapX將下載所有匹配的消息,你的情況是所有消息中的夾。

您的搜索也非常低效。如果你只是想與"HELLO_"啓動的消息,你可以這樣做,而不是:

var messages = client.Folders.Inbox.Search("SUBJECT HELLO_"); 
foreach (var item in messages) { 
    if (item.Subject.StartsWith("HELLO_")) { 
     string s = item.Subject; 
     return s; 
    } 
} 

你仍然需要保留item.Subject.StartsWith()檢查,因爲IMAP不必檢查字符串開始的能力以字符串結尾或者以字符串結尾,它只是執行「包含」類型的搜索。

但是,這個搜索查詢將返回更少的匹配,這意味着ImapX將下載更少的消息,這意味着它應該快得多。

不幸的是,對於你在做什麼來說,它仍然是非常低效的,因爲你關心的只是主題字符串而不是整個消息。

我不夠用ImapX熟悉,使這個更有效,但如果你使用MailKit,比如,你可以這樣做:

client.Inbox.Open (FolderAccess.ReadOnly); 
var uids = client.Inbox.Search (SearchQuery.SubjectContains ("HELLO_")); 
if (uids.Count > 0) { 
    var summaries = client.Inbox.Fetch (uids, MessageSummaryItems.Envelope); 
    foreach (var summary in summaries) { 
     if (summary.Envelope.Subject.StartsWith ("HELLO_")) 
      return summary.Envelope.Subject; 
    } 
} 

希望有所幫助。

1

您可以通過限制下載的電子郵件部分來提高性能。

client.Folders.Inbox.Search("SUBJECT HELLO_", ImapX.Enums.MessageFetchMode.Minimal); 

只有主題和標題將被下載。