В IMAP нумерация сообщений основана на том, когда сообщение помещается в папку (т. Е. Первое сообщение в папке равно 1, второе сообщение равно 2 и т. Д.).Однако этот порядок не учитывает дату получения сообщения.Что меня беспокоит, так это сообщения, которые старше сообщения № 1 в папке, то есть сообщения, которое было перемещено пользователем в папку вручную (а не когда оно было получено в систему).
Я не могу просто получить ReceiveDate каждого сообщения, так как это неэффективно.
I думал Я мог бы выполнить поиск 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из которых полученное время даты около 12:00 вечера 5 августа, но первое сообщение в папке, которое находится в 4:00 вечера 5 августа, мы увидим следующее:
Message 1 receivedDate: <Fri Aug 05 16:46:57 CDT 2011>
Size of oldMsgs: <0>
Size of newMsgs: <7>
Тем не менее, ВСЕ из оставшихся семи мнеssages старше, чем первое сообщение ... они ВСЕ должны быть в oldMsgs.
Тем не менее, если я помещу сообщение из предыдущего дня (4 августа) в эту папку, тогда поиск будет работать в основном... для этого одного сообщения.Похоже, что поиск работает только изо дня в день, а не с точностью до секунды ...
Я должен отметить, что в термине msgsOlderThanOETFirst я изначально использовал LE (отсюда и название), однако, это перевернет вышеупомянутые результаты - ВСЕ сообщения будут найдены в oldMsgs.
Может ли кто-нибудь еще подтвердить, является ли это поведение истинным, и если да, то будет ли это указывать на ошибку в Java?
Я пытался заглянуть в исходный код поиска, но думаю,получить версию из командной строки, а не ту, которую использует пакет javamail ....
Я использую MS Exchange 2007 с пакетом обновления 1 (SP1) и JavaMail 1.4.3.
Спасибо за любые предложения.
ОБНОВЛЕНИЕ: Я не думаю, что мое чтение порядка компаратора неверно.Посмотрите ответ, приведенный в следующей ветке: java imap извлекают сообщения с даты
Предположим, мы используем этот ответ, и у нас есть границы с 15.07.2011 по 9/15 /2011.Тогда у нас в поиске сравним сообщение с заданной датой 04.08.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.Однако, если мы примем данное сообщение в 5/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, или я совершенно запутался?Пожалуйста, исправьте мое замешательство, если оно последнее!