web-dev-qa-db-fra.com

javamail marquer le message gmail comme lu

Note: ajouté après la réponse: Merci .. Ouais, j'avais essayé Flag.SEEN en true et saveChanges .. J'avais aussi lu getContent qui l'a marqué comme lu. J'ai essayé de l'utiliser dans la déclaration for qui parcourt les messages. Mais j'ai quand même reçu les messages du dossier dans la boucle suivante. J'imaginais que le dossier était en ligne, il était donc important de récupérer le contenu, puis de récupérer les messages dans le dossier avec le filtre afin que rien ne soit vu, mais le même message était toujours affiché. Je pourrais essayer de fermer le dossier et de rouvrir comme test pour voir s'il est marqué. De plus, si je vais sur mon client et que je clique sur le message, mon code cesse de le voir, même dans la boucle. J'espérais donc en faire autant dans le code.

j'utilise javamail pour obtenir des courriels à partir d'un compte Gmail, cela fonctionne très bien, lorsque je reçois le message que je souhaite marquer comme lu, quelqu'un peut-il me donner des instructions? Voici mon code actuel:

    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

Tout d'abord, vous ne pouvez pas marquer un message comme lu si vous utilisez un serveur POP3 - le protocole POP3 ne le prend pas en charge. Cependant, le protocole IMAP v4 le fait.

Vous penserez peut-être que la solution consiste à obtenir le message, à définir l'indicateur Flags.Flag.SEEN sur true, puis à appeler message.saveChanges(). Bizarrement, ce n'est pas le cas.

A la place, la section "La classe de drapeaux" de la spécification de conception d'API JavaMail, au chapitre 4, indique que l'indicateur SEEN est défini implicitement lorsque le contenu d'un message est extrait. Ainsi, pour marquer un message comme lu, vous pouvez utiliser le code suivant:

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

Sinon, utilisez le constructeur de copie MimeMessage, à savoir:

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

Lorsque vous construisez la copie, le drapeau vu est implicitement défini pour le message référencé par source.

47
Alon Adler

Une doublure qui le fera SANS télécharger l'intégralité du message:

message unique:

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

tous les messages:

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

Eh bien, cet article est ancien, mais la solution la plus simple n’a pas encore été publiée.

Vous accédez au message. message.setFlag (Flag.SEEN, true);

3
James Vornhagen

Si vous utilisez une boucle for pour lire ou vérifier un courrier un par un, le code peut être le suivant pour marquer un message gmail comme lu:

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

            }

Ce code fait qu’il le rend non lu un par un.

Et aussi le dossier/la boîte de réception doit être READ_WRITE, au lieu de READ_ONLY:

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

Vous pouvez également envisager d’avoir un public static int max_message_number et d’y stocker la message[i].getMessageNumber(); dès que vous lisez un message. Ensuite, avant de lire un message, vérifiez si la fonction max_message_number < message[i].getmessageNumber(). Si true, alors n'imprimez pas ce message (car il a déjà été lu)

1
Rohit Talwar

La façon la plus simple de le faire est de définir le dossier dans lequel lire ou écrire. Des moyens comme ça ...

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

la classe Folder doit être importée.

0
Nawaf Alluqmani

message.setFlag (Flag.SEEN, true) donnez "le symbole introuvable" message.setFlag (Flags.Flag.SEEN, true) semble bon.

0
jacques