javamail marcar el mensaje de gmail como leído


Nota: añadido después de la respuesta: Gracias.. Sí, había probado la bandera.VISTO a verdadero y SaveChanges.. También había leído que getContent lo marcaba como leído. Intenté usarlo en la declaración for que recorre los mensajes. Pero tengo los mensajes de nuevo de la carpeta de todos modos en el siguiente bucle. Estaba asumiendo que la carpeta estaba en vivo, así que agarrar el contenido, luego agarrar los mensajes de nuevo de la carpeta con el filtro para no ser visto debería funcionar, pero todavía estaba recibiendo el mismo mensaje. Podría intentarlo. cerrar la carpeta y volver a abrirla como prueba para ver si está marcada. Además, si voy a mi cliente y hago clic en el mensaje, mi código deja de verlo incluso en el bucle, así que esperaba hacer lo mismo en el código.

Original: Estoy usando javamail para recibir correo electrónico de una cuenta de gmail, funciona muy bien, cuando recibo el mensaje me gustaría marcarlo como leído, ¿puede alguien darme alguna dirección? Aquí está mi código actual:

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


}
Author: Green, 2011-10-06

8 answers

En primer lugar, no puede marcar un mensaje como leído si está utilizando un servidor POP3, el protocolo POP3 no lo admite. Sin embargo, el protocolo IMAP v4 sí.

Podría pensar que la forma de hacer esto es obtener el mensaje, establecer la bandera Flags.Flag.SEEN a true, y luego llamar a message.saveChanges(). Curiosamente, este no es el caso.

En su lugar, la Especificación de Diseño de la API de JavaMail, Capítulo 4, sección "La clase Flags" establece que el indicador SEEN se establece implícitamente cuando se recupera el contenido de un mensaje. Por lo tanto, para marcar un mensaje como leído, puede usar el siguiente código:

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

U otra forma es usar el constructor de copia MimeMessage, es decir:

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

Cuando se construye la copia, el indicador visto se establece implícitamente para el mensaje al que se hace referencia por fuente.

 43
Author: Alon Adler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-14 04:25:36

Un liner que lo hará SIN descargar el mensaje completo:

Mensaje único:

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

Todos los mensajes:

folder.setFlags(messages, new Flags(Flags.Flag.SEEN), true);
 31
Author: Shloim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-15 12:21:20

Bueno, este post es viejo, pero la solución más fácil aún no se ha publicado.

Está accediendo al Mensaje. mensaje.setFlag(Bandera.VISTO, verdadero);

 3
Author: James Vornhagen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-02 14:54:22

También puede considerar tener un public static int max_message_number, y almacenar en él el message[i].getMessageNumber(); tan pronto como lea un mensaje. Luego, antes de leer cualquier mensaje, simplemente verifique si el max_message_number < message[i].getmessageNumber(). Si es true, entonces no imprima este mensaje (como ya se ha leído)

 1
Author: Rohit Talwar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-21 14:37:59

Si está utilizando un bucle for para leer o revisar un correo uno por uno, el código puede ser el siguiente para marcar un mensaje de gmail como leído:

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

            }

Lo que hace este código es que lo hace no leído uno por uno.

Y también la carpeta / bandeja de entrada debe ser READ_WRITE, en lugar de READ_ONLY:

folder.open(Folder.READ_WRITE);
 1
Author: Gerrit-Jan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-15 14:32:55

Mensaje.setFlag( Bandera.SEEN, true) give " cannot find symbol" mensaje.setFlag( Banderas.Bandera.VISTO, verdadero) parece bueno.

 0
Author: jacques,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-07 13:37:34

La forma más fácil de hacerlo es establecer la carpeta a leer o escribir en o desde. Significa así...

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

Se debe importar la clase de carpeta.

 0
Author: Nawaf Alluqmani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-14 00:58:56
for (Message message : messages) {
                    message.setFlag(Flags.Flag.SEEN,true);
                }

Y cambie la siguiente línea

folder.open(Folder.READ_ONLY);

A esto

folder.open(Folder.READ_WRITE);

 0
Author: dinusha thiwanka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-15 05:14:49