我正在查看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的评论,我还有一个问题,是否有任何情况我的代码版本会破坏?
答案 0 :(得分:1)
基本上有很多Multipart类型,它们都需要独特处理:
混合子类型
“multipart”的“混合”子类型适用于身体 零件是独立的,需要按特定顺序捆绑。 实现无法识别的任何“多部分”子类型 必须被视为属于“混合”的子类型。
替代子类型
“multipart / alternative”类型在语法上与 “multipart / mixed”,但语义不同。特别是, 每个身体部位都是相同的“替代”版本 信息。
系统应该认识到各个部分的内容是可以互换的。系统应根据本地环境和参考选择“最佳”类型,在某些情况下甚至通过用户交互。与“multipart / mixed”一样,身体部位的顺序也很重要。在这种情况下,替代方案的出现顺序是对原始内容的忠诚度增加。
通常,最佳选择是收件人系统本地环境支持的类型的最后部分。
例如,可以使用“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”格式只能看到花哨的版本, 而其他用户只会看到丰富的纯文本版本, 取决于他们系统的功能。
答案 1 :(得分:0)
使用multipart / mixed消息,您的代码将不会“工作”(对您而言意味着什么),其中最后一个附件的类型为text / *。是的,附件可以是text /*.