如何解决Spring Mail-ImapIdleChannelAdapter多次接收某些邮件,而仅接收一次
我正在使用ImapIdleChannelAdapter接收传入的邮件。我配置了一个侦听器,以获取有关任何传入邮件的信息,然后进一步调用异步方法并将消息处理传递给它。
我面临的问题是它多次收到同一封邮件。我不确定为什么要这么做。
这是我的配置
@Bean
ImapIdleChannelAdapter mailAdapter() {
String user = getMail().get("inbound.secure.user");
String pwd = getMail().get("inbound.secure.pwd");
String hostname = getMail().get("inbound.secure.host");
String port = getMail().get("inbound.secure.imap.port");
String protocol = getMail().get("inbound.secure.imap.protocol");
String host = protocol + "://" + hostname + ":" + port + "/INBOX";
ImapMailReceiver mailReceiver = getReceiver(host,user,pwd);
ImapIdleChannelAdapter mailChannelAdapter = new ImapIdleChannelAdapter(mailReceiver);
mailChannelAdapter.setAutoStartup(true);
mailChannelAdapter.setOutputChannel(mailChannel());
return mailChannelAdapter;
}
private ImapMailReceiver getReceiver(String host,String user,String pwd) {
ImapMailReceiver jobSeekerMailReceiver = new ImapMailReceiver(host);
jobSeekerMailReceiver.setSimpleContent(true);
jobSeekerMailReceiver.setJavaMailProperties(javaMailProperties());
jobSeekerMailReceiver.setJavaMailAuthenticator(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user,pwd);
}
});
jobSeekerMailReceiver.afterPropertiesSet();
jobSeekerMailReceiver.setShouldDeleteMessages(false);
jobSeekerMailReceiver.setShouldMarkMessagesAsRead(true);
return jobSeekerMailReceiver;
}
@Bean
public DirectChannel mailChannel() {
return new DirectChannel();
}
我的听众是
@MessageEndpoint
public class MailListener {
private static Logger logger = LoggerFactory.getLogger(MailListener.class);
private final MailOrganiserService mailOrganiserService;
@Autowired
public MailListener(MailOrganiserService mailOrganiserService) {
this.mailOrganiserService = mailOrganiserService;
}
@ServiceActivator(inputChannel = "mailChannel")
public void handleSecureMessage(Message message) {
String sender = message.getFrom()[0].toString();
Address[] recipients = message.getAllRecipients();
logger.info("handle secure message from {} to {}",sender,recipients);
this.mailOrganiserService.processIncomingMessageAsync(message);
logger.info("returning from handing over mail from {} to {}",recipients);
}
}
我所做的另一项观察是,尽管我已经配置了ImapIdleChannelAdapter,但是我看到的常规日志是
attempting to receive mail from folder [INBOX]
这看起来像轮询行为,而不是事件驱动。
我正在使用以下版本
<dependency>
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mail</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
解决方法
ImapMailReceiver
需要定义为@Bean
。
否则,该文件夹以只读模式打开。
在javamail属性中设置mail.debug=true
,以查看IMAP协议交换。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。