好的,我已经好几个小时了。我认为带有ruby 1.9的net / imap.rb支持idle命令,但还没有。
任何人都可以帮我实现吗?从here开始,我会这样做:
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
但是imap.idle只是返回nil。
答案 0 :(得分:8)
我遇到了这个老问题,想自己解决。原来的提问者已经消失了 - 哦,好吧。
以下是如何使用IMAP闲置Ruby(这非常酷)。这使用原始问题中的引用块和文档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.
答案 1 :(得分:1)
你确定它不起作用吗?你看过它通过套接字发送的字符串吗?
在进行一些挖掘后,看起来put_string返回nil,除非你启用了调试,这就是为什么imap.idle返回nil。
所以你的空闲方法很可能正常工作,因为它不会抛出错误。
这有助于解释这种行为吗?
如果您想使用调试,请使用Net::IMAP.debug = true
答案 2 :(得分:0)
@Peter
我已经就如何扩展IDLE IMAP解决方案做了一些研究。我现在基本上考虑了两种选择。
选项1:运行一个守护程序,在连续循环中检查所有帐户的邮件。
选项2:为每个帐户打开IDLE连接并接收更新。
由于我的应用程序处理多个(可能是数千或数十万个帐户),因此选项2似乎是不可能的。我认为我最好的选择是使用选项一,然后在达到某种最大值后将服务器分成多个工作人员。
这里列出了基本代码/想法http://railspikes.com/2007/6/1/rails-email-processing
答案 3 :(得分:0)
使用Ruby 2.x: 这个解决方案由mzolin的代码块描述: https://stackoverflow.com/a/21345164/1786393
我刚刚写了一个完整的(但仍然是草稿)脚本来获取看不见的邮件 https://gist.github.com/solyaris/b993283667f15effa579
顺便说一下,评论欢迎。