2009-07-02 14 views
8

Ok, ich habe seit Stunden daran saugen. Ich dachte net/imap.rb mit Ruby 1.9 unterstützt den Leerlauf-Befehl, aber noch nicht.Unterstützung für IMAP IDLE in Rubin

Kann mir jemand bei der Umsetzung helfen? Von here, obwohl ich dies funktionieren würde:

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 

Aber imap.idle mit diesen nur Null zurück.

+0

Versuchte dies mit Ruby 1.8.6 und es funktionierte perfekt. – opsb

Antwort

1

Sind Sie sicher, dass es nicht funktioniert? Haben Sie sich die Saiten angesehen, die über den Sockel gesendet wurden?

Nach einigen Grabarbeiten sieht es so aus, als ob put_string null zurückgibt, es sei denn, Sie haben debug aktiviert, weshalb imap.idle den Wert nil zurückgibt.

So könnte Ihre Idle-Methode sehr gut funktionieren, da es keine Fehler wirft.

Hilft das das Verhalten zu erklären?

Wenn Sie Debug verwenden möchten, verwenden Net::IMAP.debug = true

8

ich auf diese alte Frage kam und wollte es selbst lösen. Der ursprüngliche Asker ist verschwunden - na ja.

Hier ist, wie Sie IMAP im Leerlauf arbeiten auf Ruby (das ist super cool). Dies verwendet den zitierten Block in der ursprünglichen Frage und die Dokumentation 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. 
+0

erneuert dies die IMAP-Verbindung vor Ablauf (angeblich nach 30 Minuten)? – ckarbass

+1

@ckarbass: nein, tut es nicht. Sehen Sie sich mein vollständiges Codebeispiel hier an: http://paste.ly/5wrj. – Peter

+1

@Peter Es tut mir leid, aber Ihr paste.ly-Link ist nicht verfügbar. Würde es Ihnen etwas ausmachen, Ihre Probe erneut an einen anderen Dienst wie http://gist.github.com zu senden? Ich würde gerne das Beispiel sehen, da ich mich für genau die gleiche Frage interessiere. – Overbryd

0

@ Peter

Ich habe einige Nachforschungen gemacht, wie eine IDLE IMAP Lösung zu skalieren. Ich denke jetzt im Wesentlichen an 2 Optionen.

Option 1: Führen Sie einen Daemon aus, der die E-Mails für alle Konten in einer Endlosschleife überprüft.

Option 2: Öffnen Sie eine IDLE-Verbindung für jedes Konto und erhalten Sie Updates.

Da meine App mit mehreren (vielleicht Tausende oder Hunderttausende von Konten) beschäftigt ist, scheint Option 2 eine Unmöglichkeit zu sein. Ich denke, meine beste Wette ist, mit Option eins zu gehen und dann den Server in mehrere Arbeiter zu zerlegen, nachdem ich eine Art Maximum erreicht habe.

Der Grundcode/Idee skizziert hier http://railspikes.com/2007/6/1/rails-email-processing

+0

Ich arbeite seit einiger Zeit daran, IDLE mit Google Mail in einer Rails-App arbeiten zu lassen. Ich mache etwas ganz ähnliches: https://gist.github.com/jem/2783772 - Allerdings Es verursacht alle möglichen Probleme, wenn Mitarbeiter neu gestartet werden, usw. Die Dinge beginnen mit allen Threads ziemlich hektisch zu werden. Haben Sie seit Ihrer Antwort Glück gehabt, IDLE mit vielen Benutzern zu arbeiten? Irgendwelche Tipps, Tricks oder Vorschläge? – Domness