使用java如何在使用javamail阅读pop3电子邮件时从中剥离html?

nc1teljy  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(351)

我需要让用户提交一封电子邮件到一个地址,将用于填充我的数据库中的实体。我的程序会定期检查收件箱中的新邮件,当它发现一个新邮件项目时,我需要使用主题、发件人、发送日期、附件和正文来填充db实体。我已经能够得到所有的字段,但我有麻烦的身体时,它包含html。我只需要存储邮件的文本。我想把尸体上所有的标签、签名等都去掉。除了正则表达式,还有更好的方法吗?
下面是我用来获取正文文本的函数。我的问题在于,当mimetype在函数的最后一部分碰到“multipart/*”情况时。函数返回html消息。除了regex之外,我能做些什么来去掉那个部分中的标签呢?

/**
 * 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]作为正则表达式。

iswrvxsc

iswrvxsc1#

可以使用jsoup之类的html解析器遍历html代码并提取所需的文本。
看一看:
http://jsoup.org/cookbook/introduction/parsing-a-document
http://jsoup.org/apidocs
http://jsoup.org/apidocs/org/jsoup/jsoup.html

相关问题