在ruby中支持IMAP IDLE

时间:2009-07-02 19:01:36

标签: ruby-on-rails ruby imap

好的,我已经好几个小时了。我认为带有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。

4 个答案:

答案 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

顺便说一下,评论欢迎。