【问题标题】:Extract only text part of email body using javamail, without html content使用 javamail 仅提取电子邮件正文的文本部分,不提取 html 内容
【发布时间】:2015-07-15 10:55:28
【问题描述】:

在我的项目中,我需要使用 javamail 从 MS Exchange 邮箱读取邮件并将其内容保存在硬盘驱动器中。但是我发现即使是我收到的最简单的电子邮件也保存了html的内容,比如headbody等等,即使我只写了两个带格式的单词,没有图像,没有附件。但我只想要电子邮件的文本。

部分代码:

Object content = part.getContent();
if (content instanceof InputStream || content instanceof String) {
        if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition()) || 
            StringUtils.isNotBlank(part.getFileName())) {
    String messageBody = part.getContent().toString();
....(write this string to files)
    }  
}

我可以写:

Hello world.

我得到一个包含所有 html 代码的 txt,以及 fontface<html> 等标签。

我看到this question,我发现他只检索文本内容,但我不能在那里发表评论,所以我必须发布一个新问题,我看不出我的代码和他的代码有什么区别。他写道:

if (disposition != null && (disposition.equals(BodyPart.ATTACHMENT))) {


    DataHandler handler = bodyPart.getDataHandler();

    s1 = (String) bodyPart.getContent();`

那么是关于DataHandler 吗?但它没有在任何地方使用? 有人可以帮忙吗?

【问题讨论】:

    标签: html jakarta-mail plaintext


    【解决方案1】:

    首先,您需要阅读此 JavaMail FAQ 条目,该条目告诉您如何使用find the main message body。如所写,在消息包含两者的情况下,它更喜欢 html 正文而不是纯文本正文。应该清楚如何扭转这种偏好。

    但是,并非所有邮件都包含邮件正文的 html 和纯文本版本。如果您只获得 html,您将不得不编写自己的代码来处理字符串并删除 html 标签,或者使用其他产品来处理 html 并删除标签。

    【讨论】:

    • 感谢您的评论,但我不明白为什么订单在您发布的链接中意味着什么。并更改if - else 的顺序会更改首选项和输出?你能再详细说明一下吗?
    • 根据定义 multipart/alternative 的 RFC 2046,替代品的出现顺序是增加对原始内容的忠实度。这意味着您会在 text/html 之前找到 text/plain。如果您更喜欢 text/plain,则可以更改该代码以在找到 text/plain 内容后立即返回;无需继续寻找其他身体部位。
    • 好的,谢谢。我决定将整个消息检索为 html,因为它包含更多信息。我更喜欢保持电子邮件的结构,而不是弄乱所有的文本。
    • 最后我用了Jsoup,效果很好。诀窍是,您必须先手动删除 <head> 部分,其余的由 Jsoup 完成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-19
    • 2013-04-05
    • 1970-01-01
    • 2011-05-15
    • 2016-02-15
    相关资源
    最近更新 更多