2011-01-06 6 views
4

Kann mir jemand erklären, wie IMAP IDLE funktioniert? Gibt es für jede Verbindung, die es öffnet, einen neuen Prozess? Kann ich EventMachine irgendwie damit benutzen?Wie IMAP-Leerlauf funktioniert?

Ich versuche, es in Ruby auf Heroku mit Mitarbeitern im Hintergrund zu implementieren. Irgendwelche Gedanken?

+0

Wollen Sie wissen wollen, was IMAP IDLE ist und welche Daten Sie müssten wieder auf die schicken Client wann oder möchten Sie wissen, wie IMAP IDLE in Ihrem vorhandenen IMAP-Server zu implementieren? – dkarp

+0

IMAP IDLE ist ein Teil des IMAP-Protokolls. Also, ja, was hat dkarp gefragt: Willst du wissen, was die Protokollspezifikation ist oder wie man es auf einer Website implementiert (ich vermute, du machst keinen IMAP-Server, weil du über Heroku redest). – henrikhodne

+0

Hier finden Sie eine Antwort: http://StackOverflow.com/a/1818718/459863 –

Antwort

0

IMAP IDLE ist eine Funktion, die Mail-Server-Implementierungen unterstützen können, die Echtzeit-Benachrichtigungen ermöglicht. [Wikipedia]

Der IDLE-Befehl kann mit einem beliebigen IMAP4-Server-Implementierung verwendet werden, die „Leerlauf“, wie er in einem der unterstützten Fähigkeiten der Fähigkeit Befehl gibt.

Der IDLE-Befehl wird vom Client an den Server gesendet, wenn der Client bereit ist, nicht angeforderte Postfachaktualisierungsnachrichten zu akzeptieren. Der Server fordert eine Antwort auf den IDLE-Befehl unter Verwendung der Folgeantwort ("+") an. Der IDLE-Befehl bleibt aktiv, bis der Client auf die Fortsetzung reagiert, und solange ein IDLE-Befehl aktiv ist, kann der Server nun jederzeit unmarkierte EXISTS, EXPUNGE und andere Nachrichten senden.

Der IDLE-Befehl wird durch den Empfang einer "FERTIG" Fortsetzung vom Client beendet; Eine solche Antwort erfüllt die Fortsetzungsanforderung des Servers. [...] Der Client MUSS keinen Befehl senden, während der Server auf den DONE wartet, da der Server einen Befehl nicht von einer Fortsetzung unterscheiden kann.

[RFC 2177 - IMAP4 IDLE command]

6

In Ruby 2.0 oder höher, gibt es eine Leerlaufmethode, die einen Codeblock akzeptiert, die jedes Mal, wenn Sie eine nicht markierte Antwort erhalten genannt werden. Sobald Sie diese Antwort erhalten haben, müssen Sie ausbrechen und die eingehenden E-Mails abrufen. Der Leerlaufanruf blockiert ebenfalls. Sie müssen dies also in einem Thread tun, wenn Sie ihn asynchron halten möchten.

Hier ist eine Probe (@mailbox eine Instanz von Net :: IMAP ist in diesem Fall):

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

danke! endlich hat dein Beispiel meine Meinung geklärt. Ich habe hier ein komplettes Skript geschrieben: https://gist.github.com/solyaris/b993283667f15effa579 –