Java Mail Listner: этот почтовый сервер не поддерживает флаги ПОСЛЕДНИЙ или ПОЛЬЗОВАТЕЛЬ.

Это продолжение прослушивателя почты Java. с помощью Spring Integration: несколько экземпляров приложения не получают почту. Я использую ниже код ImapMailReceiver:

@Bean
    public ImapMailReceiver receiver() {

        ImapMailReceiver receiver = new ImapMailReceiver(
                "imaps://username:[email protected]/INBOX");
        receiver.setShouldMarkMessagesAsRead(false);
        receiver.setSimpleContent(true);
        receiver.setUserFlag("test-flag");
        //receiver.setJavaMailProperties(javaMailProperties());
        return receiver;
    } 

Мое приложение было развернуто на серверах разработки и стадии. Согласно журналам отладки: This email server does not support RECENT or USER flags. Следовательно, любой пользовательский флаг, который я устанавливаю с помощью приведенного выше кода, бесполезен, и письма будут приниматься только одним экземпляром моего приложения (либо разработчиком, либо этапом), а не всеми экземплярами. Таким образом, письма удаляются одним экземпляром. Как заставить его работать так, чтобы все мои экземпляры приложения получали новые электронные письма? Должен ли я устанавливать какие-либо свойства javamail? Как заставить это работать

ОБНОВЛЕНИЕ используется ниже Custom searchTermStrategy. Для каждого опроса будет получен список новых сообщений + набор старых сообщений. Еще не тестировал на нескольких экземплярах приложения.

private class CustomSearchTermStrategy implements SearchTermStrategy {

        CustomSearchTermStrategy() {
        }

        @Override
        public SearchTerm generateSearchTerm(Flags supportedFlags, Folder folder) {
            SearchTerm searchTerm = null;
            boolean recentFlagSupported = false;
            if (supportedFlags != null) {
                recentFlagSupported = supportedFlags.contains(Flags.Flag.RECENT);
                if (recentFlagSupported) {
                    searchTerm = new FlagTerm(new Flags(Flags.Flag.RECENT), true);
                }
                if (supportedFlags.contains(Flags.Flag.ANSWERED)) {
                    NotTerm notAnswered = new NotTerm(new FlagTerm(new Flags(Flags.Flag.ANSWERED), true));
                    if (searchTerm == null) {
                        searchTerm = notAnswered;
                    } else {
                        searchTerm = new AndTerm(searchTerm, notAnswered);
                    }
                }
                if (supportedFlags.contains(Flags.Flag.DELETED)) {
                    NotTerm notDeleted = new NotTerm(new FlagTerm(new Flags(Flags.Flag.DELETED), true));
                    if (searchTerm == null) {
                        searchTerm = notDeleted;
                    } else {
                        searchTerm = new AndTerm(searchTerm, notDeleted);
                    }
                }
                if (supportedFlags.contains(Flags.Flag.SEEN)) {
                    NotTerm notSeen = new NotTerm(new FlagTerm(new Flags(Flags.Flag.SEEN), true));
                    if (searchTerm == null) {
                        searchTerm = notSeen;
                    } else {
                        searchTerm = new AndTerm(searchTerm, notSeen);
                    }
                }
            }

//          if (!recentFlagSupported) {
//              searchTerm = applyTermsWhenNoRecentFlag(folder, searchTerm);
//          }
            return searchTerm;
        }
}

person VGH    schedule 05.06.2020    source источник


Ответы (1)


Самым простым решением было бы использовать разные учетные записи для каждой среды (пересылать письма от одного к другому, чтобы оба получали их).

Если это невозможно, проблема связана с флагом FLAGGED, который безоговорочно установлен и исключен из условия поиска по умолчанию.

К сожалению, метод, устанавливающий этот флаг, является частным, поэтому вы не можете изменить это поведение.

Я думаю, что единственное решение - это настраиваемая стратегия поиска, которая не включает NOT (FLAGGED) и сохраняет состояние локально, чтобы игнорировать сообщения, которые вы уже прочитали.

person Gary Russell    schedule 05.06.2020
comment
Извини, я тебя не понял. Вы хотите сказать, что я могу использовать стратегию персонализированного поиска для решения этой проблемы? Если да, не могли бы вы предоставить для него рабочий код? - person VGH; 05.06.2020
comment
Потому что иметь разные учетные записи невозможно. - person VGH; 05.06.2020
comment
См. ImapMailReceiver.DefaultSearchStrategy; просто сделайте аналогичную реализацию, в которой отсутствует NotTerm(FLAGGED). Это должно решить непосредственную проблему, но это будет означать, что вы будете получать все сообщения каждый раз при запуске приложения (если вы позже не удалите электронные письма). - person Gary Russell; 05.06.2020
comment
Обновленный вопрос с CustomSearchTermStrategy. Для каждого опроса будет получен список новых сообщений + набор старых сообщений. Что еще в нем нужно изменить? Еще не тестировал на нескольких экземплярах приложения. - person VGH; 05.06.2020
comment
К сожалению, похоже, что ваш сервер (Exchange) имеет слабую поддержку IMAP - если он не поддерживает ПОСЛЕДНИЙ или ПОЛЬЗОВАТЕЛЬСКИЙ, вам в значительной степени не повезло, и вам придется каждый раз извлекать весь почтовый ящик и отсеивать сообщения, которые вы уже обработаны, сохраняя состояние локально. Если вы не можете найти какие-то настраиваемые флаги MS, которые вы можете установить и использовать в своем поиске. Жалуйтесь своему почтовому продавцу. - person Gary Russell; 05.06.2020
comment
Ох, хорошо. Также изучал IdleManager. Как вы думаете, если я использую folder.addMessageCountListener с IdleManager.watch, я могу читать почту в нескольких экземплярах моего приложения, или может возникнуть такая же проблема? - person VGH; 05.06.2020
comment
Интересно; Я не знаком с IdleEventManager; учитывая, что в событии приходят новые сообщения, это может сработать; но я не знаю семантики, если у вас есть несколько наблюдателей на одном ящике; надеюсь, они независимы. Стоит попробовать. - person Gary Russell; 05.06.2020
comment
Конечно. Большое спасибо Гэри за вашу помощь и поддержку :) - person VGH; 05.06.2020