当前位置: 首页 > 面试题库 >

通过ReceivedDate进行JavaMail搜索,不能工作到第二个吗?

凤经国
2023-03-14
问题内容

在IMAP中,消息编号基于何时将消息放入文件夹(即,文件夹中的第一条消息为1,第二条消息中的消息为2,依此类推)。但是,此排序不考虑邮件的接收日期。我关心的是早于文件夹的消息号1的消息,即,一条消息是由用户手动移动到文件夹中的(而不是何时被接收到系统中)。

我不能只获取每条消息的receiveDate,因为这太糟糕了。

以为 我可以执行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 pm,但在该文件夹中的第一条消息是8月5日4:00 pm时,我们将看到以下内容:

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软件包使用的那种版本。

我正在使用MS Exchange 2007 SP1和JavaMail 1.4.3。

感谢您的任何建议。

更新: 我不认为我对比较器指令的读取是错误的。查看以下线程中给出的答案:javaimap自日期以来获取消息

假设我们使用该答案,并且我们的边界从2011年7月15日到2011年9月15日。然后,我们将给定日期为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

由于日期在期望的范围内,因此在两种情况下这都将为真,这正是我们期望的结果。

同样,我的代码如下:

    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协议的局限性:

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.


 类似资料:
  • 我确实在ElasticSearch中的字段中有一个数组数据,其中有一个关键字类型。我想用我想搜索的独占值搜索这个数组,即排除不包括在我的搜索关键字中的数组值。请看下面的细节。 谢了! 我有以下弹性搜索索引映射: 使用以下示例数据: 我的搜索是这样的: 我用过MatchQueryBuilder、TermQueryBuilder、TermsQueryBuilder都没用。根据ElasticSearch

  • 我在一本书《做二进制搜索》中看到了这个方法,但无论我怎么尝试,我都无法理解它是如何工作的。有人能确切地向我解释一下它是如何工作的吗? 这本书的解释无助于: 这个想法是在我们靠近目标元素时跳跃并减慢速度。变量k和b包含数组中的位置和跳跃长度。如果数组包含元素x,搜索后x的位置将在变量k中。该算法的时间复杂度为O(log n),这是因为对每个跳转长度而言,同时循环中的代码最多执行两次。 我不明白的是k

  • 问题内容: 在哪里可以找到有关WDS的文档,特别是使用C#中的SQL查询来查询WDS?是否有任何资源列出可以从SystemIndex查询的列?另外,我希望查询返回“上下文”,即就像WDS客户端从找到搜索词的文档中的几行开始一样。尽管我相信3+的API是相同的,但我正在使用WDS 4.0。我检查了MSDN和其他站点,但是没有运气。 问题答案: 在MSDN论坛上发布并得到答案:可以搜索的列或属性:ht

  • 我正在尝试实现一个二叉查找树,但是“搜索”函数对于除了根之外的每个条目都返回了错误的值。 该函数应返回其值与键参数匹配的节点的地址,如果节点不存在,则返回 NULL。 当我运行代码时,我得到以下内容: 我知道每个节点的“左”和“右”指针链接正确,因为“delAll”函数成功删除了所有节点。 将“cout”语句添加到“search”函数表明该函数似乎返回了正确的地址。为什么从主主调用时会打印错误的地

  • 问题内容: 我的脚本来调用ajax 的HTML 问题: 在onkeyup上,我正在使用ajax来获取结果。一旦ajax结果延迟增加,对我来说就会发生问题。 例如, 当键入关键字时,我收到ajax结果,而当键入两次键之间的ajax时间延迟有时引起严重问题时,我收到ajax结果。 当我快速打字时。与相比,ajax搜索关键字的时间晚了。我不知道该如何处理这类案件。 结果由于ajax延迟 而快速键入关键字

  • 我有一个要求,以提供功能,将允许用户搜索通过许多不同的领域元素,并看到结果作为组合列表。所以在UI中,他只需要填充一个文本字段,然后检索结果。 为了可视化,假设我在域中有3个实体: 现在我想我可以达到这样的要求: 但是当调用第二个函数--负责返回实际文档的函数时,会引发以下异常: 无法标识索引名称。GlobalSearchDTO不是文档。确保document类被@document(indexnam