我正在使用Spring Boot 2.2.4.RELEASE
我需要构建一个动态邮件接收器,因为我可以拥有多个用于提取邮件的邮件服务器。邮件服务器必须可由其他系统配置,因此我的要求是能够动态提取消息。
我进行了调查,并喜欢Spring Integration解决方案及其DSL(请注意:对于我来说,仅下载消息及其附件(如果有)就足够了)。
所以我建立了这段代码:
String flowId = MAIL_IN_FLOW_ID_PREFIX+cpd.getIndirizzoMail();
if( flowContext.getRegistrationById(flowId) != null ) {
flowContext.remove(flowId);
}
ImapMailInboundChannelAdapterSpec adapterSpec = Mail.imapInboundAdapter(connectionUrl.toString())
.javaMailProperties(javaMailProperties)
.shouldDeleteMessages(false)
.shouldMarkMessagesAsRead(false)
.selector(selectFunction);
if( confMailIn.isRichiedeAutenticazione() ) {
adapterSpec = adapterSpec.javaMailAuthenticator(new CasellaPostaleAuthenticator(cpd.getUsername(), cpd.getPassword()));
}
IntegrationFlow flow = IntegrationFlows
.from(adapterSpec.get(), e -> e.poller(Pollers.fixedDelay(Duration.ofSeconds(pollingSeconds)).maxMessagesPerPoll(maxMailMessagePerPoll)))
.handle(message -> {
logger.info("Message headers "+message.getHeaders());
logger.info("Message payload "+message.getPayload());
})
.get();
flowContext.registration(flow).id(flowId).register();
我尝试使用我的Gmail帐户。该代码可以通过imap连接到GMAIL,但是当我尝试简单地记录消息时,出现此错误:
A6 OK成功
2020-02-05 12:48:41,835 23412 [task-scheduler-1] DEBUG osimail.ImapMailReceiver-收到10条消息
2020-02-05 12:48:41,836 23413 [task-scheduler-1]调试oA7存储1 +标记(\ Flagged).simail.ImapMailReceiver-此邮件服务器不支持USER标志。使用系统标志标记消息
A7在只读文件夹上没有存储尝试(失败)
A8关闭
A8 OK返回到认证状态。(成功)
调试IMAP:添加了身份验证连接-大小:1
2020-02-05 12:48:42,198 23775 [task-scheduler-1]错误osihandler.LoggingHandler-org.springframework.messaging.MessagingException:轮询邮件时发生故障;嵌套的异常是javax.mail.MessagingException:A7在READ-ONLY文件夹上没有STORE尝试(失败);嵌套的异常是:com.sun.mail.iap.CommandFailedException:在org.springframework上的org.springframework.integration.mail.MailReceivingMessageSource.doReceive(MailReceivingMessageSource.java:74)上的READ-ONLY文件夹(失败)上没有A7尝试存储。 org.springframework.integration.endpoint.SourcePollingChannelAdapter.receiveMessage(SourcePollingChannelAdapter.java:250)上的integration.endpoint.AbstractMessageSource.receive(AbstractMessageSource.java:167)
现在,似乎默认情况下以READ_ONLY方式打开了FOLDER,这似乎会导致错误。
我被困在这里,我不知道如何解决这个问题。
有人可以给我小费吗?
谢谢
安杰洛
adapterSpec.get()
发出get()
规范会绕过Spring的bean初始化逻辑,该逻辑会将文件夹切换为读/写。
将适配器设置为a @Bean
或简单地删除.get()
,Spring将执行初始化。
.from(adapterSpec, e -> ...
我当时在想,没有get()就尝试了。显然我收到一个错误,因为没有轮询器与之关联。我可能使用默认的轮询器,但是我的原始要求是每个邮件服务器的轮询时间也必须是可配置的。这是可行的吗?
?轮询器仍在端点上
from (spec, e -> e.poller(...))
,与的第一个参数无关from()
。通过将规范传递给工厂方法,Spring将初始化适配器bean。糟糕,您是对的...我的错。我会尽力让你知道
我确认我的错误。通过删除
.get()
所有的作品,效果很好...啊,福尔摩斯说。