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

Posted

技术标签:

【中文标题】从 Gmail 中检索未读电子邮件 - JavaMail API + IMAP【英文标题】:Retrieve UnRead Emails from Gmail - JavaMail API + IMAP 【发布时间】:2011-07-19 00:22:00 【问题描述】:

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

它完全可以工作,但问题是它只给了我第一封邮件的正文,而第二封邮件则给了我带有 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)

【问题讨论】:

我想知道这样的问题会得到 +11 而不是 -20(并以 13 加星标) 【参考方案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  

要做到这一点,您需要遍历消息结构并确定您关心的“正文”部分。

【讨论】:

以上是关于从 Gmail 中检索未读电子邮件 - JavaMail API + IMAP的主要内容,如果未能解决你的问题,请参考以下文章

JavaMail 使用 IMAP 读取最近的未读邮件

Gmail API 读取所有邮件而不是未读邮件

Gmail今日未读邮件书签

Gmail:如何快速将邮件全部已读

Gmail API 多个帐户

从 Outlook 检索电子邮件的脚本