java为什么要在javamail中迭代多部分电子邮件中的部分?
我在看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/alternative
和multipart/*
消息的部分之间循环?我错过什么了吗
更新:
刚刚看到Jon的评论,我还有一个问题,我的代码版本是否会在任何情况下崩溃
# 1 楼答案
基本上有许多多部分类型,它们都需要唯一地处理:
混合亚型
“multipart”的“mixed”(混合)子类型旨在用于 零件是独立的,需要按特定顺序捆绑。 实现无法识别的任何“多部分”子类型 必须被视为“混合”亚型
替代亚型
“multipart/alternative”类型在语法上与 “多部分/混合”,但语义不同。特别地, 每一个身体部位都是相同的“替代”版本 信息
系统应认识到各个部分的内容是可互换的。系统应根据本地环境和参考选择“最佳”类型,在某些情况下甚至通过用户交互。与“多部分/混合”一样,身体部位的顺序也很重要。在这种情况下,备选方案的出现顺序是增加对原始内容的忠实度
一般来说,最佳选择是接收方系统本地环境支持的类型的最后一部分
例如,可以使用“多部分/备选方案”来发送消息 以一种奇特的文本格式,以便于显示 任何地方:
在本例中,其邮件系统理解 “application/x-whatever”格式只能看到花哨的版本, 而其他用户只能看到丰富版或纯文本版, 取决于他们系统的能力
# 2 楼答案
对于最后一个附件类型为text/*的多部分/混合消息,您的代码将无法“工作”(无论这对您意味着什么)。是的,附件可以是text/*