2009-07-02 9 views
8

Ok, je l'ai sucé pendant des heures. Je pensais que net/imap.rb avec ruby ​​1.9 supportait la commande idle, mais pas encore.Support pour IMAP IDLE en ruby ​​

Quelqu'un peut-il m'aider à mettre en œuvre cela? De here, je pensais que cela fonctionnerait:

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 

Mais imap.idle ce juste retour nul.

+0

Essayé avec ruby ​​1.8.6 et cela a fonctionné parfaitement. – opsb

Répondre

1

Etes-vous sûr que cela ne fonctionne pas? Avez-vous regardé les chaînes qu'il a envoyées sur le socket? Après avoir creusé, il semble que put_string renvoie zéro à moins que vous n'ayez activé le débogage, ce qui explique pourquoi imap.idle renvoie zéro.

Votre méthode inactive peut très bien fonctionner car elle ne génère pas d'erreurs.

Est-ce que cela aide à expliquer le comportement?

Si vous souhaitez utiliser le débogage, utilisez Net::IMAP.debug = true

8

je suis tombé sur cette vieille question et je voulais résoudre moi-même. Le demandeur original a disparu - eh bien.

Voici comment vous pouvez faire fonctionner IMAP au ralenti sur Ruby (c'est super cool). Cela utilise le bloc cité dans la question d'origine et la documentation 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

cela renouvelle-t-il la connexion imap avant son expiration (supposément après 30 minutes)? – ckarbass

+1

@ckarbass: non, ce n'est pas le cas. Jetez un oeil à mon exemple de code complet ici: http://paste.ly/5wrj. – Peter

+1

@Peter Je suis désolé, mais votre lien paste.ly est en panne. Pourriez-vous renvoyer votre échantillon à un autre service comme http://gist.github.com? J'aimerais voir l'exemple, car je m'intéresse à la même question. – Overbryd

0

@Peter

Je l'ai fait des recherches sur la façon dont à l'échelle d'une solution IMAP IDLE. Je pense maintenant essentiellement à deux options. Option 1: Exécutez un démon qui vérifie le courrier pour tous les comptes sur une boucle continue.

Option 2: Ouvrez une connexion IDLE pour chaque compte et recevez des mises à jour.

Depuis que mon application traite plusieurs (peut-être des milliers ou des centaines de milliers de comptes), l'option 2 semble être une impossibilité. Je pense que mon meilleur pari est d'aller avec l'option un, et ensuite diviser le serveur en plusieurs travailleurs après avoir atteint une sorte de maximum.

Le code de base/idée est décrit ici http://railspikes.com/2007/6/1/rails-email-processing

+0

J'ai travaillé sur le fait de travailler avec Gmail sur une application Rails pendant un moment maintenant, je fais quelque chose de très similaire à: https://gist.github.com/jem/2783772 - Cependant , il provoque toutes sortes de problèmes lorsque les travailleurs redémarrent, etc. Les choses commencent à devenir assez mouvementé avec tous les threads. Depuis votre réponse, avez-vous eu de la chance avec IDLE de travailler avec de nombreux utilisateurs? Des conseils, astuces ou suggestions? – Domness