2009-07-02 2 views
8

Ok, tôi đã hút nó hàng giờ liền. Tôi nghĩ net/imap.rb với ruby ​​1.9 hỗ trợ lệnh nhàn rỗi, nhưng chưa.Hỗ trợ IMAP IDLE trong ruby ​​

Có ai có thể giúp tôi thực hiện điều đó không? Từ here, tôi mặc dù điều này sẽ hoạt động:

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 

Nhưng imap.idle với điều đó chỉ trả về 0.

+0

Đã thử điều này với ruby ​​1.8.6 và nó hoạt động hoàn hảo. – opsb

Trả lời

1

Bạn có chắc nó không hoạt động? Bạn đã xem các chuỗi nó đã gửi qua ổ cắm chưa?

Sau khi thực hiện một số thao tác đào, có vẻ như put_string trả về nil trừ khi bạn đã bật gỡ lỗi, đó là lý do tại sao imap.idle trả về nil.

Vì vậy, phương thức nhàn rỗi của bạn có thể hoạt động rất tốt vì nó không phải là lỗi.

Điều đó có giúp giải thích hành vi không?

Nếu bạn muốn sử dụng debug, sử dụng Net::IMAP.debug = true

8

Tôi đã xem qua câu hỏi cũ này và muốn giải quyết nó bản thân mình. Người hỏi ban đầu đã biến mất - ồ.

Dưới đây là cách bạn nhận IMAP không hoạt động trên Ruby (điều này cực kỳ thú vị). Điều này sử dụng khối được trích dẫn trong câu hỏi gốc và tài liệu 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

thực hiện việc này làm mới kết nối imap trước khi nó hết hạn (được cho là sau 30 phút)? – ckarbass

+1

@ckarbass: không, không. có một cái nhìn tại ví dụ mã hoàn chỉnh của tôi ở đây: http://paste.ly/5wrj. – Peter

+1

@Peter Tôi xin lỗi, nhưng liên kết paste.ly của bạn bị hỏng. Bạn có nhớ gửi lại mẫu của mình tới một dịch vụ khác như http://gist.github.com không? Tôi rất muốn xem ví dụ, vì tôi quan tâm đến cùng một câu hỏi. – Overbryd

0

@ Peter

tôi đã thực hiện một số nghiên cứu về cách mở rộng quy mô một giải pháp IMAP IDLE. Bây giờ tôi đang nghĩ về 2 lựa chọn.

Tùy chọn 1: Chạy daemon kiểm tra thư cho tất cả tài khoản trên một vòng lặp liên tục.

Tùy chọn 2: Mở kết nối IDLE cho mọi tài khoản và nhận cập nhật.

Vì ứng dụng của tôi đang xử lý nhiều (có lẽ hàng nghìn hoặc hàng trăm nghìn tài khoản), tùy chọn 2 có vẻ như không thể. Tôi nghĩ rằng đặt cược tốt nhất của tôi là đi với tùy chọn một, và sau đó phá vỡ các máy chủ thành nhiều công nhân sau khi nhấn một số loại tối đa.

Mã/ý tưởng cơ bản được nêu ở đây http://railspikes.com/2007/6/1/rails-email-processing

+0

Tôi đã làm việc để IDLE hoạt động với Gmail trên ứng dụng Rails trong một thời gian, tôi đang làm một việc khá giống với: https://gist.github.com/jem/2783772 - Tuy nhiên , nó gây ra tất cả các loại vấn đề khi công nhân khởi động lại, vv Mọi thứ bắt đầu trở nên khá bận rộn với tất cả các chủ đề. Vì câu trả lời của bạn, bạn có may mắn khi nhận IDLE để làm việc với nhiều người dùng không? Bất kỳ mẹo, thủ thuật hoặc đề xuất nào? – Domness