当前位置: 首页 > 面试题库 >

使用具有POP3协议的javamail检索所有未读的电子邮件

佴英奕
2023-03-14
问题内容

我正在尝试访问我的Gmail帐户,并从中检索所有未读电子邮件的信息。

我在引用了许多链接之后编写了代码。我提供一些链接供参考。


使用Java通过GMail帐户发送和接收电子邮件

使用JavaMailAPI接收邮件的Java代码

为了测试我的代码,我创建了一个Gmail帐户。因此,我收到了来自Gmail的4封邮件。检查邮件数量后,我运行我的应用程序。那显示了正确的结果。4封未读邮件。显示所有信息(例如,日期,发件人,内容,主题等)

然后,我登录到新帐户,阅读其中一封电子邮件,然后重新运行我的应用程序。现在,未读邮件数应该为3,但是显示“未读邮件数:0”

我在这里复制代码。

public class MailReader

{

    Folder inbox;

    // Constructor of the calss.

    public MailReader() {
        System.out.println("Inside MailReader()...");
        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

        /* Set the mail properties */

        Properties props = System.getProperties();
        // Set manual Properties
        props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
        props.setProperty("mail.pop3.socketFactory.fallback", "false");
        props.setProperty("mail.pop3.port", "995");
        props.setProperty("mail.pop3.socketFactory.port", "995");
        props.put("mail.pop3.host", "pop.gmail.com");

        try

        {

            /* Create the session and get the store for read the mail. */

            Session session = Session.getDefaultInstance(
                    System.getProperties(), null);

            Store store = session.getStore("pop3");

            store.connect("pop.gmail.com", 995, "abc@gmail.com",
                    "paasword");

            /* Mention the folder name which you want to read. */

            // inbox = store.getDefaultFolder();
            // inbox = inbox.getFolder("INBOX");
            inbox = store.getFolder("INBOX");

            /* Open the inbox using store. */

            inbox.open(Folder.READ_ONLY);

            /* Get the messages which is unread in the Inbox */

            Message messages[] = inbox.search(new FlagTerm(new Flags(
                    Flags.Flag.SEEN), false));
            System.out.println("No. of Unread Messages : " + messages.length);

            /* Use a suitable FetchProfile */
            FetchProfile fp = new FetchProfile();
            fp.add(FetchProfile.Item.ENVELOPE);

            fp.add(FetchProfile.Item.CONTENT_INFO);

            inbox.fetch(messages, fp);

            try

            {

                printAllMessages(messages);

                inbox.close(true);
                store.close();

            }

            catch (Exception ex)

            {
                System.out.println("Exception arise at the time of read mail");

                ex.printStackTrace();

            }

        }

        catch (MessagingException e)
        {
            System.out.println("Exception while connecting to server: "
                    + e.getLocalizedMessage());
            e.printStackTrace();
            System.exit(2);
        }

    }

    public void printAllMessages(Message[] msgs) throws Exception
    {
        for (int i = 0; i < msgs.length; i++)
        {

            System.out.println("MESSAGE #" + (i + 1) + ":");

            printEnvelope(msgs[i]);
        }

    }

    public void printEnvelope(Message message) throws Exception

    {

        Address[] a;

        // FROM

        if ((a = message.getFrom()) != null) {
            for (int j = 0; j < a.length; j++) {
                System.out.println("FROM: " + a[j].toString());
            }
        }
        // TO
        if ((a = message.getRecipients(Message.RecipientType.TO)) != null) {
            for (int j = 0; j < a.length; j++) {
                System.out.println("TO: " + a[j].toString());
            }
        }
        String subject = message.getSubject();

        Date receivedDate = message.getReceivedDate();
        Date sentDate = message.getSentDate(); // receivedDate is returning
                                                // null. So used getSentDate()

        String content = message.getContent().toString();
        System.out.println("Subject : " + subject);
        if (receivedDate != null) {
            System.out.println("Received Date : " + receivedDate.toString());
        }
        System.out.println("Sent Date : " + sentDate.toString());
        System.out.println("Content : " + content);

        getContent(message);

    }

    public void getContent(Message msg)

    {
        try {
            String contentType = msg.getContentType();
            System.out.println("Content Type : " + contentType);
            Multipart mp = (Multipart) msg.getContent();
            int count = mp.getCount();
            for (int i = 0; i < count; i++) {
                dumpPart(mp.getBodyPart(i));
            }
        } catch (Exception ex) {
            System.out.println("Exception arise at get Content");
            ex.printStackTrace();
        }
    }

    public void dumpPart(Part p) throws Exception {
        // Dump input stream ..
        InputStream is = p.getInputStream();
        // If "is" is not already buffered, wrap a BufferedInputStream
        // around it.
        if (!(is instanceof BufferedInputStream)) {
            is = new BufferedInputStream(is);
        }
        int c;
        System.out.println("Message : ");
        while ((c = is.read()) != -1) {
            System.out.write(c);
        }
    }

    public static void main(String args[]) {
        new MailReader();
    }
}

我在Google上进行了搜索,但发现您应该使用Flags.Flag.SEEN阅读未读的电子邮件。但这在我的情况下并未显示正确的结果。

有人可以指出我可能在哪里做错了吗?

如果您需要完整的代码,我可以编辑我的帖子。

注意:我编辑了问题,以包含完整的代码,而不是先前发布的代码段。


问题答案:

您的代码应该可以工作。如果只需要计数,则还可以使用Folder.getUnreadMessageCount()方法。

JavaMail只能告诉您Gmail告诉您什么。也许Gmail认为所有这些邮件都已阅读?也许Gmail网络界面正在标记那些已读邮件?也许您有另一个应用程序正在监视文件夹中的新消息?

尝试使用JavaMail阅读未读消息,然后查看计数是否发生变化。

您可能会发现打开会话调试很有用,这样您可以看到Gmail返回的实际IMAP响应。请参阅JavaMail常见问题解答。



 类似资料:
  • 我正在尝试使用JavaMail 1.6.2使用带有POP3和新的OAUTH2集成的守护进程服务从outlook.com中提取电子邮件。 我已经成功地使用OAUTH2和IMAPS进行了身份验证,并且我可以使用带有普通身份验证的POP3来提取电子邮件,因此我认为我的OAUTH2作用域、azure注册应用程序和客户端电子邮件都有正确的设置。 我正在使用的提取电子邮件的范围如下所示,返回的令牌反映了POP

  • 目前,我的代码使用IMAP(imaps)和JavaMail访问我的Gmail收件箱,目的是阅读从最新到最旧发送给我自己的电子邮件,识别哪些电子邮件具有. zip或. xap格式的附件。如果找到,电子邮件的主题会显示出来,并询问我是否要下载附件。 如果我单击否,它会继续搜索。如果我单击是,它会调用createFolder方法来创建一个目录,将附件保存在那里,然后提取它。 问题:我收件箱中最近的一封电

  • 问题内容: 我正在使用javamail,但无法从Gmail电子邮件中获取HTML。我有以下内容: 上面所有方法都可以,但是我无法打印或获取实际的HTML或文本电子邮件。我只是得到某种InputStream,如何轻松处理以获得原始的电子邮件HTML? 我也尝试遍历消息,但这并没有使我走得太远: } 谢谢大家的帮助。 问题答案: 该对象包含电子邮件的正文。您需要阅读整个流,才能阅读整个消息。例如,该S

  • 问题内容: 我有一个包含GUI的应用程序,它正在使用Javamail。当我打开它时,我必须在上看到发送到我的邮件的消息。 问题是当我编写代码时,它仅显示最后发送的消息。 如何在收件箱中显示所有新邮件? 这是我的代码: 问题答案: 您在以下消息循环中反复将的文本设置为相同的内容: 您应该使用所有消息构建一个,然后设置 然后,您可以通过使用增强的for循环并使用的方法使这一点更加清晰。

  • 我有两个问题,它们非常相关。 null 编辑:我试着把它弄清楚。假设我在给B发邮件。B先给我发邮件,所以它就在我的收件箱里。然后我给你回信。在Gmail的收件箱中,两封邮件在对话中连接在一起(因为发件人和主题是相同的)。然而,使用javamail,我只能在我的收件箱中看到第一封电子邮件(B发送的),而我的回复则在我的发送箱中。我能把这两封邮件作为对话收集起来吗? 我需要我发送的所有电子邮件以及任何

  • 在java中,我需要从特定的发送者那里获得所有的电子邮件。有几种方法可以做到这一点,如下所示:http://www.codejava.net/java-ee/javamail/using-javamail-for-searching-e-mail-messages 但我需要在gmail端完成这个过程。对我来说,阅读所有电子邮件,然后决定应该继续哪一封是不好的。 也在http://alvinalex