在 IMAP 中,邮件编号基于邮件放入文件夹的时间(即文件夹中的第一封邮件为 1,第二封邮件为 2,等等)。但是,此排序不考虑消息的接收日期。我担心的是早于文件夹中的消息号 1 的消息,即由用户手动移入文件夹的消息(而不是在系统接收到消息时)。
我不能只获取收到的每条消息的日期,因为这是非常低效的。
I thought我可以进行 JavaMail 搜索以获取具有接收日期的所有邮件older比第一条消息的接收日期,(同样,然后进行搜索以获取具有接收日期的所有消息newer比第一条消息的接收日期...这会很多,但是虽然我需要处理所有较旧的消息,但我只需要处理一些较新的消息(通过进程,我的意思是下载其标头)。
但是,当我使用搜索时,它似乎无法正常工作。
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。
感谢您的任何建议。
UPDATE:我不认为我对比较器顺序的解读是错误的。查看以下线程中给出的答案:java imap 获取自某个日期以来的消息
假设我们使用该答案,并且我们的边界是从 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 的评价是我所期待的,并将收到的。但是,如果我们在 8/5/2011 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 有什么问题吗,还是我完全困惑了?如果是后者,请纠正我的困惑!