ConradIrwin / em-imap

An event machine based IMAP client
MIT License
69 stars 31 forks source link

Listener active even after stopped ? #5

Open gkrcode opened 12 years ago

gkrcode commented 12 years ago

Hi,


require 'em-imap'

EM.run do

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

    client.connect.bind! do
        client.login("some_gmail_user_id@gmail.com","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 commented 12 years ago

@ConradIrwin any help ?

ConradIrwin commented 12 years ago

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.

gkrcode commented 12 years ago

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 :)

nazarhussain commented 11 years ago

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?

gkrcode commented 11 years ago

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

nazarhussain commented 11 years ago

@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