gpt4 book ai didi

java - 为什么要在 javamail 中迭代多部分电子邮件中的各个部分?

转载 作者:行者123 更新时间:2023-11-30 06:51:43 25 4
gpt4 key购买 nike

我正在看那个javamail faqs ,我正在查看这个应该提取电子邮件正文的片段:

    private boolean textIsHtml = false;

/**
* 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;
}

现在代码可以重构为以下版本,基本上代码行数更少:

    private static String getText(Part message) {
String text = null;

try {
if (message.isMimeType("text/*")) {
text = (String) message.getContent();
}

if (message.isMimeType("multipart/alternative") || message.isMimeType("multipart/*")) {
Multipart multiPart = (Multipart) message.getContent();
Part bodyPart = multiPart.getBodyPart(multiPart.getCount() - 1);
text = getText(bodyPart);
}
} catch (Exception e) {
logger.error(e.getMessage());
}

return text;
}

我的问题是,为什么旧​​代码会循环遍历 multipart/alternativemultipart/* 消息的各个部分?我在这里错过了什么吗?

更新:

刚刚看到 Jon 的评论,我还有一个问题,我的代码版本是否会出现故障?

最佳答案

基本上有很多 Multipart 类型,它们都需要单独处理:

混合子类型

“multipart”的“混合”子类型旨在当主体 部件是独立的,需要按特定顺序捆绑。 实现无法识别的任何“多部分”子类型 必须被视为“混合”子类型。

替代子类型

“multipart/alternative”类型在语法上与 “multipart/mixed”,但语义不同。尤其, 每个 body 部位都是相同部位的“替代”版本 信息。

系统应该认识到各个部分的内容是可以互换的。系统应根据本地环境和引用(在某些情况下甚至通过用户交互)选择“最佳”类型。与“多部分/混合”一样, body 部位的顺序很重要。在这种情况下,替代方案按照对原始内容的忠实度逐渐增加的顺序出现。

一般来说,最好的选择是接收系统本地环境支持的类型的最后部分。

“Multipart/alternative”可以用于例如发送消息 以一种精美的文本格式,可以轻松显示 任何地方:

 From: Nathaniel Borenstein <nsb@bellcore.com>
To: Ned Freed <ned@innosoft.com>
Date: Mon, 22 Mar 1993 09:41:09 -0800 (PST)
Subject: Formatted text mail
MIME-Version: 1.0
Content-Type: multipart/alternative; boundary=boundary42

--boundary42
Content-Type: text/plain; charset=us-ascii

... plain text version of message goes here ...

--boundary42
Content-Type: text/enriched

... RFC 1896 text/enriched version of same message
goes here ...

--boundary42
Content-Type: application/x-whatever

... fanciest version of same message goes here ...

--boundary42--

在此示例中,邮件系统理解的用户 “application/x-whatever”格式只会看到精美的版本, 而其他用户只会看到丰富或纯文本版本, 取决于其系统的功能。

关于java - 为什么要在 javamail 中迭代多部分电子邮件中的各个部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42636334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com