web-dev-qa-db-ger.com

javamail Google Mail-Nachricht als gelesen markieren

Anmerkung: Nach der Antwort hinzugefügt: Danke .. Ja, ich hatte die Flag.SEEN zu true und saveChanges ausprobiert. Ich hatte auch getContent-Markierungen gelesen, die darin gelesen wurden. Ich habe es in der for-Anweisung verwendet, die die Nachrichten durchläuft. Aber ich habe die Nachrichten in der nächsten Schleife sowieso wieder aus dem Ordner bekommen. Ich ging davon aus, dass der Ordner live war, also packte ich den Inhalt und holte dann die Nachrichten erneut aus dem Ordner mit dem Filter, um nicht gesehen zu werden, sollte funktionieren, aber ich erhielt immer noch die gleiche Nachricht. Ich könnte versuchen, den Ordner zu schließen und als Test erneut zu öffnen, um zu sehen, ob er markiert ist. Wenn ich zu meinem Client gehe und auf die Nachricht klicke, wird mein Code auch in der Schleife nicht mehr angezeigt, und ich hatte gehofft, dasselbe im Code zu tun.

original: Ich verwende Javamail, um E-Mails von einem Google Mail-Konto zu erhalten. Es funktioniert super. Wenn ich die Nachricht bekomme, die ich als gelesen markieren möchte, kann mir jemand eine Richtung geben? Hier ist mein aktueller Code:

    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;
    }


}
30
Green

Erstens können Sie eine Nachricht nicht als gelesen markieren, wenn Sie einen POP3-Server verwenden - das POP3-Protokoll unterstützt dies nicht. Das IMAP v4-Protokoll ist jedoch möglich.

Sie könnten der Meinung sein, dass Sie dazu die Nachricht abrufen, das Flag Flags.Flag.SEEN auf true setzen und dann message.saveChanges() aufrufen. Seltsamerweise ist dies nicht der Fall.

Stattdessen wird in der JavaMail-API-Designspezifikation, Kapitel 4, Abschnitt "Die Flags-Klasse" angegeben, dass das Flag SEEN implizit gesetzt wird, wenn der Inhalt einer Nachricht abgerufen wird. Um eine Nachricht als gelesen zu markieren, können Sie den folgenden Code verwenden:

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

Oder eine andere Möglichkeit ist die Verwendung des MimeMessage-Kopierkonstruktors, z.

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

Wenn Sie die Kopie erstellen, wird das gesehene Flag implizit für die Nachricht gesetzt, auf die die Quelle verweist.

47
Alon Adler

Ein Liner, der dies tun wird, OHNE die gesamte Nachricht herunterzuladen:

einzelne Nachricht:

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

alle Nachrichten:

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

Nun, dieser Beitrag ist alt, aber die einfachste Lösung wurde noch nicht veröffentlicht.

Sie greifen auf die Nachricht zu. message.setFlag (Flag.SEEN, true);

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

ndändern Sie die untere Zeile

folder.open(Folder.READ_ONLY);

daz

folder.open(Folder.READ_WRITE);

1

Wenn Sie eine for-Schleife verwenden, um eine E-Mail nacheinander zu lesen oder zu überprüfen, kann der Code wie folgt aussehen, um eine Google Mail-Nachricht als gelesen zu markieren:

    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);

            }

Dieser Code bewirkt, dass er nach und nach ungelesen wird.

Und auch Ordner/Posteingang muss READ_WRITE anstelle von READ_ONLY sein:

folder.open(Folder.READ_WRITE);
1
Gerrit-Jan

Sie können auch über einen public static int max_message_number nachdenken und die message[i].getMessageNumber(); speichern, sobald Sie eine Nachricht lesen. Prüfen Sie dann vor dem Lesen einer Nachricht, ob die max_message_number < message[i].getmessageNumber(). Wenn true, dann diese Nachricht nicht drucken (da sie bereits gelesen wurde)

1
Rohit Talwar

Der einfachste Weg, dies zu tun, besteht darin, den Ordner zum Lesen oder Schreiben in oder aus dem Ordner festzulegen. Mittel wie diese ...

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

die Folder-Klasse sollte importiert werden.

0
Nawaf Alluqmani

Sie können es auch versuchen

gehen Sie zu den Google Mail-Einstellungen> Weiterleitung und POP/IMAP

wählen Sie in der Dropdown-Liste von Beim Zugriff auf Nachrichten mit POP die Kopie von Google Mail als gelesen aus und speichern Sie die Änderungen

0
kapil76

message.setFlag (Flag.SEEN, true) gibt "Symbol kann nicht gefunden werden" message.setFlag (Flags.Flag.SEEN, true) scheint gut zu sein.

0
jacques