Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> javamail getcontent, выдает ошибку при получении multipart 
:(
    Опции темы
njoymsk
Дата 7.2.2012, 14:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.2.2012

Репутация: нет
Всего: нет



Привет.

Такая ошибка. Забираю сообщение с сервера.
При выполнении кода 

String contentType = message.getContent();

Получаю multipart/alternative

Мне нужно получить текст сообщения.
Выполняю код 

MimeMessage mimeMessage = (MimeMessage) message.getContent();

Получаю ошибку:

javax.mail.util.SharedByteArrayInputStream cannot be cast to javax.mail.Multipart 

Но могу сообщение записать в файл методом writeto (см.файл)

Какие варианты обойти ошибку и получить содержимое?
Парсить руками совсем не хотелось бы. 

Спасибо если вы прониклись моей проблемой, готов ответить на все вопросы. smile 

Использую javamail 1.4.4


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  message.txt 3,03 Kb
PM MAIL   Вверх
mstalker26
Дата 7.2.2012, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 4.7.2009

Репутация: 4
Всего: 11



проблемой прониклись  smile. На будущее не стесняйтесь выкладывать код, который не работает. Почитайте внимательно Javadoc к методу getContent() 
Код

... For content-types that are unknown to the DataHandler system, an input stream is returned as the content ...


Попробуйте считать методом getInputStream() http://javamail.kenai.com/nonav/javadocs/j...etInputStream().

Пример (на скорую руку)
Код

...
InputStream stream = message.getInputStream();
while (stream.available() != 0) {
  // stream.read()
  System.out.print((char) stream.read());
}
...

--------------------
Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
PM   Вверх
njoymsk
Дата 7.2.2012, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.2.2012

Репутация: нет
Всего: нет



Спасибо за сочувствие)

Метод getInputStream() я пробовал и все работает.
Получаю все символы сообщения (смотреть вложенный файл к первому посту), в том числе и заголовки, кодировки, тегиб, id. В общем информация вроде в структурированном виде, но инструмент для создания объекта из этих данных не работает((.

Вопрос, наверно, больше заключается, вот в чем:

Как разобрать полученное сообщение, а именно, его пользовательский текст, 
если к формату Mime оно не приводится из за ошибки (в первом посте)?
PM MAIL   Вверх
mstalker26
Дата 7.2.2012, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 206
Регистрация: 4.7.2009

Репутация: 4
Всего: 11



Цитата

MimeMessage mimeMessage = (MimeMessage) message.getContent();

если у Вас тип multipart/alternative, кастуйте не к MimeMessage, а к Multipart.
Пример (приблизительно)
Код

...
Multipart multipart = (Multipart) msg[i].getContent();
for (int i = 0; i < multipart.getCount(); i++) {
  BodyPart bodyPart = multipart.getBodyPart(i);
  String disposition = bodyPart.getDisposition();
  if (disposition != null && (disposition.equals(BodyPart.ATTACHMENT))) {
    System.out.println("Mail have some attachment : ");
    DataHandler handler = bodyPart.getDataHandler();
    System.out.println("file name : " + handler.getName());
  } else {
    System.out.println(bodyPart.getContent());
  }
}
...

--------------------
Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
PM   Вверх
njoymsk
Дата 8.2.2012, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 7.2.2012

Репутация: нет
Всего: нет



Проблема в том что и на этой строчке 
Код

Multipart multipart = (Multipart) msg[i].getContent();

я получаю ошибку:
javax.mail.util.SharedByteArrayInputStream cannot be cast to javax.mail.Multipart

Таким образом есть возможность преобразовать письмо в текст из InputStream, но как парсить его руками я не представляю.
А получить какой то структурированный объект я не могу(

Пока обошелся заголовком сообщения
Код

String subject = message.getSubject();

Для текущих нужд его вроде бы пока хватает..
PM MAIL   Вверх
jk1
Дата 8.2.2012, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 40
Всего: 75



Документация к getContent довольно однозначна в этом вопросе

Цитата

Return the content as a Java object. The type of the returned object is of course dependent on the content itself. For example, the object returned for "text/plain" content is usually a String object. The object returned for a "multipart" content is always a Multipart subclass. For content-types that are unknown to the DataHandler system, an input stream is returned as the content


То есть тип возвращаемого значения зависит от типа контента. Про "multipart/alternative" уже писалось выше, но судя по тому, что возвращается поток, это не Ваш случай. Начните с выяснения Mime-типа содержимого, тогда сразу станет ясно, как его читать.


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
BrykAlien
Дата 5.5.2017, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 5.5.2017

Репутация: нет
Всего: нет



Понятно что занимаюсь эксгумацией старой темы, но её яндех выдаёт одной из первых при запросе. А ответа нет.
Мне помогла замена всех .jar - файлов Javamail API на версию 1.6.0-rc1:

javax.mail.jar : https://maven.java.net/content/repositories...l-1.6.0-rc1.jar

activation.jar : https://maven.java.net/content/repositories...n-1.6.0-rc1.jar

Так же есть описание проблемы тут
Цитата

Q: When reading a multipart message, why is the getContent method returning an IMAPInputStream (or SharedByteArrayInputStream) instead of a MimeMultipart object? 
A: This usually happens because the JavaBeans Activation Framework (JAF) can't find the mailcap configuration file included in the mail.jar file. JAF uses the thread's context class loader to look for the configuration file. If the context class loader is not set properly, this can fail. Most application servers should set the context class loader properly, but at least some versions of Tomcat do not. One workaround is to put the mail.jar file in Tomcat's lib directory instead of including it in the war file. Another workaround is to add code such as the following to the beginning of your application:
> Thread.currentThread().setContextClassLoader(this.getClass().getClassLoader());
And of course you should always make sure the message you're dealing with is a multipart message before calling the getContent method, using something like 
> if (msg.isMimeType("multipart/*"))
as described above and in this example.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1466 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.