JavaMail поиск по ReceivedDate, не работает до второй? - PullRequest
8 голосов
/ 06 августа 2011

В 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, или я совершенно запутался?Пожалуйста, исправьте мое замешательство, если оно последнее!

1 Ответ

7 голосов
/ 10 августа 2011

По словам разработчика JM Билла Шеннона, это ограничение протокола 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.
...