2012-02-21 13 views
0

我是一個超級新手與Ruby,並玩弄IMAP庫。下面的程序似乎工作,但它永遠持續下去,直到所有消息加載。我如何將輸出限制爲X個消息,就像我只想顯示10個消息一樣?我想這是某種「如果信封=」 - 但不知道該放什麼。謝謝!如何限制使用條件與Ruby IMAP

require 'net/imap' 
imap = Net::IMAP.new('mail.domain.com') 
imap.authenticate('LOGIN', ' ', ' ') 
imap.examine('INBOX') 
imap.search(["SEEN"]).each do |message_id| 
    envelope = imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"] 
    puts "#{envelope.from[0].name}: \t#{envelope.subject}" 
end 

不知道是否適用於本案,或者我應該做一個新的問題,但使用「因爲」從下面的想法,我將如何顯示所有郵件(數組中的元素)獲取的計數?

imap.examine('INBOX') 
    imap.search(["SINCE", "17-Feb-2012"]).each do |message_id| 
    envelope = imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"] 
    puts "#{envelope.from[0].name}: \t#{envelope.subject}" 
    puts "#{envelope.count}" 
    end 

上面在每行之後放置數字10,無論返回的電子郵件數量多少。我將如何a)只將結果放在列出的所有電子郵件的末尾,並b)找到數組中元素的真實數量?

OK,想通了第二部分:

require 'net/imap' 
imap = Net::IMAP.new('mail.domain.com') 
imap.authenticate('LOGIN', 'username', 'password') 
imap.examine('INBOX') 
mail_count = imap.search(["SINCE", "20-Feb-2012"]) 
puts mail_count.count 
+0

搜索只是返回一個數組,所以你總是可以只看前10個元素,而不是遍歷每個元素... – 2012-02-21 03:54:39

回答

2

您可以使用slice只得到N個結果:指定的起始位置

imap.search(["SEEN"]).slice(0, 10).each do |message_id| 
    ... 
end 

的第一個參數(在0這裏),和第二你需要的總數。

注意:根據IMAP的搜索方法的實現,底層調用仍然可以從服務器獲取所有消息。

+0

謝謝!這工作,我不認爲它提取所有消息,因爲它只需要幾秒鐘。我一直在試圖定義一個新的變量message_count和+ = 1,但似乎要麼什麼也不做,要麼顯示每個消息的10個副本,具體取決於我放置的位置。這雖然完美。 – krapdagn 2012-02-21 04:08:24

+0

Yeah'search'返回一組消息ID(可能包含來自所有消息的ID),並且它返回的速度很快。請將此標記爲最佳答案,如果它按照您的要求工作:) – 2012-02-21 04:10:57

0

imap.search向郵箱發送搜索命令,取回數組或消息序列號。每個塊都在其上運行。您還可以嘗試通過指定一些限制鍵來限制搜索結果的數量,如SINCEBEFORE

imap.search("BEFORE", "30-Jan-2012", "SINCE", "1-Jan-2012") 

link to documentation

+0

根據您的建議發佈了後續Q – krapdagn 2012-02-21 04:26:52