如何使用Ruby IMAP限制使用条件

时间:2012-02-21 03:42:15

标签: ruby imap

我是Ruby的超级新手,并且在玩IMAP库。下面的程序似乎工作,但它会一直持续到加载所有消息。如何将输出限制为X个消息,比如我只想显示10个?我想这是某种“if envelope =” - 但不知道该放什么。谢谢!

require 'net/imap'
imap = Net::IMAP.new('mail.domain.com')
imap.authenticate('LOGIN', ' ', ' ')
imap.examine('INBOX')
imap.search(["SEEN"]).each do |message_id|
  envelope = imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"]
  puts "#{envelope.from[0].name}: \t#{envelope.subject}"
end

不确定这里是否合适,或者我是否应该提出新问题,但是使用下面的“SINCE”提示,我将如何显示所有电子邮件(数组中的元素)的提取数量?

imap.examine('INBOX')
  imap.search(["SINCE", "17-Feb-2012"]).each do |message_id| 
  envelope = imap.fetch(message_id, "ENVELOPE")[0].attr["ENVELOPE"]
  puts "#{envelope.from[0].name}: \t#{envelope.subject}"
   puts "#{envelope.count}"
  end

无论返回的电子邮件数量多少,上面都会在每行之后输入数字10。我怎么样a)只将结果放在列出的所有电子邮件的末尾,b)找到数组中元素的真实计数?

好的,弄明白第二部分:

require 'net/imap'
imap = Net::IMAP.new('mail.domain.com')
imap.authenticate('LOGIN', 'username', 'password')
imap.examine('INBOX')
mail_count = imap.search(["SINCE", "20-Feb-2012"]) 
puts mail_count.count

2 个答案:

答案 0 :(得分:2)

您可以使用slice仅获得N个结果:

imap.search(["SEEN"]).slice(0, 10).each do |message_id|
  ...
end

第一个参数(此处为0)指定了起始位置,第二个参数指定了您需要的总数。

注意:基于IMAP的搜索方法的实现,底层调用可能仍然从服务器获取所有消息。

答案 1 :(得分:0)

imap.search向邮箱发送搜索命令,获取数组或消息序列号。每个块都在所有块上运行。您还可以尝试通过指定一些限制键来限制搜索结果的数量,例如SINCEBEFORE

imap.search("BEFORE", "30-Jan-2012", "SINCE", "1-Jan-2012") 

link to documentation