Анализ текстовых/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
добавлено отредактировано
Просмотры: 1
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, источник