【问题标题】:Retrieving all uread emails using javamail with POP3 or IMAPS protocol使用带有 POP3 或 IMAPS 协议的 javamail 检索所有 uread 电子邮件
【发布时间】:2018-05-10 10:06:20
【问题描述】:

我正在开发一个应用程序,我想获取所有已读或未读的邮件。谁能帮助我如何实现此功能? 这里我使用的是 IMAP,但我在这个 sn-p 中遇到了问题。

    @Override
    protected Void doInBackground(Void... voids) {

        Properties props = new Properties();
        //IMAPS protocol
        props.setProperty("mail.store.protocol", "IMAP");
        //Set host address
        props.setProperty("mail.host", "IMAP.gmail.com");
        //Set specified port
        props.setProperty("mail.IMAP.port", "993");
        props.setProperty("mail.transport.protocol", "IMAP");
        props.setProperty("mail.imap.ssl.trust", "*");
        session = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication("abc@gmail.com", "abcd");
                    }
                });
        try {
            Store store = session.getStore("IMAP");

            store.connect();
            inbox = store.getFolder("INBOX");
            inbox.open(Folder.READ_ONLY);
            Message messages[] = inbox.search(new FlagTerm(
                    new Flags(Flags.Flag.SEEN), false));

            for (int i = 0; i < messages.length; i++) {

                Message message = messages[i]; Address[] from = message.getFrom(); System.out.println("-------------------------------");
                System.out.println("Date : " + message.getSentDate());
                System.out.println("From : " + from[0]);
                System.out.println("Subject: " + message.getSubject());
                System.out.println("Content :");
                processMessageBody(message);
                System.out.println("--------------------------------");
            }

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

        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return null;
    }
}
public void processMessageBody(Message message) {
    try { Object content = message.getContent();
        // check for string
        // then check for multipart
        if (content instanceof String) {
            System.out.println(content);
        } else if (content instanceof Multipart)
        { Multipart multiPart = (Multipart) content;
        procesMultiPart(multiPart);
        } else if (content instanceof InputStream) {
            InputStream inStream = (InputStream) content;
            int ch; while ((ch = inStream.read()) != -1) {
                System.out.write(ch);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (MessagingException e) {
        e.printStackTrace();
    }
} public void procesMultiPart(Multipart content) {
    try {
        int multiPartCount = content.getCount();
        for (int i = 0; i < multiPartCount; i++) {
            BodyPart bodyPart = content.getBodyPart(i);
            Object o; o = bodyPart.getContent();
            if (o instanceof String) {
                System.out.println(o);
            } else if (o instanceof Multipart) {
                procesMultiPart((Multipart) o);
            }
        }
    } catch (IOException e)
    { e.printStackTrace();
    } catch (MessagingException e)
    { e.printStackTrace(); }
}` 

这个 sn-p 没有按照期望的输出工作,请让我知道我做错了什么,它在调用 message.getContent 时给出了异常 方法抛出“java.lang.NoClassDefFoundError”异常。

【问题讨论】:

  • 你试过什么?你的代码在哪里?在线和 StackOverflow 上有数百个 Javamail 示例。 POP3 没有已读或未读的概念,所以你不能用它来达到你的目标。
  • 嗨 Max,我已附上 sn-p,请告诉我如何才能实现所需的输出。提前致谢
  • 您是否在应用程序中包含了 java 邮件 jar,并确保它与您编译时使用的版本相同?

标签: android imap pop3


【解决方案1】:

最简单的官方解决方案: https://developers.google.com/gmail/api/quickstart/android

特别尝试关注方法getDataFromApi中的调用。很简单,我已经实现了这个功能并做了一些改进。

【讨论】:

  • 谢谢 Jantursky,我已经尝试过它在 Gmail 上的工作正常,但我也想连接其他域,如 yahoo、outlook 等
猜你喜欢
  • 2012-10-19
  • 2011-08-23
  • 1970-01-01
  • 2021-06-29
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
相关资源
最近更新 更多