我正在尝试使用Spring集成来接收电子邮件,解析它以调用服务,然后有条件地转发相同的电子邮件。我能够阅读、解析和发送电子邮件,但不能转发内容
@Bean
@Value("${imap.url}")
public IntegrationFlow mailListener( String imapUrl) {
return IntegrationFlows
.from(s -> s.imap(imapUrl)
.searchTermStrategy((f,l) -> fromAndNotSeenTerm())
.javaMailProperties(p -> p.put("mail.debug", "false")),
e -> e.autoStartup(true)
.poller(p -> p.fixedDelay(10000)))
.handle(Message.class, (payload, header) -> parseEmail(payload))
.<Boolean, Boolean>route(p -> p,
m -> m.channelMapping("true", "sendMailChannel")
.channelMapping("false", "nullChannel"))
.get();
}
@Bean
public IntegrationFlow sendMailFlow() {
return IntegrationFlows.from("sendMailChannel")
.enrichHeaders(Mail.headers().subjectFunction(m->"Email SUbj").from("xyz@abc.com").toFunction(m -> new String[] { "abc@abc.com" }))
.handle(Mail.outboundAdapter("smtp.host.net")
.port(25)
.protocol("smtp")
.javaMailProperties(p -> p.put("mail.debug", "true")))
.get();
}
使用上面的代码,问题是将从电子邮件(payload)读取的内容传递给sendEmailChannel。目前parseEmail(Boolean)的输出正在进入通道。您能建议如何完成它吗?仍然不知道如何解决这个问题
更新1:
@Bean
@Value("${imap.url}")
public IntegrationFlow mailListener( String imapUrl) {
return IntegrationFlows
.from(s -> s.imap(imapUrl)
.searchTermStrategy((f,l) -> fromAndNotSeenTerm())
.javaMailProperties(p -> p.put("mail.debug", "false")),
e -> e.autoStartup(true)
.poller(p -> p.fixedDelay(10000)))
.enrichHeaders(s -> s.headerExpressions(h -> h
.put("saved", "payload")))
.handle(Message.class, (payload, header) -> parseEmail(payload))
.<Boolean, Boolean>route(p -> p,
m -> m.channelMapping("true", "sendMailChannel")
.channelMapping("false", "nullChannel"))
.get();
}
我按照建议将有效负载添加到header,但无法找出将有效负载从header设置回的转换。但是即使我在路由之前将其设置回有效负载,它也不会中断流程吗?因为parse方法(布尔)的输出应该驱动路由决策
最终更新
感谢Gary的帮助,我能够通过添加过滤器和转换使我的第一个集成流程工作
public IntegrationFlow mailListener( String imapUrl) {
return IntegrationFlows
.from(s -> s.imap(imapUrl)
.searchTermStrategy((f,l) -> fromAndNotSeenTerm())
.javaMailProperties(p -> p.put("mail.debug", "false")),
e -> e.autoStartup(true)
.poller(p -> p.fixedDelay(10000)))
.enrichHeaders(s -> s.headerExpressions(h -> h
.put("saved", "payload")))
.handle(Message.class, (payload, header) -> parseEmail(payload))
.filter((Boolean p) -> p == true)
.transform("headers['saved']")
.channel(MessageChannels.queue("sendMailChannel"))
.get();
}
使用标头增强器保存标头中的原始有效负载(标头名称=保存
表达式=有效负载
),然后在解析器之后使用转换器将其移回paylaod(表达式=标头['保存']
)。