9
votes

Soutien pour iMap inactif dans Ruby

OK, j'ai été sucé pendant des heures. Je pensais net / imap.rb avec Ruby 1.9 soutenait la commande inactive, mais pas encore.

Quelqu'un peut-il m'aider à mettre en œuvre cela? De ici , je le ferais: P>

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


1 commentaires

Essayé cela avec Ruby 1.8.6 et cela fonctionnait parfaitement.


4 Réponses :


1
votes

Êtes-vous sûr que cela ne fonctionne pas? Avez-vous regardé les chaînes qu'il a envoyées sur la prise?

Après avoir fait des creuser, il ressemble à Put_string retourne nil à moins que vous n'ayez débogué activé, c'est pourquoi IMAP.Idle retourne nil.

Donc, votre méthode inactive pourrait très bien fonctionner car elle ne lance pas d'erreurs.

Cela aide-t-il à expliquer le comportement?

Si vous souhaitez utiliser le débogage, utilisez net :: imap.debug = true


0 commentaires

8
votes

Je suis tombé sur cette ancienne question et je voulais résoudre moi-même moi-même. L'adresseur d'origine a disparu - oh bien.

Voici comment vous obtenez IMAP inactif travaillant sur Ruby (c'est super cool). Cela utilise le bloc cité dans la question initiale et la documentation ICI . P>

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.


8 commentaires

Cela renouvelle-t-il la connexion IMAP avant son expiration (soi-disant après 30 minutes)?


@CKARBASS: Non, ça ne le fait pas. Regardez mon exemple de code complet ici: Paste.ly/5wrj .


@Peter, je suis désolé, mais votre pâte.ly lien est en panne. Souhaitez-vous séduire votre échantillon à un autre service comme gist.github.com ? J'aimerais voir l'exemple, comme je suis intéressé par la même question.


@Overbryd Vous non sûr, si cela est de 1000 ans trop tard, mais: gist.github.com/2783772


Hey, c'est génial! @Peter Avez-vous un aperçu de la manière dont cette solution échoue avec plusieurs utilisateurs?


@Andrew - Malheureusement, je ne connais pas de détails sur la mise à l'échelle. Revenez dans une fois que vous avez fait! :)


@Peter - J'ai posté comme réponse ci-dessous pour que je ne sois pas obstruer ce fil de commentaire.


Lire Ruby 2.1 Documentation, je pense que la réponse ici est obsolète ou fausse; voir ma réponse ci-dessous



0
votes

@peter

J'ai fait des recherches sur la manière de faire échec une solution IDLE IMAP. Je pense maintenant essentiellement à 2 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 inactive pour chaque compte et recevoir des mises à jour.

Étant donné que mon application s'occupe de plusieurs (peut-être des milliers de milliers de comptes), l'option 2 semble une impossibilité. Je pense que mon meilleur pari est d'aller avec l'option une, puis de casser le serveur en plusieurs travailleurs après avoir frappé une sorte de maximum.

Le code de base / idée est décrit ici http://railpikes.com/ 2007/6/1 / rails-traitement par courrier électronique


1 commentaires

Je travaille sur le fait de faire du ralenti avec Gmail sur une application Rails depuis un moment maintenant, je fais quelque chose de très semblable à: Gist.Github.com/jem/2783772 - Cependant, il provoque toutes sortes de problèmes lorsque les travailleurs redémarrent, etc. Les choses commencent à devenir assez hectiques avec tous les threads. Depuis votre réponse, avez-vous eu de la chance de faire du ralenti à travailler avec beaucoup d'utilisateurs? Des conseils, des astuces ou des suggestions?



0
votes

avec Ruby 2.x: La solution est décrite par le morceau de code de Mzolin ici: https://stackoverflow.com/a/21345164/1786393

Je viens d'écrire un script complet (mais toujours brouillon) pour chercher des mails invisibles ici https://gist.github.com/solyaris/b993283667f15effa579

BTW, commentaires Bienvenue.


0 commentaires