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

Javamail mark gmail сообщение прочитано

Примечание: добавлено после ответа: Спасибо.. Да, я попробовал флаг Flags.SEEN для true и saveChanges. Я также прочитал getContent, который он читал. Я попытался использовать его в инструкции for, которая проходит через сообщения. Но я снова получил сообщения из папки в следующем цикле. Я предполагал, что папка была вживую, поэтому хватала содержимое, а затем снова извлекала сообщения из папки с фильтром, чтобы не получить видимых результатов, но я все еще получал то же сообщение. Я мог бы попытаться закрыть папку и снова открыть ее в качестве теста, чтобы увидеть, отмечена ли она. Также, если я перейду к своему клиенту и нажимаю сообщение, тогда мой код перестает видеть его даже в цикле, поэтому я надеялся сделать то же самое в коде.

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

    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", eUserName, ePassWord);
        // Get folder
        Folder folder = store.getFolder("INBOX");
        if (folder == null || !folder.exists()) {
            return null;
        }
        folder.open(Folder.READ_ONLY);

        // Only pull unread
        FlagTerm ft = new FlagTerm(new Flags(Flags.Flag.SEEN), false);
        Message messages[]; // = folder.search(ft);

        for(int x = 0; x < timeOutInSeconds; x++) {
            log.reportMessage("looking for emails");
            try {
                folder.getMessages();
                messages = folder.search(ft);

                if (messages.length > 0) {
                    for (Message message : messages) {
                        //log.reportMessage("found message: should not see again, marking read");
                        // want to mark as read

                    }
                }
                Thread.sleep(1000);
            }
            catch(Exception ex) {

            }
        }

        // Close connection
        folder.close(false);
        store.close();
        return null;

    }
    catch (NoSuchProviderException ex) {

        return null;
    }
    catch (MessagingException ex) {

        return null;
    }


}
4b9b3361

Ответ 1

Прежде всего, вы не можете пометить сообщение как прочитанное, если используете сервер POP3 - протокол POP3 этого не поддерживает. Тем не менее, протокол IMAP v4 делает.

Вы можете подумать, что для этого нужно получить сообщение, установить для флага Flags.Flag.SEEN значение true, а затем вызвать message.saveChanges(). Как ни странно, это не так.

Вместо этого в Спецификации разработки API JavaMail, глава 4, раздел "Класс флагов" говорится, что флаг SEEN неявно устанавливается при получении содержимого сообщения. Итак, чтобы пометить сообщение как прочитанное, вы можете использовать следующий код:

myImapFolder.open(Folder.READ_WRITE);
myImapFolder.getMessage(myMsgID).getContent();
myImapFolder.close(false);

Или другой способ - использовать конструктор копирования MimeMessage, т.е.

MimeMessage source = (MimeMessage) folder.getMessage(1)
MimeMessage copy = new MimeMessage(source);

Когда вы создаете копию, флаг visible неявно устанавливается для сообщения, на которое ссылается источник.

Ответ 2

Один вкладыш, который сделает это БЕЗ загрузки всего сообщения:

одно сообщение:

folder.setFlags(new Message[] {message}, new Flags(Flags.Flag.SEEN), true);

все сообщения:

folder.setFlags(messages, new Flags(Flags.Flag.SEEN), true);

Ответ 3

Ну, этот пост старый, но самое легкое решение еще не было опубликовано.

Вы получаете доступ к сообщению. message.setFlag(Flag.SEEN, true);

Ответ 4

Вы также можете рассмотреть наличие public static int max_message_number и сохранение в нем message[i].getMessageNumber();, как только вы прочтете сообщение. Затем перед чтением любого сообщения проверьте только max_message_number < message[i].getmessageNumber(). Если true, то не печатайте это сообщение (как оно уже было прочитано)

Ответ 5

Если вы используете цикл for для чтения или проверки почты один за другим, код может быть следующим, чтобы пометить сообщение gmail как прочитанное:

    Message[] unreadMessages = inbox.search(new FlagTerm(new Flags(Flag.SEEN), false));
            for (int q = 0; q < unreadMessages.length; q++) {

              unreadMessages[q].setFlag(Flag.SEEN, true);

            }

Что делает этот код, так это то, что он делает его непрочитанным по одному.

И также папка/входящий код должен быть READ_WRITE, а не READ_ONLY:

folder.open(Folder.READ_WRITE);

Ответ 6

for (Message message : messages) {
                    message.setFlag(Flags.Flag.SEEN,true);
                }

и измените нижнюю строку

folder.open(Folder.READ_ONLY);

к этому

folder.open(Folder.READ_WRITE);

Ответ 7

message.setFlag(Flag.SEEN, true) дает "не может найти символ" message.setFlag(Flags.Flag.SEEN, true) кажется хорошим.

Ответ 8

Самый простой способ сделать это установить папку для чтения или записи в или из. Значит, как это...

    Folder inbox = null;
    inbox.open(Folder.READ_WRITE);      

класс Folder должен быть импортирован.

Ответ 9

Вы также можете попробовать

зайдите в настройки Gmail> Переадресация и POP/IMAP

в раскрывающемся списке " Когда к сообщениям обращаются с помощью POP", выберите "Копировать Gmail" как "прочитанные" и сохраните изменения.