Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > javamail getcontent


Автор: njoymsk 7.2.2012, 14:47
Привет.

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

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

Автор: mstalker26 7.2.2012, 15:56
проблемой прониклись  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/javax/mail/Part.html#getInputStream().

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

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

Автор: njoymsk 7.2.2012, 16:12
Спасибо за сочувствие)

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

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

Как разобрать полученное сообщение, а именно, его пользовательский текст, 
если к формату Mime оно не приводится из за ошибки (в первом посте)?

Автор: mstalker26 7.2.2012, 19:02
Цитата

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());
  }
}
...

Автор: njoymsk 8.2.2012, 10:42
Проблема в том что и на этой строчке 
Код

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

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

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

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

String subject = message.getSubject();

Для текущих нужд его вроде бы пока хватает..

Автор: jk1 8.2.2012, 11:27
Документация к 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-типа содержимого, тогда сразу станет ясно, как его читать.

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

javax.mail.jar : https://maven.java.net/content/repositories/releases/com/sun/mail/javax.mail/1.6.0-rc1/javax.mail-1.6.0-rc1.jar

activation.jar : https://maven.java.net/content/repositories/releases/com/sun/mail/android-activation/1.6.0-rc1/android-activation-1.6.0-rc1.jar

Так же есть описание проблемы http://www.oracle.com/technetwork/java/javamail/faq/index.html#castmultipart
Цитата

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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)