Не может привести IMAPInputStream к Multipart

В проекте 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()));
                    }
                }
            }
        }

РЕДАКТИРОВАТЬ

Я исправил проблему с использованием mail.jar, Additional.jar и активации.jar, которые используются только для Java Project.

(Я загружал эти банки раньше для моего проекта Android. Это было источником проблемы.)

3 ответа

Я столкнулся с подобной проблемой, когда читал вложения к сообщениям с помощью 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);

Ура!

Обычно это происходит потому, что JAF не может найти файл конфигурации, который сопоставляет типы MIME с классами. Наиболее распространенная причина этого сбоя заключается в том, что среда, в которой вы работаете, неправильно устанавливает загрузчик класса контекста потока. Посмотрите эту ветку форума JavaMail для обходного пути.

Вторая наиболее распространенная причина этого сбоя заключается в том, что вы переупаковали классы из файла mail.jar в свой собственный файл jar, но забыли включить файлы конфигурации в каталог META-INF.

Просто любопытно, что архитектура типов показывает, что они из другого суперкласса:

открытый класс IMAPInputStream расширяет java.io.InputStream {}

открытый абстрактный класс Multipart {}

защищенный синхронизированный void Multipart::setMultipartDataSource(MultipartDataSource mp);

в то время как MultipartDataSource определяется как javax.mail.MultipartDataSource.

Другие вопросы по тегам