web-dev-qa-db-ja.com

Gmailから未読メールを取得する-JavaMailAPI + IMAP

これで、未読の電子メールを取得してその本文を読み取るコードを作成しました。これで、やりたいことを保存または実行できます。

完全に機能していますが、問題は、最初のメールの本文のみが表示され、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)
14

リストからメッセージを取得するのに、そのメッセージの一部を取得するのと同じインデックスを使用しています。したがって、メッセージ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  
_

それを正しく行うには、メッセージの構造をたどり、気になる「本文」の部分を決定する必要があります。

15
dkarp