9

好吧,我已经吸了好几个小时了。我认为 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 只是返回 nil。

4

4 回答 4

8

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

以下是在 Ruby 上让 IMAP 空闲的方法(这太酷了)。这使用原始问题中的引用块,以及此处的文档。

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.
于 2009-11-30T09:19:42.123 回答
1

你确定它不起作用?您是否查看过它通过套接字发送的字符串?

在进行了一些挖掘之后,除非您启用了调试,否则 put_string 似乎返回 nil,这就是 imap.idle 返回 nil 的原因。

因此,您的 idle 方法可能会很好地工作,因为它不会引发错误。

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

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

于 2009-07-02T23:03:29.067 回答
0

@彼得

我已经对如何扩展 IDLE IMAP 解决方案进行了一些研究。我现在基本上在考虑两个选项。

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

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

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

此处概述了基本代码/想法http://railspikes.com/2007/6/1/rails-email-processing

于 2012-10-03T15:36:23.233 回答
0

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

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

顺便说一句,欢迎评论。

于 2014-12-13T16:19:00.000 回答