在 IMAP 中,消息编号基于消息何时放入文件夹(即文件夹中的第一条消息为 1,第二条消息为 2,依此类推)。但是,此排序不考虑消息的接收日期。我关心的是早于文件夹的消息编号 1 的消息,即用户手动将消息移动到文件夹中的消息(而不是在系统收到消息时)。
我不能只获取每条消息的接收日期,因为这非常低效。
我想我可以进行 JavaMail 搜索以获取所有接收日期比第一条消息的接收日期早的消息,(同样地然后进行搜索以获取接收日期比第一条消息的接收日期新的所有消息...这会很多,但是虽然我需要处理所有旧的,但我只需要处理一些较新的一个,(按照流程,我的意思是下载它的标题)。
但是,当我使用搜索时,它似乎无法正常工作。
Message[] messages = csqFolder.getMessages();
if (messages != null && messages.length > 0) {
Date receivedDate = messages[0].getReceivedDate();
log.trace("Message 1 receivedDate: <" + receivedDate.toString() + ">");
SearchTerm msgsOlderThanOETFirst =
new ReceivedDateTerm(DateTerm.LT, receivedDate);
SearchTerm msgsNewerThanFirst =
new ReceivedDateTerm(DateTerm.GT, receivedDate);
Message[] oldMsgs = csqFolder.search(msgsOlderThanOETFirst, messages);
log.trace("Size of oldMsgs: <" + oldMsgs.length + ">");
Message[] newMsgs = csqFolder.search(msgsNewerThanFirst, messages);
log.trace("Size of newMsgs: <" + newMsgs.length + ">");
但是,当我运行这些搜索时,它似乎没有给出正确的结果。
在一个包含 8 条消息的文件夹中,其中 7 条消息的接收日期时间是 8 月 5 日中午 12:00 左右,但文件夹中的第一条消息是 8 月 5 日下午 4:00,我们将看到以下:
Message 1 receivedDate: <Fri Aug 05 16:46:57 CDT 2011>
Size of oldMsgs: <0>
Size of newMsgs: <7>
但是,所有剩余的七条消息都比第一条消息旧......它们应该都在 oldMsgs 中。
就是说,如果我将前一天(8 月 4 日)的消息放在该文件夹中,那么搜索将正常工作……只针对那条消息。这就像搜索只在一天一天的基础上进行,而不是精确到秒......
我应该注意到,在术语 msgsOlderThanOETFirst 中,我最初使用的是 LE(因此得名),但是,这会翻转上面的结果——然后所有消息都会在 oldMsgs 中找到。
其他人能否确认此行为是否属实,如果属实,是否表明 Java 中存在错误?
我试图查看搜索的源代码,但我认为我得到的是它的命令行版本,而不是 javamail 包使用的那种....
我使用的是带有 SP1 的 MS Exchange 2007 和 JavaMail 1.4.3。
感谢您的任何建议。
更新:我认为我对比较器顺序的解读没有错。查看以下线程中给出的答案:java imap fetch messages since a date
假设我们使用该答案,并且我们的边界是从 7/15/2011 到 9/15/2011。然后我们搜索比较给定日期 8/4/2011 的消息。然后我们将有以下内容:
8/4/2011 < 9/15/2011
SearchTerm olderThen = new ReceivedDateTerm(ComparisonTerm.LT, someFutureDate);
SearchTerm newerThen = new ReceivedDateTerm(ComparisonTerm.GT, somePastDate);
8/4/2011 > 7/15/2011
在这两种情况下,这将评估为 true,这是我们所期望的,因为日期在所需范围内。
同样,我的代码如下:
SearchTerm msgsOlderThanOETFirst = 8/4/2011 < 8/5/2011
new ReceivedDateTerm(DateTerm.LT, receivedDate); --> TRUE
SearchTerm msgsNewerThanFirst = 8/4/2011 > 8/5/2011
new ReceivedDateTerm(DateTerm.GT, receivedDate); --> FALSE
以上对 TRUE 和 FALSE 的评价是我所期望的,并将收到。但是,如果我们在 2011 年 8 月 5 日 12:00:00 获取给定消息,我们会得到以下信息:
SearchTerm msgsOlderThanOETFirst = 8/5/2011 12:00:00 < 8/5/2011 16:46:00
new ReceivedDateTerm(DateTerm.LT, receivedDate); --> TRUE?
SearchTerm msgsNewerThanFirst = 8/4/2011 12:00:00 > 8/5/2011 16:46:00
new ReceivedDateTerm(DateTerm.GT, receivedDate); --> FALSE?
除了,不——我们不明白——相反,我们得到了相反的结果……在这一点上很容易认为自己在圈子里,但是……我已经仔细检查了这几个次。 JavaMail 有问题吗,还是我完全糊涂了?如果是后者,请指正我的困惑!
最佳答案
根据 JM 开发人员 Bill Shannon 的说法,这是 IMAP 协议(protocol)的限制:
from Bill Shannon
to Jonathan Hanson
cc javamail_ww@oracle.com
date Wed, Aug 10, 2011 at 11:55 AM
subject Re: Bug with searching by ReceivedDateTerms
mailed-by oracle.com
Important mainly because of your interaction with messages in the conversation.
hide details 11:55 AM (16 minutes ago)
The searching is being done by the IMAP server, and you're running into a limitation of the IMAP protocol.
关于按 ReceivedDate 搜索 JavaMail,不能精确到秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6963256/
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是rubygems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和rubygems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko
我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/
print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上
我读了"BingSearchAPI-QuickStart"但我不知道如何在Ruby中发出这个http请求(Weary)如何在Ruby中翻译“Stream_context_create()”?这是什么意思?"BingSearchAPI-QuickStart"我想使用RubySDK,但我发现那些已被弃用前(Rbing)https://github.com/mikedemers/rbing您知道Bing搜索API的最新包装器(仅限Web的结果)吗? 最佳答案 好吧,经过一个小时的挫折,我想出了一个办法来做到这一点。这段代码很糟糕,因为它是
我对此有点困惑。我在RoR项目中的最终目标是从我的数据库中获取单个随机配置文件。我想它应该是这样的:@profile=Profile.find_by_user_id(rand(User.count))它一直抛出错误,因为user_id0不存在,所以我把它的一部分拿出来检查发生了什么:@r=rand(User.count)每次都返回0。发生什么了?我注册了5个假用户和5个相关配置文件来测试这个。如果我将Profile.find_by_user_id(rand(User.count))重写为Profile.find_by_user_id(3)它工作得很好。User.count也在工作。所以
给定一个元素和一个数组,Ruby#index方法返回元素在数组中的位置。我使用二进制搜索实现了我自己的索引方法,期望我的方法会优于内置方法。令我惊讶的是,内置的在实验中的运行速度大约是我的三倍。有Rubyist知道原因吗? 最佳答案 内置#indexisnotabinarysearch,这只是一个简单的迭代搜索。但是,它是用C而不是Ruby实现的,因此自然可以快几个数量级。 关于Ruby#index方法VS二进制搜索,我们在StackOverflow上找到一个类似的问题:
这个问题困扰了我一段时间。这不是一件困难的事情,但我不知道为什么没有简单的方法来做到这一点,我敢打赌有但我没有看到。我只想取一个散列,像这样:cars={:bob=>'Pontiac',:fred=>'Chrysler',:lisa=>'Cadillac',:mary=>'Jaguar'}然后做类似的事情cars[:bob,:lisa]得到{:bob=>'Pontiac',:lisa=>'Cadillac'}我这样做了,效果很好:classHashdefpick(*keys)Hash[select{|k,v|keys.include?(k)}]endendruby-1.8.7-p249
在纯Rubyirb中,不能输入{if:1}。该语句不会终止,因为irb认为if不是符号,而是if语句的开始。那么为什么Rails可以有before_filter接受if作为参数?该指南的代码如下:classOrderunless也会发生同样的事情。 最佳答案 这是一个irb问题,而不是Ruby。bash=>ruby-e"puts({if:1})"bash=#{:if=>1}您可以改用pry。它将正确读取输入。https://github.com/pry/pry 关于ruby-on-rai
Enumerable#each和Enumerable#map的区别在于返回的是接收者还是映射后的结果。回到接收者是微不足道的,你通常不需要在each之后继续一个方法链,比如each{...}.another_method(我可能没见过这样的案例。即使你想回到接收者那里,你也可以通过tap来实现)。所以我认为所有或者大部分使用Enumerable#each的情况都可以用Enumerable#map代替。我错了吗?如果我是对的,each的目的是什么?map是否比each慢?编辑:我知道当您对返回值不感兴趣时使用each是一种常见的做法。我对这种做法是否存在不感兴趣,但感兴趣的是,除了从