从Gmail中检索UnRead电子邮件 - JavaMail API + IMAP

Ali*_*oud 13 gmail imap jakarta-mail

现在我已经创建了一个代码来检索未读电子邮件并阅读其正文,然后我们可以存储或执行我们想做的任何事情.

它完全正常工作,但问题是它只给我第一个邮件的正文,而第二个它给了身体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();
                    }

    }

}
Run Code Online (Sandbox Code Playgroud)

输出 :

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)
Run Code Online (Sandbox Code Playgroud)

dka*_*arp 15

您正在使用相同的索引从列表中获取消息,以便从该消息中获取一部分.所以你从消息1中获取第1部分,从消息2获取第2部分等等.在某些时候,你会点击消息N,其中包含少于N个部分,然后你就得到了ArrayIndexOutOfBoundsException.

Multipart mp = (Multipart)messages[i].getContent();  
Object p = mp.getBodyPart(i).getContent();  
Run Code Online (Sandbox Code Playgroud)

此外,您假设所有邮件都是多部分的.第一次调用Message.getContent()非多部分消息时,您将获得一个,ClassCastException因为它很可能会返回给您String.

Multipart mp = (Multipart)messages[i].getContent();  
Run Code Online (Sandbox Code Playgroud)

同样,您假设是非嵌套的多部分.第一次收到multipart/mixed包含a multipart/alternative作为其第一个子部分的顶级消息时,该调用MimeBodyPart.getContent()将返回另一个Multipart,因此p.toString()将只返回一个Java对象标识符,而不是您想要的消息内容.

Object p = mp.getBodyPart(i).getContent();  
String q = p.toString();//object has the body content  
Run Code Online (Sandbox Code Playgroud)

要做到正确,您需要遍历消息结构并确定您关心的"正文"部分.