Не может привести 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.