如何在 Spring Integration 中轮询时根据主题过滤电子邮件

Posted

技术标签:

【中文标题】如何在 Spring Integration 中轮询时根据主题过滤电子邮件【英文标题】:How to filter emails based on subject while polling in Spring Integration 【发布时间】:2018-03-02 02:32:30 【问题描述】:

我想根据主题对电子邮件进行投票。

如果我们想查询主题为“Test”的邮件,下面的代码会获取所有邮件。但我们需要过滤主题为“Test”的邮件。

如何根据主题进行过滤?

@Configuration
@EnableIntegration
public class PollSubjectEmail 
    @Bean
    public IntegrationFlow pop3MailFlow() 

        return IntegrationFlows
                .from(Mail.pop3InboundAdapter(“xxx.host.com", pop3Port, “username”, “password”)
                        .javaMailProperties(p -> p.put("mail.debug", "true")),
                        e -> e.autoStartup(true).poller(Pollers.fixedDelay(6000)))
                .enrichHeaders(s -> s.headerExpressions(h -> h.put(MailHeaders.SUBJECT, "payload.subject")
                        .put(MailHeaders.FROM, "payload.from[0].toString()")))
                .channel("pop3Channel").get();
    

我正在使用 pop3Channel 并尝试使用过滤器。但是不确定如何找到解决方案。

【问题讨论】:

【参考方案1】:

我知道这是一个非常古老的问题,回答这个问题对任何有相同要求的人都有帮助。

使用MailInboundChannelAdapterSpec#selectorExpression("some expression goes here")

@Bean
public IntegrationFlow pop3MailFlow() 

    return IntegrationFlows
            .from(Mail.pop3InboundAdapter("xxx.host.com", pop3Port, “username”, “password”)
                    .javaMailProperties(p -> p.put("mail.debug", "true")
                     /* Add the expression as below*/
                    .selectorExpression("subject matches '(?i).*Test.*'")),
                    e -> e.autoStartup(true).poller(Pollers.fixedDelay(6000)))
            .enrichHeaders(s -> s.headerExpressions(h -> h.put(MailHeaders.SUBJECT, "payload.subject")
                    .put(MailHeaders.FROM, "payload.from[0].toString()")))
            .channel("pop3Channel").get();

【讨论】:

以上是关于如何在 Spring Integration 中轮询时根据主题过滤电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Integration 中动态注册 Feed Inbound Adapter?

如何在 Spring Integration DSL 中为通道设置多个消息处理程序?

Spring Integration:如何增加对传入消息的处理

如何使用 Spring Integration 发送 gcm xmpp 消息?

Spring Integration:如何一次处理多条消息?

如何在 Spring Integration 中获取 rss feedChannel SyndEntry 消息的来源?