2009-07-02 12 views
8

Ok, he estado chupado durante horas. Pensé que net/imap.rb con ruby ​​1.9 soportaba el comando inactivo, pero todavía no.Soporte para IMAP IDLE en ruby ​​

¿Alguien puede ayudarme a implementar eso? De here, pensé que esto funcionaría:

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 

Pero imap.idle con que acaba de regresar a cero.

+0

Probé esto con ruby ​​1.8.6 y funcionó perfectamente. – opsb

Respuesta

1

¿Estás seguro de que no está funcionando? ¿Has mirado las cuerdas que ha enviado sobre el zócalo?

Después de hacer algunas excavaciones, parece que put_string devuelve nil a menos que tenga habilitada la depuración, por lo que imap.idle devuelve nil.

Así que su método inactivo podría estar funcionando, ya que no está arrojando errores.

¿Eso ayuda a explicar el comportamiento?

Si desea utilizar depuración, utilice Net::IMAP.debug = true

8

me encontré con esta vieja pregunta y quería resolver por mí mismo. El asker original ha desaparecido, oh bueno.

Aquí se muestra cómo funciona IMAP inactivo en Ruby (esto es genial). Utiliza el bloque citado en la pregunta original y la documentación 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

¿esto renueva la conexión imap antes de que caduque (supuestamente después de 30 minutos)? – ckarbass

+1

@ckarbass: no, no es así. eche un vistazo a mi ejemplo completo de código aquí: http://paste.ly/5wrj. – Peter

+1

@Peter Lo siento, pero su enlace paste.ly está inactivo. ¿Te importaría volver a enviar tu muestra a otro servicio como http://gist.github.com? Me encantaría ver el ejemplo, ya que estoy interesado en la misma pregunta. – Overbryd

0

@Peter

que he hecho algunas investigaciones sobre cómo escalar una solución IMAP IDLE. Básicamente, estoy pensando en 2 opciones.

Opción 1: Ejecute un daemon que compruebe el correo de todas las cuentas en un bucle continuo.

Opción 2: abra una conexión IDLE para cada cuenta y reciba actualizaciones.

Dado que mi aplicación se trata de múltiples (tal vez miles o cientos de miles de cuentas) opción 2 parece una imposibilidad. Creo que mi mejor opción es ir con la opción uno, y luego dividir el servidor en varios trabajadores después de alcanzar algún tipo de máximo.

El código/idea básica aquí se ha delineado http://railspikes.com/2007/6/1/rails-email-processing

+0

He estado trabajando para obtener IDLE trabajando con Gmail en una aplicación de Rails desde hace un tiempo, estoy haciendo algo muy similar a: https://gist.github.com/jem/2783772 - Sin embargo , causa todo tipo de problemas cuando los trabajadores se reinician, etc. Las cosas comienzan a ponerse muy agitadas con todos los hilos. Desde su respuesta, ¿ha tenido alguna suerte al hacer que IDLE trabaje con muchos usuarios? ¿Alguna sugerencia, trucos o sugerencias? – Domness