Java 无法将IMAPInputStream强制转换为多部分

Java 无法将IMAPInputStream强制转换为多部分,java,exception,jakarta-mail,multipart,Java,Exception,Jakarta Mail,Multipart,在Java项目中,我可以从gmail服务器接收邮件。但我想接收身体的包裹部分。在这个代码示例中,我的最后一条消息(messages.length-1)是多部分/混合的 调试是在if块上传递的,但它落在catch块中,并给了我以下消息: 线程“main”java.lang.ClassCastException中的异常:com.sun.mail.imap.IMAPInputStream无法转换为javax.mail.Multipart 我如何处理这个问题 Message[] messages = f

在Java项目中,我可以从gmail服务器接收邮件。但我想接收身体的包裹部分。在这个代码示例中,我的最后一条
消息(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()));
                    }
                }
            }
        }
Message[]messages=folder.getMessages();
ArrayList attachments=新的ArrayList();
对于(int i=messages.length-1;i>=0;i--){
第p部分=信息[i];
if(messages[i].isMimeType(“multipart/*”))
{           
***Multipart Multipart=(Multipart)消息[i].getContent()***
对于(int j=0,m=multipart.getCount();j
编辑 我修复了使用mail.jar、additional.jar和activation.jar的问题,它们只用于Java项目


(我以前在Android项目中下载过这些JAR,这就是问题的根源。)

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


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

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

干杯

很奇怪,类型架构显示它们来自不同的超类:

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

公共抽象类多部分{}

受保护的同步void Multipart::setMultipartDataSource(MultipartDataSource mp)


虽然MultipartDataSource被定义为javax.mail.MultipartDataSource。

但我没有使用Tomcat,它只是一个控制台应用程序,我可能应该问一下主要问题。我的目标是从邮件正文接收图像。我怎样才能用Java做到这一点。我的意思是我的代码对于这个问题看起来还可以吗。我可以像他一样接收所有图像。我可以像正常图像一样显示它吗?这正是我想做的你只是在用“java”命令从命令行运行你的程序?尝试运行JavaMail附带的msgshow.java演示程序。如果这不起作用,请详细解释您的环境。你在什么操作系统上使用什么JDK版本?我已经修复了。我的库是用于Android开发的。我意识到了这一点,并下载了JAR用于Java开发。然后我可以把图像下载到我的电脑里。实际上,我做这个Java项目是为了理解下载任何图像。因为我真正的目标是把一张图片下载到安卓SD卡上。顺便说一句,我说我可以把图片下载到我的电脑里,但是我的邮件包名是“xx.jpg”,但是下载到我电脑里的是“xx.jpg0”。如果我把jpg0改成jpg,那么我就可以看到我的图片了。如何直接下载图片xx.jpg。这有什么问题?这对我很有用。顺便提一下,我的打包程序抛出了以下警告:[warn]将“META-INF/mailcap”与策略“discard”合并[warn]将“META-INF/mailcap.default”与策略“discard”合并,这可能意味着它忽略了javax库中的一些有用的东西。@RahulUpadhyay只需将这些代码行添加到您尝试初始化电子邮件库的java类中。