带附件的Java邮件:javax.mail.Multipart上的ClassCastException

Kar*_*amu 7 java jakarta-mail

我使用以下代码从邮件中下载附件,但它给出ClassCastException了Multipart声明:

异常在线程"主要" java.lang.ClassCastException:com.sun.mail.imap.IMAPInputStream不能转换到javax.mail.Multipart在ReadAttachment.main(ReadAttachment.java:52)

我该如何处理IMAPInputStream?

Message messages[] = inbox.getMessages();

for (int j = 0; j < messages.length; j++) {

   String mailType = messages[j].getContentType();

   System.out.println("-- Message " + (j + 1) + " --");

   System.out.println("SentDate : " + messages[j].getSentDate());
   System.out.println("From : " + messages[j].getFrom()[0]);
   System.out.println("Subject : " + messages[j].getSubject());             
   System.out.println("Type :" + messages[j].getContentType()); 
   System.out.println("Attachment :" + messages[j].getFileName());  

   Multipart mp = (Multipart) messages[j].getContent();
   ..

   System.out.println();
}
Run Code Online (Sandbox Code Playgroud)

kah*_*hlk 6

我遇到了与JavaMail 1.5.1和OSGi相同的问题.使用msg.getContent()总是在从OSGi包调用时返回一个InputStream,而当从一个简单的Java测试程序调用时它完美地工作.

设置默认的CommandMap对我来说不起作用,但我在这里找到了一个解决方案:

https://www.java.net/node/705585

ClassLoader tcl = Thread.currentThread().getContextClassLoader();
try {
    Thread.currentThread().setContextClassLoader(javax.mail.Session.class.getClassLoader());
    // now call JavaMail API
    // ...
} finally {
    Thread.currentThread().setContextClassLoader(tcl);
}
Run Code Online (Sandbox Code Playgroud)


ska*_*man 2

是的,因为您假设getContent()返回一些实现的东西Multipart,而在这种情况下它没有(IMAPInputStream扩展InputStream)。

您的代码需要考虑这种可能性。