Решение состоит в том, чтобы не использовать поиск IMAP, это мусор. Лучшее решение - обновить протокол IMAP или использовать другой протокол (например, MAPI, который недоступен в JavaMail). Если вы должны использовать IMAP как есть, лучше работать с пониманием того, что папки IMAP функционируют как очередь FIFO. Сохраняйте карту памяти своих сообщений и отслеживайте новые каждые 2 минуты.

P нумерация сообщений основана на том, когда сообщение помещается в папку (то есть первое сообщение в папке - 1, второе сообщение - 2 и т. Д.). Однако этот порядок не учитывает дату получения сообщения. Меня беспокоят сообщения, которые старше сообщения № 1 в папке, то есть сообщение, которое пользователь перемещал в папку вручную (а не когда оно было получено в систему).

Я не могу просто получить дату каждого полученного сообщения, так как это неэффективно.

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 августа, но первое сообщение в папке, которое находится в 16:00 5 августа, мы увидим следующее:

Message 1 receivedDate: <Fri Aug 05 16:46:57 CDT 2011>
Size of oldMsgs: <0>
Size of newMsgs: <7>

Тем не менее, ВСЕ из оставшихся семи сообщений старше, чем первое сообщение ... они должны быть ВСЕ в oldMsgs.

Тем не менее, ЕСЛИ я поместил сообщение из предыдущего дня (4 августа) в эту папку, тогда поиск будет работать ... для этого ОДНОГО сообщения. Похоже, что поиск работает только изо дня в день, а не до второго ...

Я должен отметить, что в термине msgsOlderThanOETFirst я первоначально использовал LE (отсюда и название), однако это перевернуло приведенные выше результаты - ВСЕ сообщения были бы найдены в oldMsgs.

Может ли кто-нибудь еще подтвердить, верно ли это поведение, и если да, то будет ли это указывать на ошибку в Java?

Я пытался заглянуть в исходный код поиска, но мне показалось, что я получаю версию из командной строки, а не ту, которую использует пакет javamail ....

Я использую MS Exchange 2007 с пакетом обновления 1 и JavaMail 1.4.3.

Спасибо за любые предложения.

ОБНОВИТЬ: Я не думаю, что мое чтение порядка компаратора неверно. Посмотрите ответ, приведенный в следующей теме:java imap извлекает сообщения с даты

Предположим, мы используем этот ответ, и у нас есть границы с 15.07.2011 по 15.09.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

Это оценило бы как истинное в обоих случаях, что мы и ожидаем, поскольку дата находится в желаемом диапазоне.

Кроме того, мой код выглядит следующим образом:

    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 - это то, что я ожидаю и получу. Однако, если мы примем данное сообщение в 05.08.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)

Ваш ответ на вопрос