【问题标题】:Can not cast IMAPInputStream to Multipart无法将 IMAPInputStream 转换为 Multipart
【发布时间】:2012-04-24 17:02:58
【问题描述】:

在 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 项目

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

【问题讨论】:

    标签: java exception jakarta-mail multipart


    【解决方案1】:

    我在使用 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);
    

    干杯!

    【讨论】:

    • 这对我有用。顺便说一句,我的打包程序抛出了这些警告: [warn] Merging 'META-INF/mailcap' with strategy 'discard' [warn] Merging 'META-INF/mailcap.default' with strategy 'discard' 这可能意味着它忽略了javax 库中的一些有用的东西..
    • @RahulUpadhyay 只需将这些代码行添加到您尝试初始化电子邮件库的 java 类中。
    【解决方案2】:

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

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

    【讨论】:

    • 但是我没有使用Tomcat,它只是一个控制台应用程序
    • 也许我应该问主要问题。我的目标是从邮件正文接收图像。我怎么能用Java做到这一点。我的意思是我的代码可以解决这个问题?
    • 在这个问题mailinglistarchive.com/javamail-interest@java.sun.com/…。我可以收到所有像他一样的形象。我可以像正常图像一样显示它吗?这正是我想要做的
    • 您只是使用“java”命令从命令行运行程序?尝试运行 JavaMail 附带的 msgshow.java 演示程序。如果这不起作用,请详细说明您的环境。你在什么操作系统上使用什么JDK版本?
    • 我修好了。我的库用于 Android 开发。我意识到这一点并下载了用于 Java 开发的 jar。然后我可以将图像下载到我的计算机中。实际上,我正在做这个 Java 项目以了解下载任何图像。因为我的真正目标是将图像下载到 Android SD 卡中。顺便说一句,我可以将图像下载到我的计算机中,但我的邮件包名称是“xx.jpg”,但下载到我的计算机名称中的是“xx.jpg0”如果我将 jpg0 修复为 jpg,那么我可以看我的形象。如何直接下载图片xx.jpg。这有什么问题?
    【解决方案3】:

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

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

    公共抽象类 Multipart {}

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

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

    【讨论】:

      猜你喜欢
      • 2014-10-31
      • 2020-11-26
      • 2017-10-29
      • 2022-07-16
      • 2015-09-04
      • 2016-05-26
      • 2015-08-11
      • 1970-01-01
      • 2012-04-08
      相关资源
      最近更新 更多