9

わかりました、私は何時間もそれを吸っています。ruby 1.9 の net/imap.rb は idle コマンドをサポートしていると思っていましたが、まだサポートされていません。

誰かがそれを実装するのを手伝ってくれますか? hereから、私はこれがうまくいくと思いました:

class Net::IMAP
  def idle
    cmd = "IDLE"
    synchronize do
      tag = generate_tag
      put_string(tag + " " + cmd)
      put_string(CRLF)
    end
  end

  def done
    cmd = "DONE"
    synchronize do
      put_string(cmd)
      put_string(CRLF)
    end
  end
end

しかし、それで imap.idle は単に nil を返します。

4

4 に答える 4

8

この古い質問に出くわし、自分で解決したいと思いました。元の質問者は姿を消しました-まあ。

Ruby で IMAP をアイドル状態にする方法は次のとおりです (これは非常にクールです)。これは、元の質問で引用されたブロックと、ドキュメントhereを使用します。

imap = Net::IMAP.new SERVER, :ssl => true
imap.login USERNAME, PW
imap.select 'INBOX'

imap.add_response_handler do |resp|
  # modify this to do something more interesting.
  # called every time a response arrives from the server.
  if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS"
    puts "Mailbox now has #{resp.data} messages"
  end
end

imap.idle  # necessary to tell the server to start forwarding requests.
于 2009-11-30T09:19:42.123 に答える
1

確かに機能していませんか?ソケット経由で送信された文字列を見ましたか?

掘り下げた後、デバッグを有効にしない限り、put_string が nil を返すように見えます。これが imap.idle が nil を返す理由です。

したがって、エラーをスローしていないため、idle メソッドは非常にうまく機能している可能性があります。

それは行動を説明するのに役立ちますか?

デバッグを使用する場合は、使用しますNet::IMAP.debug = true

于 2009-07-02T23:03:29.067 に答える
0

@ピーター

IDLE IMAP ソリューションを拡張する方法について調査しました。私は今、基本的に2つのオプションを考えています。

オプション 1: 連続ループですべてのアカウントのメールをチェックするデーモンを実行します。

オプション 2: すべてのアカウントに対して IDLE 接続を開き、更新を受信します。

私のアプリは複数 (おそらく数千または数十万のアカウント) を扱っているため、オプション 2 は不可能に思えます。私の最善の策は、オプション 1 を使用し、何らかの最大値に達した後にサーバーを複数のワーカーに分割することだと思います。

基本的なコード/アイデアはここで概説されていますhttp://railspikes.com/2007/6/1/rails-email-processing

于 2012-10-03T15:36:23.233 に答える