Анализ текстовых/html-данных с помощью JavaMail

Я написал приложение, в котором я получаю сообщение и проверяю его содержимое:

public void getInhoud(Message msg) throws IOException, Exception {
    Object contt = msg.getContent();
    ...
    if (contt instanceof String) {
          handlePart((Part) msg);
    }
    ...
}

public void handlePart(Part part)
        throws MessagingException, IOException, Exception {

    ByteArrayOutputStream out = new ByteArrayOutputStream();
    String contentType = part.getContentType();
    ...
    if ((contentType.length() >= 9)
            && (contentType.toLowerCase().substring(
            0, 9).equals("text/html"))) {
        part.writeTo(out);
        String stringS = out.toString();
    }
    ...
}

Я удалил ненужный код. Эти методы работают для электронной почты, которая была отправлена ​​из Gmail, Hotmail и рабочего стола Outlook, но почему-то не работает с сообщениями электронной почты, которые были отправлены с веб-клиента Office 365. Для каждого другого клиента тип контента будет «простым/текстовым», но только для почты Office 365 это будет text/html . Он записывает данные Part в ByteArrayOutputStream , который затем будет преобразован в String . Это работает, ну, как правило, String будет содержать содержимое части. Но содержащийся в нем HTML несколько ошибочен.

Вот пример: http://pastebin.com/5mEYCHxD (отправлено в Pastebin, оно довольно большое).

Обратите внимание на символы = , которые печатаются в конце почти каждой строки. Это то, что я могу исправить внутри кода, или он должен быть где-то в почтовом клиенте?

Я подумал о том, чтобы прокручивать каждую строку HTML и удалять = после проверки, что это не часть HTML-тега.

Любая помощь очень ценится, это беспокоило меня уже несколько недель.

Благодаря!

1
nl ja de

1 ответы

Это звучит так же, как цитируемый печатный код :

Линии закодированных кадровых данных не должны содержать более 76 символов. Чтобы удовлетворить это требование без изменения кодированного текста, мягкие разрывы строк могут быть добавлены по желанию. Разрыв мягкой строки состоит из «=» в конце закодированной строки и не отображается как разрыв строки в декодированном тексте.

Метод writeTo , похоже, также записывает кодированный контент, кажется, вам нужно скопировать потоки самостоятельно. getInputStream описывается как возвращение декодированного InputStream.

1
добавлено
Помните, что InputStream возвращает bytes , но StringWriter записывает символы . По крайней мере, вам нужно будет указать, какую кодировку символов следует использовать для преобразования потока байтов в поток символов, который вы можете получить из параметра «charset» Content-Type для части. Я не знаю, что делает IOUtils.copy, но пытаюсь самостоятельно прочитать поток.
добавлено автор Bill Shannon, источник
Это очень полезная информация, спасибо за это! Я попытался получить InputStream части, подобной этой: InputStream partInput = part.getInputStream (); StringWriter writer = new StringWriter (); IOUtils.copy (partInput, writer); Строка stringS = writer.toString (); Но каким-то образом InputStream пуст, любые идеи, что пошло не так?
добавлено автор Jef, источник
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Верстка сайтов HTML/CSS/JS/PHP
Верстка сайтов HTML/CSS/JS/PHP
3 439 участник(ов)

Правила группы: напишите !rules в чате. Группа Вк: vk.com/web_structure Freelancer: @web_fl Веб Дизайн: @dev_design Маркетолог: @topmarkening Автор: @M_Boroda

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Чат — Типичный Верстальщик
Чат — Типичный Верстальщик
1 080 участник(ов)

Основной канал: @tpverstak Обратная связь: @annblok Все ссылки на соц.сети проекта: http://taplink.cc/tpverstak ПРАВИЛА ЧАТА — https://teletype.in/@annblok/BygPgC3E7

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Веб-Технологи: UI/UX, Вёрстка, Фронтенд
Веб-Технологи: UI/UX, Вёрстка, Фронтенд
167 участник(ов)

Всё про веб-дизайн и вёрстку. А также: HTML, CSS, флекс и бутстрапы, шаблонизаторы, препроцессоры, методологии, аглифаеры, улучшаторы и обфускаторы. Обсуждаем темы юзабилити, устраиваем А/В тесты лендингов, и проводим аудит.

DTP :: @DTPublish
DTP :: @DTPublish
147 участник(ов)

Обсуждаемые темы: полиграфия, препресс, верстка, дизайн, иллюстрации, скрипты, плагины. Канал - @DTPublishing

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async