Saya ingin memperbarui bendera pada beberapa pesan di folder email imap jarak jauh. saya menggunakan

  • spring-integrasi-mail 4.2.6.RELEASE
  • javamail com.sun.mail

Untuk mencapai tujuan ini saya menggunakan adaptor saluran masuk email:

<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>

Saya berhasil mendapatkan pesan yang difilter oleh searchTermStrategy.

Saya mendapatkan koleksi

javax.mail.internet.MimeMessage

Ini adalah sebuah antarmuka.

Implementasi nyata adalah contoh dari

  IntegrationMimeMessage

Kelas privat yang didefinisikan dalam

org.springframework.integration.mail.AbstractMailReceiver

Saya sudah mencoba memperbarui perpustakaan email Java ke yang terakhir.

Untuk mengubah bendera surat Dilihat dari true menjadi false saya melakukan hal berikut:

 // 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);

Saya menerima ClassCastException.

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

Dalam metode javamail 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)

Khususnya dalam metode Utility.toMessageSet gips ini menyebabkan kesalahan:

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

Masalahnya adalah

  • IntegrationMimeMessage yang datang sebagai parameter untuk metode toMessageSet memperluas MimeMessage
  • ImapMessage memperluas MimeMessage

Tetapi IntegrationMimeMessage dan ImapMimeMessage tidak terkait sehingga penyebab kesalahan.

0
Pierpaolo Piccoli 20 September 2019, 16:12

1 menjawab

Jawaban Terbaik

Melihat kode sumber IntegrationMimeMessage di AbstractMailReceiver, sepertinya tidak ada cara untuk melakukan ini. IntegrationMimeMessage membungkus MimeMessage asli, tetapi tanpa memaparkan informasi yang cukup untuk kembali ke aslinya. Ada metode getFolder yang memungkinkan Anda mengakses objek Folder asli, dan komentar mengklaim itu ada untuk tujuan ini, tetapi tanpa objek IMAPMessage asli atau nomor pesan asli, Anda tidak dapat menggunakan metode setFlags pada objek Folder .

Anda mungkin harus mengajukan masalah terhadap integrasi musim semi.

1
Bill Shannon 20 September 2019, 19:01