2011-01-06 5 views
4

誰かがIMAP IDLEの仕組みを説明できますか?それはそれが開く各接続のための新しいプロセスをフォークしますか?どういうわけかイベントマシンを使ってもいいですか?IMAPアイドルはどのように機能しますか?

私はそれをバックグラウンドワーカーと英雄のルビーに実装しようとしています。何かご意見は?

+0

は、あなたがIMAP IDLEが何であるかを知りたいですし、あなたが戻って送信するためにどのようなデータが必要と思います。ここでは

は(@mailboxは、このケースではNet :: IMAPのインスタンスである)のサンプルですクライアント、または既存のIMAPサーバーにIMAP IDLEを実装する方法を知りたい場合は、 – dkarp

+0

IMAP IDLEはIMAPプロトコルの一部です。だから、dkarpが尋ねたこと:プロトコル仕様が何であるか、それをウェブサイトに実装する方法を知りたいのですか(私はあなたが英雄について話しているのでIMAPサーバーを作っていないと思います)。 – henrikhodne

+0

答えを見る:http://stackoverflow.com/a/1818718/459863 –

答えて

0

IMAP IDLEは、リアルタイム通知を可能にするメールサーバーの実装がサポートできる機能です。 【Wikipedia]

IDLEコマンドはCAPABILITYコマンドにサポートされる機能の一つとして、「IDLE」を返す任意のIMAP4サーバの実装で使用することができます。

クライアントが未承諾のメールボックス更新メッセージを受け入れる準備ができたら、IDLEコマンドはクライアントからサーバーに送信されます。サーバーは、継続( "+")応答を使用してIDLEコマンドへの応答を要求します。 IDLEコマンドは、クライアントが継続に応答するまでアクティブのままであり、IDLEコマンドがアクティブである限り、サーバーはいつでもタグなしEXISTS、EXPUNGE、およびその他のメッセージを自由に送信できます。

IDLEコマンドは、クライアントからの「DONE」継続の受信によって終了します。そのような応答はサーバの継続要求を満たす。 [...]サーバは、コマンドが継続とコマンドを区別できないため、サーバが完了を待っている間にコマンドを送信してはならない(MUST NOT)。ルビー2.0とアップで

[RFC 2177 - IMAP4 IDLE command]

6

、あなたがタグなしの応答を取得するたびに呼び出されるコードブロックを受け入れるアイドル方法があります。この応答が得られたら、入ってきた電子メールを取り出してプルする必要があります。アイドルコールもブロックされているため、非同期にするにはスレッド内でこれを行う必要があります。

def start_listener() 
    @idler_thread = Thread.new do 
     # Run this forever. You can kill the thread when you're done. IMAP lib will send the 
     # DONE for you if it detects this thread terminating 
     loop do 
      begin 
       @mailbox.select("INBOX") 
       @mailbox.idle do |resp| 
        # You'll get all the things from the server. For new emails you're only 
        # interested in EXISTS ones 
        if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS" 
         # Got something. Send DONE. This breaks you out of the blocking call 
         @mailbox.idle_done 
        end 
       end 
       # We're out, which means there are some emails ready for us. 
       # Go do a seach for UNSEEN and fetch them. 
       process_emails() 
      rescue Net::IMAP::Error => imap_err 
       # Socket probably timed out 
      rescue Exception => gen_err 
       puts "Something went terribly wrong: #{e.messsage}" 
      end 
     end 
    end 
end 
+0

ありがとう!ついにあなたの事例が私の心を取り戻しました。私はちょうどここに完全なスクリプトを書いた:https://gist.github.com/solyaris/b993283667f15effa579 –

関連する問題