Notificaciones de mails Prioritarios de Gmail en nuestro escritorio
En estos días GMail empezó a implementar la Priority Inbox, o Prioritarios en su versión en castellano. No es nada demasiado novedoso, en realidad es una etiqueta que define a un mensaje como prioritario. Lo más interesante es que Gmail no solamente te puede mostrar por separado los mails con prioridad de los otros, sino que nos promete ir “aprendiendo” a determinar cuáles son prioritarios y cuáles no.
En estos días estuve probando el feature y me viene bien. Yo recibo muchos mails por día, la mayoría de distintas listas de correo. Y como soy muy obsesivo, cada vez que tengo un mensaje nuevo voy a ver de qué se trata y “marcarlo como leído”. Este feature me permite perocuparme solamente por los prioritarios y dejar los menos importantes (como los de las listas) para más tarde.
Hoy pensé: “qué bueno estaría tener una aplicación que me notifique solamente de los mails importantes”. Ya existen varios notifiers para Gmail, tanto de Google o de terceros, para Firefox o para el Desktop. Pero supongo que todavía no habrán implementado esta posibilidad de solamente avisarte de los mensajes prioritarios. Así que lo que hice fue hacerlo en Python que es muuuy fácil.
En su versión simplificada, ver si hay mails “Importantes” y notificarlo es tan sencillo como esto:
# -*- coding: utf-8 -*-
import sys
import imaplib
import pynotify
from email.header import decode_header
from email.parser import Parser
host = ‘imap.gmail.com’
port = 993
username = ‘usuario@gmail.com’
password = ‘passwordsupersecreto’
def get_header (msg, header):
"""Gets a header from a message"""
header = decode_header(msg.get(header))
if (header[0][1]):
return unicode(header[0][0], header[0][1]).encode(‘utf8′)
else:
return header[0][0]
if not pynotify.init("GMail Important Messages"):
print "Failed to initialize pynotify"
sys.exit(1)
client = imaplib.IMAP4_SSL(host, port)
if not client.login(username, password):
print "Failed to login"
sys.exit(1)
status, data = client.select(‘[Gmail]/Important’)
if status != ‘OK’:
print "Failed to select Important label"
sys.exit(1)
status, data = client.search(None, ‘(UNSEEN)’)
if status == ‘OK’ and data[0] != ”:
for msg_id in sorted(data[0].split()):
if msg_id != ”:
status, data = client.fetch(msg_id, ‘(RFC822)’)
if status == ‘OK’:
msg = Parser().parsestr(data[0][1])
pynotify.Notification(get_header(msg, ‘From’), \
get_header(msg, ‘Subject’)).show()
else:
print "Failed to fetch message #%s" % str(msg_id)
Ese código lo que hace es inicializar pynotify, conectarse al servidor IMAP de GMail usando imaplib, autenticarse con el user y password provisto, seleccionar la etiqueta “[Gmail]/Important” y ver si hay mensajes sin leer. En caso de que haya itera sobre ellos, obtiene su contenido (para sacar el remitente y el asunto) y lanza un mensaje de notificación.
Para convertir eso en una aplicación básicamente hace falta meterlo en un while y corregir un detalle que es que el fetch del mensaje lo marca como leído (y eso no es algo que queramos en un simple notificador), así que hay que volver a marcarlo como no leído. Eso y algunos toques cosméticos es lo que hice en el script completo.
Por supuesto se trata solo de una prueba de concepto y a una aplicación completamente funcional deberían hacersele algunas correcciones más. Pero creo que es una idea divertida como para que otros puedan hacer algo mejor.




