• Publicidad

Cómo puedo saber si un mail específico ha sido leído

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Cómo puedo saber si un mail específico ha sido leído

Notapor alvgutierr » 2007-07-12 14:56 @664

La idea es la siguiente:

Cuando un e-mail entra al servidor éste se posiciona directamente en la carpeta NEW. Así todos los archivos que se encuentren en esta carpeta son mail recibidos y no leídos. Así los clientes de correo que utilizan POP se conectan al servidor y leen el contenido de NEW...

El asunto es cuando se utiliza un cliente de "correo web" al hacer login a éste, la aplicación internamente se conecta vía IMAP al servidor, ¡pero este protocolo lo que hace es mover los archivos de NEW a otro directorio llamado CUR donde se encuentran todos los mensajes de nuestro mailbox!

La consulta nace aquí: ¿cómo el cliente de correo web marca el mensaje como no leído si físicamente el mensaje se movió al directorio CUR?

La idea es crear un script Perl que sea capaz de identificar un token especifico para saber cuántos usuarios leyeron un mail específico y cuantos no. El script ya me funciona correctamente: lee el directorio NEW y me dice si encuentra el token, si es verdadero el script lo cuenta como leído.

Pero cuando lo pruebo mediante un cliente web al momento de hacer conexión o sea al momento de logearme el IMAP mueve todos los mensajes de NEW a CUR y el script ya no lee el token en NEW y reconoce el mail como leído

Si el IMAP mueve el mensaje a CUR, ¿CÓMO EL CLIENTE WEB SE DA CUENTA QUE EL MENSAJE NO HA SIDO LEÍDO Y LO MARCA EN NEGRITA SI EL MAIL SE ENCUENTRA EN CUR?

IMPORTANTE: AL HACER DIFF ENTRE UN MISMO MENSAJE PERO UNO QUE SE ENCUENTRA EN NEW Y EL OTRO EN CUR NO EXISTEN DIFERENCIAS EN SUS CABECERAS!

Por su opinión y ayuda ¡GRACIAS! :D
Avatar de Usuario
alvgutierr
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2007-07-06 09:09 @422

Publicidad

Notapor explorer » 2007-07-12 19:44 @864

Primero, decirte que el tema de mover los ficheros de la carpeta NEW a CUR no es obra del protocolo IMAP, sino del formato elegido por el programa servidor del protocolo IMAP. Por las pistas que nos das yo supongo que el programa que estás usando es el courier-imap. Y, esto es lo importante, se decidió que el formato de almacenamiento de los mensajes fuese del tipo Maildir (los correos son almacenados en ficheros separados, uno por correo, en carpetas separadas según su estado -nuevo, actual, temporal-).

No dices qué cliente web usas, pero creo que el problema que tienes es la mezcla de varias situaciones a partir de varios programas y de varios protocolos. No nos dices tampoco si el servidor del protocolo POP entiende el formato Maildir o no. Solo dices que es capaz de entrar en la carpeta NEW y ver su contenido, por lo que se entiende que sí lo entiende, pero no sabemos si sabe de la existencia de la carpeta CUR.

Para solventarlo, debes de comprobar que los tres agentes (servidor POP, servidor IMAP, cliente web) pueden y entienden los formatos de almacenamiento del correo. Por ejemplo, en mi servidor desde siempre hemos usado el formato mbox (todos los mensajes en un único fichero), y ese formato es asimilable por los servidores de correo, los transportadores de correo en distintos protocolos. Tanto el POP como el IMAP que usamos entienden el mbox, y el cliente web se conecta por IMAP, así que es lo mismo que si el usuario se conectara con ese protocolo.

El elegir el formato de almacenamiento de los mensajes puede ser vital en algunas situaciones. El formato mbox está muy bien para usuarios normales que tienen poco correo. Y el formato Maildir está bien para buzones muy grandes, con correos muy grandes o con accesos simultáneos (varias personas acceden por IMAP al mismo buzón, por ejemplo, en una central de compras). También una ventaja de Maildir sobre mbox es que es mucho más amigable con el consumo de los recursos del ordenador. Abrir un buzón de 300Mb en mbox puede ser realmente agotador. Y si son varios usuarios a la vez, en distintos buzones, horrible.

El cómo sabe el programa que un mensaje ha sido leído o no depende también del programa, pero lo estándar es modificar la cabecera del mensaje, en su línea Status: o X-Status:. Si es nuevo, aparece una letra 'N' (New). Si el usuario ha abierto el buzón, se le marca con una 'O' (Old). Si el usuario lo lee, se marca como 'R' (Read). Si lo borra, una 'D' (Delete). Y más letras, pero esto depende tanto del programa servidor como del cliente de correo. Puede ser como en tu caso: según en qué directorio te encuentres, significa una cosa u otra.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Cómo puedo saber si un mail específico ha sido leído

Notapor alvgutierr » 2007-07-13 09:17 @428

Estimado Explorer nuevamente gracias por tu atenta respuesta!

Mira el sistema que utiliza es maildir y el cliente es un sistema PHP que se llama SquirrelMail.

Pero realmente lo que necesito saber, es la mecánica que utiliza este cliente para discriminar dentro de CUR los mail no leídos o sea los nuevos que entran...

Mira, se que el cliente web mueve los mensajes al momento de hacer login porque:
al momento de mandar un mail al servidor desde una cuenta extranjera (yahoo, google) voy y entro al server, me dirijo al directorio NEW y el mail ¡esta ahí!
Pero al momento de hacer login al cliente web, me dirijo al server al directorio NEW y el mail ha sido movido al directorio CUR y el cliente web lo marca como nuevo...

Entonces para que mi script funcione correctamente tiene que buscar el mensaje con el token especifico (El problema es que busca solo dentro de NEW).
Puedo hacer que busque dentro de CUR, pero no sé cómo discriminar entre un correo nuevo no leído y uno ya leído si al momento de hacer un diff entre ambos el diff no me entrega diferencias...
Importante::
[listxg]El Status solo lo encuentro cuando gestiono el correo con un cliente de escritorio.
¡El script se corre dentro del servidor de correo y tiene que revisar mas de 50 mil cuentas![/list:uxg]

¡Muchas gracias por tu opinion y aporte Explorer!
:D :D :D :D :D :D
Avatar de Usuario
alvgutierr
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2007-07-06 09:09 @422

Notapor explorer » 2007-07-13 16:52 @744

Primero decirte que aún no nos has dicho qué programa es el que hace de servidor IMAP. Yo creo que es el Courier-IMAP, pero también podría ser el Dovecot.

Segundo, el SquirrelMail NO maneja directamente ningún directorio del usuario, sino que es a través de la conexión con el servidor IMAP es como obtiene la lista de correos (http://squirrelmail.org/wiki/SquirrelMailAndCourierIMAP).

Así que es el servidor IMAP el que hace todo el trasiego de correos, de un directorio a otro, PORQUE el formato de almacenamiento de los correos es Maildir.

Bueno, pues resulta que lo que dices es cierto: cuando un correo llega se mete en tmp y luego pasa a new. Cuando te conectas con el SquirrelMail, éste a través del IMAP pregunta cuántos correos nuevos hay. En ese momento el servidor IMAP los pasa de new a cur Y modifica los nombres de los mensajes.

Bueno, pues es justo en el nombre de los mensajes donde está codificado:
* Flag "P" (passed): Mensaje reenviado a otra persona.
* Flag "R" (replied): el mensaje ha sido respondido.
* Flag "S" (seen): el usuario ha visto el mensaje, aunque quizás no lo haya leído del todo. Quizás sea más apropiado decir que simplemente lo ha abierto.
* Flag "T" (trashed): el mensaje ha sido marcado para ser borrado. Se eliminará cuando el usuario compacte la carpeta.
* Flag "D" (draft): el mensaje es un borrador.
* Flag "F" (flagged): el usuario ha "marcado" el mensaje.
Delante de estos flags suele haber un ':1,' o un ':2,'. Si no hay ninguno de los flags anteriores, el mensaje es nuevo.

* http://en.wikipedia.org/wiki/Maildir#Te ... _Operation
* http://www.courier-mta.org/maildir.html
* http://cr.yp.to/proto/maildir.html

Esto vale para el Courier. El Dovecot usa, además, 26 letras minúsculas que representan distintas marcas o etiquetas del correo. La descripción de estas letras la tienes en el fichero dovecot-keywords, que tiene el formato indicado en la página Maildir de Dovecot (http://wiki.dovecot.org/MailboxFormat/Maildir busca sección IMAP keywords), pero no te hará falta, porque con los flags anteriores te debería valer.

Así que tu script, si lo que quiere es averiguar si determinado correo ha sido visto, deberá, en el directorio cur de cada usuario, buscar qué mensaje es el que te interesa, y una vez encontrado, ver los flags que hay en su nombre. El cómo sean esos flags dependerá de qué servidor IMAP estés usando, pero lo normal es que si aparece una 'S', es que el mensaje ha sido, al menos, abierto por el usuario.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor alvgutierr » 2007-07-19 10:33 @481

Estimado Explorer

Muchas gracias, los link y tu ayuda me ayudaron a resolver mi problema.
Logré realizar el script, analizando los flag que acompañan al archivo en el directorio cur.

¡Gracias Explorer! :D :D :D :D :D :D :D :D :D :D :D :D
Avatar de Usuario
alvgutierr
Perlero nuevo
Perlero nuevo
 
Mensajes: 16
Registrado: 2007-07-06 09:09 @422


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 22 invitados