不能施放IMAPInputStream为multipart(Can not cast IMAPInp

2019-09-16 17:54发布

在Java项目,我可以收到来自Gmail服务器的邮件。 但我想接收体的包装部件。 并且在该代码示例我的最后message(messages.length - 1)是多部分/混合。

调试是通的if块,但它落入catch块,并给了我这个消息:

异常在线程“主要” 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项目的问题。

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

Answer 1:

我遇到了类似的问题,而我是看使用Android JavaMail的邮件附件。 我已经通过添加代码下面的行固定此错误。 也有一些是错误的MAILCAP,JavaMail的找不到了多/混合部分的处理程序,所以此位需要添加。 这解决了我的问题。 希望它可以帮助人在那里。

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

干杯!



Answer 2:

这通常是因为JAF找不到MIME类型映射到类的配置文件。 对于失败最常见的原因是你正在运行的环境没有正确设置线程的上下文类加载器。 见这个JavaMail的论坛主题为一种变通方法。

这个失败的第二个最常见的原因是,你在重新包装mail.jar文件的类到您自己的jar文件,但忘了,包括在META-INF目录下的配置文件。



Answer 3:

只是好奇,类型结构显示他们是从不同的超类:

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

公共抽象类多部分{}

保护同步空隙多部分:: setMultipartDataSource(MultipartDataSource MP);

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



文章来源: Can not cast IMAPInputStream to Multipart