2012-02-21 14 views
0

私はRubyの超初心者であり、IMAPライブラリで遊んでいます。以下のプログラムは動作するようですが、すべてのメッセージがロードされるまで永遠に続きます。私は10を表示したいだけのように、出力をX個のメッセージに制限する方法はありますか?私はそれが何らかの「封筒なら」と思っていますが、そこに置くべきものは分かりません。ありがとう!私は、新しい質問をするが、以下からアイデア「SINCE」、どのように私はすべてのメール(配列の要素)フェッチの回数を表示していました使用する必要があり、ここで場合、または適切な場合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、第二部を考え出し:開始位置を指定(ここでは0です)

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

最初のパラメータ、および:あなたが唯一のN個の結果を得るためにsliceを使用することができます

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個の要素を見ることができます。 –

答えて

2

は、 2番目の数字は必要な総数です。

注:IMAPの検索メソッドの実装に基づいて、基本となる呼び出しでもサーバーからすべてのメッセージが取得される可能性があります。

+0

ありがとう!これはうまくいって、数秒しかかからなかったので、すべてのメッセージを取得したとは思わない。私は新しい変数message_countと+ = 1を定義しようとしていましたが、それは何もしないか、私がどこに置くかに応じて各メッセージの10個のコピーを表示するようです。これは完璧に動作します。 – krapdagn

+0

ええ 'search'はメッセージID(すべてのメッセージのIDを含む可能性があります)の配列を返し、高速に戻ります。あなたが欲しいものとして機能する場合、これを最善の答えとしてマークしてください:) –

0

imap.searchは、メールボックスに検索コマンドを送信し、配列またはメッセージシーケンス番号を返します。各ブロックはすべてのブロックで実行されます。 SINCEBEFOREのようないくつかの制限キーを指定することで、検索から得られる結果の数を制限することもできます。

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

link to documentation

+0

は上記の提案に基づいてフォローアップQを投稿しました – krapdagn

関連する問題