Получать непрочитанные письма из Gmail - JavaMail API + IMAP

Теперь я создал код для извлечения непрочитанной электронной почты и чтения ее тела, а затем мы можем хранить или делать все, что захотим.

Он полностью работает, но проблема в том, что он дает мне только тело для первого письма, а для второго - тело с тегами html.

Я использую JavaMail API...

Как я могу сделать??

Заранее спасибо.

С наилучшими пожеланиями, Али

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 из сообщения 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  

Чтобы сделать это правильно, вам нужно пройтись по структуре сообщения и определить ту часть тела, которая вам нужна.

Другие вопросы по тегам