在ruby中支持IMAP IDLE

好吧,我已经好几个小时了。 我认为带有ruby 1.9的net / imap.rb支持idle命令,但还没有。

任何人都可以帮我实现吗? 从这里开始 ,我会这样做:

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只是返回零。

我遇到了这个老问题,想自己解决。 原来的提问者已经消失了 – 哦。

以下是如何使用IMAP闲置Ruby(这非常酷)。 这使用原始问题中的引用块和此处的文档。

 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. 

你确定它不起作用吗? 你看过它通过套接字发送的字符串了吗?

在进行一些挖掘之后,看起来put_string返回nil,除非你启用了调试,这就是为什么imap.idle返回nil。

所以你的空闲方法很可能正常工作,因为它不会抛出错误。

这有助于解释这种行为吗?

如果要使用debug,请使用Net::IMAP.debug = true

@Peter

我已经做了一些关于如何扩展IDLE IMAP解决方案的研究。 我现在基本上考虑了两种选择。

选项1:运行一个守护程序,在连续循环中检查所有帐户的邮件。

选项2:为每个帐户打开IDLE连接并接收更新。

由于我的应用程序处理多个(可能是数千或数十万个帐户),因此选项2似乎是不可能的。 我认为我最好的选择是使用选项一,然后在达到某种最大值之后将服务器分成多个工作人员。

基本代码/想法在此处列出http://railspikes.com/2007/6/1/rails-email-processing

使用Ruby 2.x:解决方案由mzolin的代码块描述: https ://stackoverflow.com/a/21345164/1786393

我刚刚写了一个完整的(但仍然是草稿)脚本来获取看不见的邮件https://gist.github.com/solyaris/b993283667f15effa579

顺便说一下,欢迎评论。