org.springframework.integration.mail.class 在使用 spring 集成邮件 - imap 接收的邮件消息上投射异常更改标志

org.springframework.integration.mail.class cast exception changing flag on a mailmessage received with spring integration mail - imap

我想更新远程 imap 邮件文件夹中某些邮件的标志。 我正在使用

为了实现这个目标,我使用了邮件入站通道适配器:

<mail:inbound-channel-adapter
    id="mailsGiaLetteAdapter"
    store-uri="imaps://${maildispatcher.daemon.legalmail.user}:${maildispatcher.daemon.legalmail.password}@${maildispatcher.daemon.legalmail.imap.host}:${maildispatcher.daemon.legalmail.imap.port}/INBOX" 
    channel="emailsGiaLetteChannel" 
    auto-startup="true" 
    should-delete-messages="false"   
    should-mark-messages-as-read="true" 
    java-mail-properties="javaMailProperties" 
    search-term-strategy="mailGiaLetteSearchTermStrategy"
    >
        <int:poller  fixed-rate="5000" max-messages-per-poll="1000" >
            <int:transactional  synchronization-factory="syncFactoryImpostazioneDelleMailComeDaLeggere" />
    </int:poller>

 </mail:inbound-channel-adapter>

我成功获取了searchTermStrategy过滤的消息

我获得了

的集合
javax.mail.internet.MimeMessage

这是一个界面。

真正的实现是

的实例
  IntegrationMimeMessage

中定义的私有 class
org.springframework.integration.mail.AbstractMailReceiver

我已经尝试将 java 邮件库更新到最后。

要将邮件标志从 true 更改为 false,我执行以下操作:

 // message is a MimeMessage implemented with IntegrationMimeMessage
 Folder folder = message.getFolder();
 folder.open(Folder.READ_WRITE);
 MimeMessage[] messages = {message};
        Flags flags = new Flags(Flag.SEEN);
        folder.setFlags(messages,flags , false);

我收到一个 ClassCastException。

  org.springframework.integration.mail.AbstractMailReceiver$IntegrationMimeMessage cannot be cast to com.sun.mail.imap.IMAPMessage

在java邮件方法中Utility.toMessageSet:

   org.springframework.integration.mail.AbstractMailReceiver$IntegrationMimeMessage cannot be cast to com.sun.mail.imap.IMAPMessage
at com.sun.mail.imap.Utility.toMessageSet(Utility.java:61)
at com.sun.mail.imap.Utility.toMessageSetSorted(Utility.java:138)
at com.sun.mail.imap.IMAPFolder.setFlags(IMAPFolder.java:1415)
at it.assimoco.maildispatcher.daemon.legalmail.ProcessorePerImpostareLeMailComeDaLeggere.afterCommit(ProcessorePerImpostareLeMailComeDaLeggere.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

特别是在方法 Utility.toMessageSet 中 此转换导致错误:

   java.mail.Message msg = (IMAPMessage)msgs[i];

问题是

但 IntegrationMimeMessage 和 ImapMimeMessage 不相关,因此是错误原因。

查看AbstractMailReceiver中IntegrationMimeMessage的源代码,似乎没有办法做到这一点。 IntegrationMimeMessage 正在包装原始的 MimeMessage,但没有公开足够的信息来返回原始信息。有一个 getFolder 方法应该允许您访问原始 Folder 对象,评论声称它为此目的而存在,但是没有原始 IMAPMessage 对象或原始消息编号,您不能在 Folder 对象上使用 setFlags 方法.

您可能应该针对 spring-integration 提出问题。