我是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
答案 0 :(得分:2)
您可以使用slice
仅获得N个结果:
imap.search(["SEEN"]).slice(0, 10).each do |message_id|
...
end
第一个参数(此处为0)指定了起始位置,第二个参数指定了您需要的总数。
注意:基于IMAP的搜索方法的实现,底层调用可能仍然从服务器获取所有消息。
答案 1 :(得分:0)
imap.search
向邮箱发送搜索命令,获取数组或消息序列号。每个块都在所有块上运行。您还可以尝试通过指定一些限制键来限制搜索结果的数量,例如SINCE
和BEFORE
。
imap.search("BEFORE", "30-Jan-2012", "SINCE", "1-Jan-2012")