我从客户端收到电子邮件,他们在multipart / mixed消息中嵌套了multipart / alternative消息。当我得到消息的正文时,它只返回multipart / alternative级别,而我真正想要的是包含在multipart / alternative中的text / html部分。
我已经查看了javax.mail的javadocs,我找不到一个简单的方法来获取bodypart的主体,它本身就是一个多部分或跳过第一个multipart / mixed部分并进入multipart / alternative正文阅读text / html和text / plain pieces。
电子邮件结构如下所示:
...
Content-Type: multipart/mixed;
boundary="----=_Part_19487_1145362154.1418138792683"
------=_Part_19487_1145362154.1418138792683
Content-Type: multipart/alternative;
boundary="----=_Part_19486_1391901275.1418138792683"
------=_Part_19486_1391901275.1418138792683
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset=ISO-8859-1
...
------=_Part_19486_1391901275.1418138792683
Content-Transfer-Encoding: 7bit
Content-Type: text/html; charset=ISO-8859-1
...
------=_Part_19486_1391901275.1418138792683--
------=_Part_19487_1145362154.1418138792683--
这是用于解析电子邮件的代码大纲:
Message [] found = fldr.search(searchCondition);
for (int i = 0; i < found.length; i++) {
Message m = found[i];
Object o = m.getContent();
if (o instanceof Multipart) {
log.info("**This is a Multipart Message. ");
Multipart mp = (Multipart)o;
log.info("The Multipart message has " + mp.getCount() + " parts.");
for (int j = 0; j < mp.getCount(); j++) {
BodyPart b = mp.getBodyPart(j);
// Loop if the content type is multipart then get the content that is in that part,
// make it the new container and restart the loop in that part of the message.
if (b.getContentType().contains("multipart")) {
mp = (Multipart)b.getContent();
j = 0;
continue;
}
log.info("This content type is " + b.getContentType());
if(!b.getContentType().contains("text/html")) {
continue;
}
Object o2 = b.getContent();
if (o2 instanceof String) {
<do things with content here>
}
}
}
}
它似乎一直停留在第二个边界,而不是进一步解析任何东西。在上述消息的情况下,它在boundary =“---- = _ Part_19486_1391901275.1418138792683”处停止,并且永远不会到达消息的文本。
答案 0 :(得分:3)
在这个块中:
if (b.getContentType().contains("multipart"))
{
mp = (Multipart)b.getContent();
j = 0;
continue;
}
您将j
设置为0并要求循环继续,希望它将从零开始。但是增量操作j++
将在之前出现,你的循环将从1开始,而不是0.
将j
设置为-1以解决您的问题。
if (b.getContentType().contains("multipart"))
{
mp = (Multipart)b.getContent();
j = -1;
continue;
}
答案 1 :(得分:1)
我已经测试了你的代码,但也失败了。
在我的情况下,b.getContentType()
返回所有大写字符(例如&#34; TEXT / HTML; charset = UTF-8&#34;)。所以我把它转换成小写并且它有效。
String contentType=b.getContentType().toLowerCase(Locale.ENGLISH);
if(!contentType.contains("text/html")) {
continue;
}