これで、未読の電子メールを取得してその本文を読み取るコードを作成しました。これで、やりたいことを保存または実行できます。
完全に機能していますが、問題は、最初のメールの本文のみが表示され、2番目のメールの本文にはhtmlタグが表示されることです。
JavaMailAPIを使用しています...
どのようにできるのか??
前もって感謝します。
よろしく、ALi
package pack1;
//import the necessary classes
import Java.io.IOException;
import Java.util.Properties;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.search.FlagTerm;
public class InboxReader {
public static void main(String args[]) {
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
try {
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("imap.gmail.com", "mail", "pass");
System.out.println(store);
Folder inbox = store.getFolder("Inbox");
inbox.open(Folder.READ_ONLY);
//Message messages[] = inbox.getMessages();
FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
Message messages[] = inbox.search(ft);
int i =0;
for(Message message:messages)
{
Multipart mp = (Multipart)messages[i].getContent();
Object p = mp.getBodyPart(i).getContent();
String q = p.toString();//object has the body content
System.out.println(q);//prints the body
System.out.println( messages[i].getSubject()+ " \n"+i);i++;
}
} catch (NoSuchProviderException e) {
e.printStackTrace();
System.exit(1);
} catch (MessagingException e) {
e.printStackTrace();
System.exit(2);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
出力 :
a
a
0
<div dir="ltr">b<br>
</div>
b
1
Exception in thread "main" Java.lang.ArrayIndexOutOfBoundsException: 2 >= 2
at Java.util.Vector.elementAt(Unknown Source)
at javax.mail.Multipart.getBodyPart(Multipart.Java:156)
at javax.mail.internet.MimeMultipart.getBodyPart(MimeMultipart.Java:258)
at pack1.InboxReader.main(InboxReader.Java:39)
リストからメッセージを取得するのに、そのメッセージの一部を取得するのと同じインデックスを使用しています。したがって、メッセージ1からパート1をフェッチし、メッセージ2からパート2をフェッチします。ある時点で、N個未満のパーツを持つメッセージNにヒットし、ArrayIndexOutOfBoundsException
を取得します。
_Multipart mp = (Multipart)messages[i].getContent();
Object p = mp.getBodyPart(i).getContent();
_
また、すべてのメッセージがマルチパートであると想定しています。マルチパート以外のメッセージで初めてMessage.getContent()
を呼び出すと、代わりにClassCastException
が返される可能性が高いため、String
が返されます。
_Multipart mp = (Multipart)messages[i].getContent();
_
同様に、ネストされていないマルチパートを想定しています。最初のサブパートとして_multipart/mixed
_を含むトップレベルの_multipart/alternative
_を含むメッセージを初めて受信したとき、MimeBodyPart.getContent()
を呼び出すと別のMultipart
が返されます。 p.toString()
は、必要なメッセージコンテンツではなく、Javaオブジェクト識別子を返すだけです。
_Object p = mp.getBodyPart(i).getContent();
String q = p.toString();//object has the body content
_
それを正しく行うには、メッセージの構造をたどり、気になる「本文」の部分を決定する必要があります。