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

使用Java在使用javamail阅读pop3电子邮件时,如何从中剥离html?,java,regex,jakarta-mail,pop3,strip-tags,Java,Regex,Jakarta Mail,Pop3,Strip Tags,我需要让用户向一个地址提交电子邮件,该地址将用于填充我数据库中的实体。我的程序将定期检查收件箱中的新邮件,当它发现新邮件项目时,我需要使用主题、发件人、发送日期、附件和正文来填充DB实体。我已经能够获得所有的字段,但是当正文包含html时,我遇到了麻烦。我只需要存储电子邮件的文本。我想去掉身体上的所有标签、签名等。除了正则表达式,还有更好的方法吗 /** * Return the primary text content of the message. */ private Stri

我需要让用户向一个地址提交电子邮件,该地址将用于填充我数据库中的实体。我的程序将定期检查收件箱中的新邮件,当它发现新邮件项目时,我需要使用主题、发件人、发送日期、附件和正文来填充DB实体。我已经能够获得所有的字段,但是当正文包含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;
}
下面是我用来获取正文文本的函数。我的问题在于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]作为我的正则表达式。

您可以使用一些HTML解析器来遍历HTML代码并提取所需的文本

看一看:


您可以使用一些HTML解析器来遍历HTML代码并提取所需的文本

看一看:


可能重复的如果我可以问,什么是想要删除html标记的原因?为什么不转义html字符串并按原样存储呢?我需要删除标记,因为我只需要存储电子邮件的文本,以便在应用程序的其他页面中使用,html格式将受到阻碍,并且首选简单的文本字符串。如果我可能问,删除html标记的原因是什么?为什么不转义html字符串并按原样存储呢?我需要删除标记,因为我只需要存储电子邮件的文本,以便在应用程序的其他页面中使用,html格式将受到阻碍,而简单的文本字符串是首选。我有点这样做了,但出于某种原因,当我将正文打印到命令行时,所有换行符都显示为西班牙语字符。这只是打印到命令行的问题吗?我还尝试使用regex简单地用我的解决方案可以接受的标记替换á,但似乎没有任何效果。您是否尝试将输出发送到文件以查看发生了什么?好的,将输出发送到文件可以消除西班牙语á。然而,它只是在它的位置上留下了一个空间。这是一个开始,我可能可以用它来工作,尽管我更喜欢用一个而不是一个空间。是一个标记,当您仅获取文本时,将被删除。我认为在遍历过程中,您可以检测到标记并在文本提取过程中在其位置使用一个\n,即,如果当前标记==,则返回\n。我实际上没有遍历节点。我正在使用Jsoup.parse函数获取文档对象,然后调用doc.text从本质上剥离html。也许我可以在获取文本之前在文档上使用java String replaceAll方法?我有点成功了,但是由于某种原因,当我将正文文本打印到命令行时,所有的换行符都显示为西班牙语字符。这只是打印到命令行的问题吗?我还尝试使用regex简单地用我的解决方案可以接受的标记替换á,但似乎没有任何效果。您是否尝试将输出发送到文件以查看发生了什么?好的,将输出发送到文件可以消除西班牙语á。然而,它只是在它的位置上留下了一个空间。这是一个开始,我可能可以用它来工作,尽管我更喜欢用一个而不是一个空间。是一个标记,当您仅获取文本时,将被删除。我认为在遍历过程中,您可以检测到标记并在文本提取过程中在其位置使用一个\n,即,如果当前标记==,则返回\n。我实际上没有遍历节点。我正在使用Jsoup.parse函数获取文档对象,然后调用doc.text从本质上剥离html。也许我可以在获取文本之前对文档使用java String replaceAll方法?