em-imap icon indicating copy to clipboard operation
em-imap copied to clipboard

Listener active even after stopped ?

Open gkrcode opened this issue 12 years ago • 6 comments

Hi,


require 'em-imap'

EM.run do

    client = EM::IMAP.new("imap.gmail.com",993,true)

    client.connect.bind! do
        client.login("[email protected]","some_gmail_password")
    end.bind! do
        client.select("INBOX")
    end.bind! do
        idler = client.idle

        idler.listen do |response|
            if (response == "stop" rescue nil)
                puts "Stop"
                idler.stop
                idler.callback do
                    puts "Stop: Callback"
                end             
            elsif (response == "start" rescue nil)
                puts "Still Listening"          
            elsif (response.name == "EXISTS" rescue nil)
                puts "Ooh, new emails!"
                idler.stop
                idler.callback do
                    # ... process new emails
                end
            end
        end.errback do |e|
            puts "Idler recieved an error: #{e}"
        end

        EM.add_periodic_timer(2) do
            idler.receive_event "start"
        end 

        EM.add_timer(6) do
            idler.receive_event "stop"
        end 

    end
end

Output:

Still Listening Still Listening Stop Still Listening Stop: Callback Still Listening Still Listening Still Listening Still Listening ... ... ...

Listener is active even after stopped, is this normal behavior ?

Thanks

gkrcode avatar Apr 16 '12 09:04 gkrcode

@ConradIrwin any help ?

gkrcode avatar May 09 '12 06:05 gkrcode

Hi @gkrcode,

This was actually intentional. If you're using the listener API you should add a .stopback{} that cleans up your event senders.

The IDLE command relies on this behaviour because if it stopped receiving events after you call .stop, it would never internally hear the "command OK" response in order to be able to .succeed.

That said, it's pretty confusing... Maybe I should rethink how it is structured.

ConradIrwin avatar May 13 '12 20:05 ConradIrwin

Thanks @ConradIrwin,

If you're using the listener API you should add a .stopback{} that cleans up your event senders.

I don't get it please share a code sample.

That said, it's pretty confusing... Maybe I should rethink how it is structured.

+1 Looking forward :)

gkrcode avatar May 14 '12 03:05 gkrcode

Hi @gkrcode

Have you found the solution for this issue? And one more question to you how can we actually get emails within idle.callback block? It is giving <struct Net::IMAP::TaggedResponse tag="RUBY0003", name="OK", data=#<struct Net::IMAP::ResponseText code=nil, text="IDLE terminated (Success)">, raw_data="RUBY0003 OK IDLE terminated (Success)\r\n"> but I don't know how can I get actual email from this response?

nazarhussain avatar Nov 19 '12 10:11 nazarhussain

Hi @nazarhussain , I am no longer using em-imap :(

gkrcode avatar Nov 19 '12 14:11 gkrcode

@gkrcode Do you find any alternate for it? I want to achieve this task, if you can guide me in it. https://github.com/ConradIrwin/em-imap/issues/7

nazarhussain avatar Nov 19 '12 14:11 nazarhussain