Используя Java, как мне удалить html из электронной почты pop3 при чтении с помощью javamail?

Мне нужно разрешить пользователям отправлять электронные письма на адрес, который будет использоваться для заполнения сущностей в моей базе данных. Моя программа будет периодически проверять папку «Входящие» на наличие новой почты, и когда она находит новый почтовый элемент, мне нужно использовать тему, от, дату отправки, вложения и тело для заполнения объектов БД. Мне удалось получить все поля, но у меня возникли проблемы с телом, когда оно содержит html. Мне просто нужно сохранить текст письма. Я хотел бы удалить все теги, подписи и т. д. с тела. Есть ли лучший способ сделать это, кроме регулярного выражения?

Вот функция, которую я использую для получения основного текста. Моя проблема заключается в том, что mimetype попадает в случай «multipart/*» в последней части функции. Функция возвращает html-сообщение. Что я могу сделать, чтобы удалить теги в этом разделе, кроме регулярных выражений?

    /**
 * Return the primary text content of the message.
 */
private String getText(Part p) throws MessagingException, IOException {
    if (p.isMimeType("text/*")) {
        String s = (String)p.getContent();
        textIsHtml = p.isMimeType("text/html");
        return s;
    }

    if (p.isMimeType("multipart/alternative")) {
        // prefer html text over plain text
        Multipart mp = (Multipart)p.getContent();
        String text = null;
        for (int i = 0; i < mp.getCount(); i++) {
            Part bp = mp.getBodyPart(i);
            if (bp.isMimeType("text/plain")) {
                if (text == null){
                    text = getText(bp);
                }
                continue;
            } 
            else if (bp.isMimeType("text/html")) {
                String s = getText(bp);
                if (s != null){
                    return s;
                }
            } 
            else {
                return getText(bp);
            }
        }
        return text;
    } 
    else if (p.isMimeType("multipart/*")) {
        Multipart mp = (Multipart)p.getContent();
        for (int i = 0; i < mp.getCount(); i++) {
            String s = getText(mp.getBodyPart(i));
            if (s != null)
                return s;
        }
    }
    return null;
}

Любая помощь очень ценится.

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

 else if (p.isMimeType("multipart/*")) {
        Multipart mp = (Multipart)p.getContent();
        for (int i = 0; i < mp.getCount(); i++) {
            String s = getText(mp.getBodyPart(i));
            Document doc = Jsoup.parse(s);
            String retText = doc.text();
            retText.replaceAll("[0%d0%a]", "<br />");
            if (retText != null)
                return retText;
        }
    }

Я также пробовал [\r\n] и [\n] в качестве регулярного выражения.


person steve.westfall    schedule 24.08.2012    source источник
comment
Возможный дубликат stackoverflow.com/questions/240546 /   -  person Samuel    schedule 24.08.2012
comment
Если я могу спросить, в чем причина желания удалить теги html? Почему бы просто не экранировать строку html и не сохранить ее как есть?   -  person StephenMeyer    schedule 24.08.2012
comment
Мне нужно удалить теги, потому что мне нужно сохранить только текст электронного письма для использования на других страницах приложения, где форматирование html будет мешать, и предпочтительнее простая текстовая строка.   -  person steve.westfall    schedule 24.08.2012


Ответы (1)


Вы можете использовать парсер HTML, такой как jsoup, чтобы просмотреть код HTML и извлечь только нужный текст.

Посмотри:

person davidbuzatto    schedule 24.08.2012
comment
У меня это работает, но по какой-то причине, когда я печатаю основной текст в командной строке, все разрывы строк отображаются как испанская á. Это просто проблема с печатью в командной строке? Я также пытаюсь использовать регулярное выражение, чтобы просто заменить á тегом ‹br /›, что приемлемо для моего решения, но, похоже, ничего не работает. - person steve.westfall; 24.08.2012
comment
Вы пытались отправить вывод в файл, чтобы посмотреть, что произойдет? - person davidbuzatto; 24.08.2012
comment
Хорошо, вывод в файл избавляет от испанского á. Тем не менее, он просто оставляет место на своем месте. Это начало, и я, возможно, смогу с этим поработать, хотя было бы предпочтительнее использовать ‹br /› вместо пробела. - person steve.westfall; 24.08.2012
comment
‹br/› — это тег, и когда вы берете только текст, ‹br/› будет удален. Я думаю, что при обходе можно обнаружить теги ‹br/› и использовать вместо них \n при извлечении текста, т.е. если текущий тег == ‹br/›, вернуть \n. - person davidbuzatto; 24.08.2012
comment
На самом деле я не пересекаю узлы. Я использую функцию Jsoup.parse() для получения объекта Document, а затем вызываю doc.text(), чтобы по существу удалить html. Возможно, я могу использовать метод java String replaceAll() в документе до получения текста? - person steve.westfall; 24.08.2012