无法将IMAPInputStream强制转换为Multipart

时间:2012-04-24 17:02:58

标签: java exception javamail multipart

在Java项目中,我可以从gmail服务器接收邮件。但我想收到身体的包裹部分。在此代码示例中,我的上一个message(messages.length - 1)是多部分/混合。

调试是在if块上传递但是它落入了catch块并给了我这条消息:

  

线程“main”中的异常java.lang.ClassCastException:com.sun.mail.imap.IMAPInputStream无法强制转换为javax.mail.Multipart

我该如何处理这个问题?

Message[] messages = folder.getMessages();
        ArrayList<String> attachments = new ArrayList<String>();
        for (int i = messages.length - 1; i >= 0; i--) {

            Part p = messages[i];
            if (messages[i].isMimeType("multipart/*")) 
            {           
                ***Multipart multipart = (Multipart) messages[i].getContent();***
                for (int j = 0, m = multipart.getCount(); j < m; j++) {

                    Part part = multipart.getBodyPart(j);
                    String disposition = part.getDisposition();
                    //
                    if (disposition != null
                            && (disposition.equals("ATTACHMENT"))) 
                    {
                        System.out.println(part.getFileName());
                        attachments.add(saveFile(MimeUtility.decodeText(part.getFileName()), part.getInputStream()));
                    }
                }
            }
        }

修改

我修复了使用mail.jar,additional.jar和activation.jar的问题,这些问题仅用于 Java Project

(我之前为我的Android项目下载了这些罐子。这是问题的根源。)

3 个答案:

答案 0 :(得分:11)

我在使用Android JavaMail阅读邮件附件时遇到了类似的问题。我通过添加以下代码行修复了此错误。 MailCap有问题,javamail找不到multipart / mixed部分的处理程序,所以需要添加这个位。这解决了我的问题。希望它可以帮助那些人。

MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
CommandMap.setDefaultCommandMap(mc);

干杯!

答案 1 :(得分:1)

这通常是因为JAF找不到将MIME类型映射到类的配置文件。失败的最常见原因是您运行的环境没有正确设置线程的上下文类加载器。有关解决方法,请参阅this JavaMail forum thread

此失败的第二个最常见原因是您将mail.jar文件中的类重新打包到您自己的jar文件中,但忘记将配置文件包含在META-INF目录中。

答案 2 :(得分:0)

只是好奇,类型架构显示它们来自不同的超级类:

公共类IMAPInputStream扩展了java.io.InputStream {}

公共抽象类Multipart {}

protected synchronized void Multipart :: setMultipartDataSource(MultipartDataSource mp);

,而MultipartDataSource定义为javax.mail.MultipartDataSource。