当IMAP IDLE适配器配置中的setShouldMarkAsDelete标志为true时,在邮件解析中出现Messa



我在emailreceivecchannel中收到电子邮件后解析电子邮件时得到MessageRemovedException,如果我已将ShouldMarkAsDelete标志配置为"true"。如果将标志设置为false,则一切正常

@Bean
public ImapMailReceiver imapMailReceiver() {
StringBuilder impaURI = new StringBuilder();
impaURI.append(MAIL_PROTOCOL).append("://").append(MAIL_USERNAME).append(":").append(MAIL_PASSWORD)
.append("@").append(MAIL_HOST).append(":").append(MAIL_PORT).append("/").append(MAIL_FOLDER);

ImapMailReceiver mailReceiver = new ImapMailReceiver(impaURI.toString());
mailReceiver.setShouldDeleteMessages(true);
mailReceiver.setShouldMarkMessagesAsRead(true);
mailReceiver.setJavaMailProperties(javaMailProperties());
mailReceiver.setAutoCloseFolder(false);
return mailReceiver;
}    

在调试流程时,MimeMessage的已删除标志将显示为"true"。这一功能最近停止工作了。知道为什么会有这个问题吗?

AbstractMailReceiver中的逻辑是这样的:

private void postProcessFilteredMessages(Message[] filteredMessages) throws MessagingException {
setMessageFlags(filteredMessages);
if (shouldDeleteMessages()) {
deleteMessages(filteredMessages);
}

deleteMessages()只做这个:

message.setFlag(Flags.Flag.DELETED, true);

expunge功能在这里执行:

protected void closeFolder() {
this.folderReadLock.lock();
try {
MailTransportUtils.closeFolder(this.folder, this.shouldDeleteMessages);
}
finally {
this.folderReadLock.unlock();
}
}

因此,由于您有mailReceiver.setAutoCloseFolder(false);,这意味着您自己关闭文件夹,然后才尝试访问消息内容。必须是相反的:只有在您已经解析了消息的内容后才能关闭文件夹。

最新更新