JavaMail实战——内容解析,如何去除历史内容,只收取本次内容

    这个问题不太好描述,因此还原一下场景:

    看下面的邮件,这封邮件是对之前一封邮件的回复,因此在内容上就把之前邮件的内容也附加上了,那如果想只取本次邮件内容,该怎么做呢?

    笔者在JavaMail API和邮件协议上都没有找到好的解决办法,有对邮件协议深刻了解的同学可以赐教,本文通过对内容分析,结构整理,“总结”出一套解决方案,但方案并不完美。

1. 原始内容用blockquote标签包裹

 

实现即代码中的remove1

2. 原始内容用includetail标签包裹

实现即代码中的remove2

3. 邮件初始内容是纯文本不含有html标签

实现即 代码中的remove0

 

4. 通过与原始内容的连接点关键词

如“发件人”分析连接点,去除后面的内容,实现即代码中的remove3

 

完整代码如下

    public String getSimpleBodyText() {
        if (this.bodyText != null) {
            return remove(bodyText);
        }
        return bodyText;
    }

    public static String remove(final String content) {
        String content0 = content;
        content0 = remove1(content0);
        content0 = remove2(content0);
        if (content.equals(content0)) {
            content0 = remove0(content0);
        }
        content0 = remove3(content0);
        return content0;
    }

    public static String remove1(String content) {
        int index1 = content.indexOf("<blockquote");
        int index2 = content.lastIndexOf("blockquote>");
        if (index1 != -1 && index2 != -1) {
            logger.debug("remove1-blockquote:" + index1 + "," + index2);
            return content.substring(0, index1) + content.substring(index2 + "blockquote>".length());
        }
        return content;
    }

    public static String remove0(String content) {
        if (!content.trim().startsWith("<")) {
            logger.debug("remove0:");
            return content.substring(0, content.indexOf("<"));
        }
        return content;
    }

    public static String remove2(String content) {
        int index1 = content.indexOf("<includetail");
        int index2 = content.lastIndexOf("includetail>");
        if (index1 != -1 && index2 != -1) {
            logger.debug("remove2-includetail:" + index1 + "," + index2);
            return content.substring(0, index1) + content.substring(index2 + "includetail>".length());
        }
        return content;
    }

    public static String remove3(String content) {
        int index1 = -1;
        int index2 = -1;
        try {
            Parser parser = new Parser(content);
            NodeFilter pFilter = new TagNameFilter("div");
            NodeList nodeList = parser.parse(pFilter);
            SimpleNodeIterator elements = nodeList.elements();
            while (elements.hasMoreNodes()) {
                Node node = elements.nextNode();
                String html = node.toHtml();
                if (node.toString().contains("WordSection1")) {
                    index2 = node.getStartPosition() + html.length();
                    continue;
                }
                if (node.toString().contains("Section1")) {
                    index2 = node.getStartPosition() + html.length();
                    continue;
                }
                if (node.toString().contains("mailContentContainer")) {
                    index2 = node.getStartPosition() + html.length();
                    continue;
                }
                if (html.contains("发件人") || html.contains("From")) {
                    if (node.getStartPosition() > 0) {
                        index1 = node.getStartPosition();
                        if (index2 == -1) {
                            if (node.getParent() != null && node.getParent().getLastChild() != null) {
                                Node lastChild = node.getParent().getLastChild();
                                index2 = lastChild.getStartPosition() + lastChild.toHtml().length();
                            }
                        }
                        break;
                    }
                }
            }
        } catch (ParserException e) {
            e.printStackTrace();
        }
        if (index1 != -1 && index2 != -1) {
            logger.debug("remove3-发件人/From:" + index1 + "," + index2);
            return content.substring(0, index1) + content.substring(index2);
        }
        return content;
    }

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
可以使用 JavaMail API 的 MimeMessage 类和相关类来解析邮件内容去除引用内容部分。以下是一个示例代码: ```java import javax.mail.*; import javax.mail.internet.*; import java.io.IOException; import java.util.regex.Pattern; public class EmailParser { private static final Pattern QUOTE_PATTERN = Pattern.compile("(?m)^>.*$\n?"); public static String parseEmailContent(Message message) throws MessagingException, IOException { Object contentObject = message.getContent(); if (contentObject instanceof Multipart) { Multipart multipart = (Multipart) contentObject; StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < multipart.getCount(); i++) { BodyPart bodyPart = multipart.getBodyPart(i); String disposition = bodyPart.getDisposition(); if (disposition != null && (disposition.equalsIgnoreCase(BodyPart.ATTACHMENT))) { // do nothing, skip attachments } else { String body = (String) bodyPart.getContent(); stringBuilder.append(removeQuotedText(body)); } } return stringBuilder.toString(); } else if (contentObject instanceof String) { return removeQuotedText((String) contentObject); } else { return ""; } } private static String removeQuotedText(String text) { return QUOTE_PATTERN.matcher(text).replaceAll(""); } } ``` 这个示例代码中,我们使用 MimeMessage 对象获取邮件内容。如果邮件内容是一个 Multipart 对象,我们就需要遍历它的所有 BodyPart 对象,将它们的内容合并并去除引用内容部分。如果邮件内容是一个字符串,我们就直接去除引用内容部分。最后返回处理后的邮件内容字符串。 在去除引用内容部分时,我们使用了一个正则表达式来匹配邮件中的引用部分。这个正则表达式可以匹配以 ">" 开头的行,并将其删除。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值