3

在 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()));
                    }
                }
            }
        }

编辑

我解决了使用仅用于Java Project的 mail.jar、additional.jar 和 activation.jar 的问题。

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

4

3 回答 3

12

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

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

干杯!

于 2013-08-29T12:20:26.157 回答
0

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

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

于 2012-04-24T18:26:19.977 回答
0

只是好奇,类型架构表明它们来自不同的超类:

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

公共抽象类 Multipart {}

受保护的同步无效 Multipart::setMultipartDataSource(MultipartDataSource mp);

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

于 2013-12-09T20:38:08.877 回答