Подтвердить что ты не робот

Получение всех непрочитанных писем с использованием javamail с протоколом POP3

Я пытаюсь получить доступ к моей учетной записи gmail и получить информацию обо всех непрочитанных письмах.

Я написал свой код после ссылки на многие ссылки. Я даю несколько ссылок для справки.

Отправлять и получать электронную почту через учетную запись GMail с помощью Java

Код Java для получения почты с использованием JavaMailAPI

Чтобы проверить свой код, я создал одну учетную запись Gmail. Поэтому я получил 4 сообщения от Gmail. Я запускаю свое приложение после проверки количества писем. Это показало правильный результат. 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, "[email protected]",
                    "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 для чтения непрочитанных писем. Но это не показывает правильных результатов в моем случае.

Может кто-нибудь указать, где я могу ошибаться?

Если вам нужен весь код, я могу отредактировать мой пост.

Примечание. Я редактировал свой вопрос, чтобы включить весь код вместо фрагмента, который я опубликовал ранее.

4b9b3361

Ответ 1

Ваш код должен работать. Вы также можете использовать метод Folder.getUnreadMessageCount(), если все, что вам нужно, это счет.

JavaMail может только сообщить вам, что говорит Gmail. Возможно, Gmail считает, что все эти сообщения были прочитаны? Возможно, веб-интерфейс Gmail отмечает эти сообщения? Возможно, у вас есть другое приложение, контролирующее папку для новых сообщений?

Попробуйте прочитать непрочитанное сообщение с помощью JavaMail и посмотреть, изменяется ли счет.

Возможно, вам будет полезно включить отладку сеанса, чтобы вы могли видеть фактические ответы IMAP, возвращаемые Gmail; см. Часто задаваемые вопросы по JavaMail.

Ответ 2

Измените inbox.open(Folder.READ_ONLY); на inbox.open(Folder.READ_WRITE); Он изменит вашу почту как прочитанную во входящих.

Ответ 3

Вы не можете получать непрочитанные сообщения с помощью POP3. Из API JavaMail:

POP3 не поддерживает постоянные флаги (см. Folder.getPermanentFlags()). В в частности, флаг Flags.Flag.RECENT никогда не будет установлен для POP3 Сообщения. Это приложение позволяет определить, какие сообщения в Почтовый ящик POP3 "новый".

Вы можете использовать протокол IMAP и использовать флаг SEEN следующим образом:

public Message[] fetchMessages(String host, String user, String password, boolean read) {
    Properties properties = new Properties();
    properties.put("mail.store.protocol", "imaps");

    Session emailSession = Session.getDefaultInstance(properties);
    Store store = emailSession.getStore();
    store.connect(host, user, password);

    Folder emailFolder = store.getFolder("INBOX");
    // use READ_ONLY if you don't wish the messages
    // to be marked as read after retrieving its content
    emailFolder.open(Folder.READ_WRITE);

    // search for all "unseen" messages
    Flags seen = new Flags(Flags.Flag.SEEN);
    FlagTerm unseenFlagTerm = new FlagTerm(seen, read);
    return emailFolder.search(unseenFlagTerm);
}

Еще одно замечание - POP3 не обрабатывает папки. IMAP получает папки, POP3 получает только входящие. Дополнительная информация по адресу: Как получить подпапки/метки gmail с помощью POP3?

Ответ 4

Правильный флаг для использования -

Flags.Flag.RECENT

Ответ 5

Flags seen = new Flags(Flags.Flag.RECENT);
FlagTerm unseenFlagTerm = new FlagTerm(seen, false);
messages = inbox.search(unseenFlagTerm);