代码之家  ›  专栏  ›  技术社区  ›  steve.westfall

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

  •  1
  • steve.westfall  · 技术社区  · 12 年前

    我需要让用户向一个地址提交一封电子邮件,该地址将用于填充我的数据库中的实体。我的程序会定期检查收件箱中的新邮件,当它发现新邮件时,我需要使用主题、发件人、发送日期、附件和正文来填充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]作为正则表达式。

    1 回复  |  直到 12 年前
        1
  •  4
  •   davidbuzatto    12 年前