Подтвердить что ты не робот

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

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

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

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

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

Спасибо заранее.

С уважением, Али

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)
4b9b3361

Ответ 1

Вы используете тот же самый индекс, чтобы получить сообщение из своего списка, чтобы получить часть от этого сообщения. Итак, вы извлекаете часть 1 из сообщения 1, часть 2 из сообщения 2 и т.д. В какой-то момент вы нажмете сообщение N, в котором будет меньше N частей, и вы получите ArrayIndexOutOfBoundsException.

Multipart mp = (Multipart)messages[i].getContent();  
Object p = mp.getBodyPart(i).getContent();  

Кроме того, вы предполагаете, что все ваши сообщения являются множественными. В первый раз, когда вы вызываете Message.getContent() в не-multipart сообщение, вы получите 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  

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