基本上,我编写了一个从收件箱中读取电子邮件的应用程序。我一直使用从 Gmail 发送的电子邮件来测试该应用程序。但是现在当我尝试阅读从 Outlook 发送的电子邮件时,我没有收到任何内容。
我记录了两封电子邮件的内容类型: Gmail 返回:multipart/alternative; boundary=047d7b342bf2b6847f04d11df78a
Outlook 返回:text/html; charset=iso-8859-1
注意:这些是相同的电子邮件,只是从不同的邮件客户端发送的。
来自 Gmail 的邮件将是 Multipart 的一个实例。而 Outlook 电子邮件将是 String 的一个实例。
我的代码:
检查消息是多部分的实例还是字符串的方法。
public void getContent(Message msg) throws IOException, Exception {
Object contt = msg.getContent();
System.out.println("Contenttype: " + msg.getContentType());
if (contt instanceof Multipart) {
checkDisposition = true;
handleMultipart((Multipart) contt);
} else if (contt instanceof String) {
handlePart((Part) msg);
}
prepareEmail(mpMessage);
}
如果消息是多部分的,则将调用此方法:
public void handleMultipart(Multipart multipart)
throws MessagingException, IOException, Exception {
mpMessage = getText(multipart.getBodyPart(0));
for (int z = 1, n = multipart.getCount(); z < n; z++) {
handlePart(multipart.getBodyPart(z));
}
}
如果消息不是,这将直接调用:
public void handlePart(Part part)
throws MessagingException, IOException, Exception {
Object con = messageCopy.getContent();
String disposition = part.getDisposition();
String contentType = part.getContentType();
if (checkDisposition) {
if (disposition == null) {
System.out.println("Disposition is null");
} else if (disposition.equalsIgnoreCase(Part.ATTACHMENT)) {
System.out.println("Attachment: " + part.getFileName()
+ " : " + contentType);
input = part.getInputStream();
bytes = IOUtils.toByteArray(input);
} else if (disposition.equalsIgnoreCase(Part.INLINE)) {
System.out.println("Inline: "
+ part.getFileName()
+ " : " + contentType);
} else {
System.out.println("Other: " + disposition);
}
}else{
mpMessage = part.getContent().toString(); //returns nothing
System.out.println("mpMessage handlePart "+mpMessage); //returns nothing
System.out.println("mpMessage handlePart "+part.getLineCount()); //returns 0
System.out.println("mpMessage handlePart "+part.getContentType()); //returns text/html chartset=iso-8859-1
System.out.println("mpMessage handlePart "+part.getSize()); // returns 22334
part.writeTo(System.out); //See below
}
}
从部件返回文本的方法:
private String getText(Part p) throws
MessagingException, IOException {
System.out.println("getText contentType "+p.getContentType());
//This part gets called if trying to read an Outlook mail, its not clear for me how to retrieve the text from the part. Since `p.getContent()` returns nothing
if (p.isMimeType("text/*")) {
String s = (String) p.getContent();
System.out.println();
return String.valueOf(s);
}
if (p.isMimeType("multipart/alternative")) {
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")) {
String s = getText(bp);
if (s != null) {
return s;
}
}
}
return text;
}
return null;
}
part.writeTo(System.out)
返回:
收到:来自 AMSPRD0710HT005.eurprd07.prod.outlook.com 服务器 (TLS) id 00000;2012 年 12 月 20 日星期四 09:28:23 +0000 收到:来自 AMSPRD0710MB354.eurprd07.prod.outlook.com ([00.000.0000]) 由 AMSPRD0710HT005.eurprd07.prod.outlook.com ([00.000.0000]) 与 mapi编号 14.16.0245.002;2012 年 12 月 20 日星期四 09:28:05 +0000 从:测试到:支持主题:Verwerkingsverslag Kenmerk:0824496 主题:Verwerkingsverslag Kenmerk:0824496 主题索引:Ac3elFC2qYsSo+SOT2ii4HnbCCqgVw== 日期:2012 年 12 月 20 日星期四 10: 28:05 +0100 消息 ID:...
等等。
消息本身的内容作为 HTML 代码返回,而不仅仅是普通文本。
如何从 Outlook 电子邮件中检索纯文本,而不是 HTML 代码?或者如何在handlePart 中检索零件的内容?
任何帮助表示赞赏,
谢谢!