2015-05-12 3 views
0

JavaMail Folder.search() возвращает несколько сообщений IMAP, даже если MessageIDTerm передается методу. Это происходит, когда сообщения являются последующими вперед оригинального сообщения. Версия JavaMail - 1.4.4. Почтовым сервером является MS Exchange 2013. Пользователи отправляют письма с помощью MS Outlook. Вот код:Метод поиска папок JavaMail возвращает несколько сообщений для уникального MessageID

  MessageIDTerm messageIDTerm = new MessageIDTerm(uniqueMessageID); 
      Message[] messages = folder.search(messageIDTerm); 

Если uniqueMessageID это идентификатор сообщения из сообщения электронной почты был направлен, массив сообщений будет содержать сообщение с uniqueMessageID и всех последующих пересылаемых сообщений. Правильно ли это? Есть ли способ получить только сообщение с messagedID, переданное методу поиска?

+0

Идентификатор сообщения не обязательно уникален. Это данные, заданные отправителем, и некоторые отправители являются ошибками. – arnt

+0

Я уверен, что идентификатор сообщения уникален. У меня есть тестовый пример с четырьмя сообщениями, и они имеют разные идентификаторы сообщений: <[email protected]><[email protected]><[email protected]><[email protected]> Первый идентификатор идентификатор оригинальное сообщение, другое - идентификаторы трех форвардов исходного сообщения, сделанного одним и тем же пользователем. Если вы ищете первый MessageID, вы получаете все четыре сообщения. – dascolagi

ответ

0

Чтобы получить только сообщения попробовать этот

public void loadFolder() { 
    if (store != null && store.isConnected()) { 
     try { 
      final Folder inbox = store.getFolder("foldername"); 
      inbox.open(Folder.READ_ONLY); 
      final FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.USER), false); 
      final Message[] messages = inbox.search(ft); 

     for (Message message : messages) { 
      try { 
       if (message.getContentType().contains("text")) { 
        final String text = (String) message.getContent(); 
        System.out.println(text); 
       } 
       } catch (Exception e) { 
        LOG.error("", e); 
      } 
      } 
     } 

с флагом вы можете указать свой поиск

1

Скорее всего, это ошибка в Exchange. Включите JavaMail Session debugging и он должен предоставить достаточно информации, чтобы сообщить об ошибке Microsoft.

Пересылаемые сообщения отправляются в виде вложений в новое сообщение? Если это так, Exchange может искать заголовок в вложениях, а также основное сообщение, что было бы неправильно.

Кстати, вы можете перейти на current 1.5.3 version of JavaMail.

+0

RFC 3501 стр. 51 на самом деле не говорит, что поле должно быть в заголовке верхнего уровня ... возможно, небрежное письмо. – arnt

+0

@Bill: пересылаемые сообщения отправляются как отдельные сообщения, а не как вложения. – dascolagi

+0

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

Смежные вопросы