首页 > 解决方案 > Spring 集成邮件在获取电子邮件后设置标志“已标记”。有没有办法阻止它这样做?

问题描述

我正在尝试根据来自、主题和正文等 SearchTerms 获取电子邮件,并且我已经实现SearchTermStrategy了将 java 邮件SearchTerm[]作为构造函数参数的接口,并且我还扩展ImapMailReceiver了类并覆盖了它的searchForNewMessages(). 这是代码

public class SearchTermStrategyImpl implements SearchTermStrategy {

    private final SearchTerm[] searchTerms;

    public SearchTermStrategyImpl(SearchTerm[] searchTerms) {
        this.searchTerms = searchTerms;
    }

    @Override
    public SearchTerm generateSearchTerm(Flags supportedFlags, Folder folder) {
        SearchTerm searchTerm = null;
        for (int i = 0; i < searchTerms.length; i++) {
            if (i == 0) {
                searchTerm = searchTerms[i];
            } else {
                searchTerm = new AndTerm(searchTerm, searchTerms[i]);
            }
        }
        return searchTerm;
    }
}

ImapMailReceiver 的重写方法

@Override
protected Message[] searchForNewMessages() throws MessagingException {
    Message[] messages = null;
    Folder folder = getFolder();
    super.setSearchTermStrategy(searchTermStrategy);
    SearchTerm searchTerm = searchTermStrategy.generateSearchTerm(null, null);
    if (folder.isOpen()) {
        messages = searchTerm==null ? folder.getMessages() : folder.search(searchTerm);
    } else {
        throw new ImapException("Folder is closed");
    }
    return messages.length > 0 ? messages : new Message[0];
}

我也将SimpleContent,ShouldMarkMessagesAsReadAutoCloseFolder值设置为 false 的ImapMailReceiver

最后,我在有效负载中收到消息,该消息具有附加标志“已标记”,这是不正确的。无论如何要保留电子邮件标志吗?

我已经尝试在每条消息上将 Flag.Flagged 设置为 false,但这有两种错误

  1. 如果用户标记了一些重要的电子邮件。
  2. 通过遍历所有电子邮件并将 Flagged 设置为 false ,这将像上面那样对性能造成很大影响和错误。

SelectorExpression我认为,在未指定的情况下,可以减少获取电子邮件后的额外处理(避免调用searchAndFilterMessages()方法)

标签: javaspringspring-integration

解决方案


Flags.Flag.FLAGGEDAbstractMailReceiver.setMessageFlags()如果服务器不同时支持Flags.Flag.RECENT和 ,则设置 (in ) Flags.Flag.USER

(这些标志用于默认搜索词)。

看起来您应该能够覆盖setAdditionalFlags()和使用message.getFlags().removeFlag(Flags.Flag.FLAGGED)(在调用super.SetAdditionalFlags()which sets之后Flags.Flag.SEEN)。


推荐阅读