Java Mail Listner:此电子邮件服务器不支持RECENT或USER标志 [英] Java Mail Listner : This email server does not support RECENT or USER flags

查看:175
本文介绍了Java Mail Listner:此电子邮件服务器不支持RECENT或USER标志的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是的延续使用Spring Integration的Java邮件侦听器:多个应用程序实例未接收到邮件.我正在使用以下ImapMailReceiver代码:

This is a continuation of Java mail listener using Spring Integration : mail isn't received by multiple app instances . I'm using below ImapMailReceiver code :

@Bean
    public ImapMailReceiver receiver() {

        ImapMailReceiver receiver = new ImapMailReceiver(
                "imaps://username:pwd@mail.company.com/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.因此,无论我通过上述代码设置的任何用户标志都没有用,并且只有我的应用程序实例(dev或stage)而不是所有实例都将接收邮件,因此邮件将被一个实例删除.如何使其工作,以便我所有的应用程序实例都收到新的电子邮件?我应该设置任何javamail属性吗?如何运作

My application has been deployed in dev and stage servers.As per the debug logs : This email server does not support RECENT or USER flags. Hence whatever userflag i'm setting via above code isn't useful and mails will be received by only once instance of my application (either dev or stage ) and not all instances.So mails are getting dropped by one instance. How to make it work so that all of my application instances receives new emails? Should i set any javamail properties ? How to make it work

更新在自定义searchTermStrategy下面使用.对于每个新邮件的轮询列表,将接收一组旧邮件.尚未在多个应用程序实例上进行测试.

UPDATE used below custom searchTermStrategy . For every poll list of new messages + set of old messages will be received . Haven't tested on multiple application instances yet.

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;
        }
}

推荐答案

最简单的解决方案是为每个环境使用不同的帐户(将邮件从一个环境转发到另一个环境,以便两者都可以获取它们).

The simplest solution would be to use different accounts for each environment (forward mails from one to the other so both get them).

如果这不可能,则问题在于FLAGGED标志,该标志是无条件设置的,并且不包含在默认搜索字词中.

If that's not possible, the issue is with the FLAGGED flag, which is unconditionally set and excluded in the default search term.

不幸的是,设置该标志的方法是私有的,因此您无法更改该行为.

Unfortunately, the method that sets that flag is private so you can't change that behavior.

我认为唯一的解决方案是不包含NOT (FLAGGED)的自定义搜索策略,并在本地保持状态以忽略您已经阅读的消息.

I think the only solution is a custom search strategy that does not include NOT (FLAGGED) and keep state locally to ignore messages that you have already read.

这篇关于Java Mail Listner:此电子邮件服务器不支持RECENT或USER标志的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆