基本的に、受信トレイからメールを読み取るアプリケーションを作成しました。私はいつもGmailから送信された電子メールでアプリケーションをテストしてきました。しかし、Outlookから送信された電子メールを読み込もうとすると、コンテンツが返されません。
両方の電子メールからコンテンツタイプを記録しました:Gmailの戻り値:multipart/alternative; boundary=047d7b342bf2b6847f04d11df78a
Outlookの戻り値:text/html; charset=iso-8859-1
注:これらは同じ電子メールであり、異なるメールクライアントから送信されたものです。
GmailからのメールはMultipartのインスタンスになります。Outlookの電子メールは文字列のインスタンスになりますが。
私のコード:
メッセージがMultipartまたは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)ID00000から。2012年12月20日木曜日09:28:23+0000受信:AMSPRD0710MB354.eurprd07.prod.outlook.com([00.000.0000])からAMSPRD0710HT005.eurprd07.prod.outlook.com([00.000.0000])とmapi id 14.16.0245.002; 2012年12月20日木曜日09:28:05+0000差出人:テスト宛先:サポート件名:Verwerkingsverslag Kenmerk:0824496スレッドトピック:Verwerkingsverslagケンメルク:0824496スレッドインデックス:Ac3elFC2qYsSo + SOT2ii4HnbCCqgVw ==日付:2012年12月20日木曜日10: 28:05 +0100メッセージID:..。
等々。
メッセージ自体のコンテンツは、通常のテキストだけでなく、HTMLコードとして返されます。
HTMLコードではなく、Outlookの電子メールからプレーンテキストを取得するにはどうすればよいですか?または、handlePartでパーツのコンテンツを取得するにはどうすればよいですか?
どんな助けでもありがたいです、
ありがとう!