3

在我的服务器中,我不断收到来自 gmail 的电子邮件。

我将它们作为 MimeMessage 类型接收。

到目前为止,我正在做的是使用以下方法提取正文:

private String getText(Part p) throws MessagingException, IOException {
    if (p.isMimeType("text/*")) {
      String s = (String) p.getContent();
      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;
}

我现在的问题是基于我收到的“回复”前一封电子邮件的电子邮件。当我提取这些电子邮件的文本时,我收到“X 写在 Y ...”,然后是所有以前的通信。我如何只获得新的响应文本?(没有以前的通信)?

谢谢。

4

2 回答 2

2

我确定这已经在 stackoverflow 上讨论过,但我会让你进行搜索......

简单的答案:没有标准的方法可以做到这一点。不同的邮件发送者选择不同的技术将原始消息的文本嵌入到回复消息中。有一些共同的约定,您可以编写启发式方法来识别这些约定,但由于它们是启发式方法,因此有时会失败。JavaMail 在这里没有任何帮助;这只是一个字符串处理问题。

于 2013-07-30T21:17:04.163 回答
2

Urbanleg 可能会迟到一升,但它可以帮助其他人。这段代码为我完成了这项工作。就像比尔说的那样,是与弦乐合作的作品。收件人的电子邮件地址始终在回复部分,用作参考。

public static String cleanReplyFromBodyEmail(String body, String emailAdress){
    if (!body.contains(emailAdress))
        return body;

    String bodyWoReply = body.split(emailAdress)[0];
    String[] bodyLines = bodyWoReply.split("\\n");
    if(bodyLines.length <= 1)
        bodyLines = bodyWoReply.split("\\r");
    String finalBody = "";
    for (int i=0; i < (bodyLines.length - 1); i++){
        finalBody += bodyLines[i] + "\n";
    }
    return finalBody;
}
于 2016-10-23T01:58:14.677 回答