问题描述
我正在使用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协议交换。