Получать непрочитанные письма из Gmail - JavaMail API + IMAP - PullRequest
13 голосов
/ 20 марта 2011

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

Он полностью работает, но проблема в том, что он дает мне только тело для первого письма, а для второго - тело с тегами 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 Ответ

15 голосов
/ 22 марта 2011

Вы используете тот же индекс, чтобы получить сообщение из своего списка, чтобы получить часть из этого сообщения. Итак, вы извлекаете часть 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  

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

...