IMAP mailwatcher w/Tkinter

Kevin F neurogasm at gmail.com
Thu Mar 23 03:58:57 EST 2006


I've been trying to implement this script, it polls an IMAP inbox for 
unread messages and displays the sender and subject in a scrollable 
window using Tkinter.  However, when I try to change the search 
parameters on line 55 from 'unread' (UNSEEN) to 'read' (SEEN), the 
tkinter window doesn't even pop up anymore.

Any idea how to change the parameters of this program and yet still keep 
it functional?







my code: (if you can't see line 55, search for 'UNSEEN')




#!/usr/bin/env python
import imaplib, string, sys, os, re, rfc822
from Tkinter import *

PollInterval = 60 # seconds

def getimapaccount():
     try:
         f = open(('info.imap'))
     except IOError, e:
         print 'Unable to open ~/.imap: ', e
         sys.exit(1)
     global imap_server, imap_user, imap_password
     try:
         imap_server, imap_user, imap_password = string.split(f.readline())
     except ValueError:
         print 'Invalid data in ~/.imap'
         sys.exit(1)
     f.close()

class msg: # a file-like object for passing a string to rfc822.Message
     def __init__(self, text):
	self.lines = string.split(text, '\015\012')
	self.lines.reverse()
     def readline(self):
	try: return self.lines.pop() + '\n'
	except: return ''

class Mailwatcher(Frame):
     def __init__(self, master=None):
         Frame.__init__(self, master)
         self.pack(side=TOP, expand=YES, fill=BOTH)
         self.scroll = Scrollbar(self)
         self.list = Listbox(self, font='7x13',
                             yscrollcommand=self.scroll.set,
                             setgrid=1, height=6, width=80)
         self.scroll.configure(command=self.list.yview)
         self.scroll.pack(side=LEFT, fill=BOTH)
         self.list.pack(side=LEFT, expand=YES, fill=BOTH)

     def getmail(self):
	self.after(1000*PollInterval, self.getmail)
         self.list.delete(0,END)
	try:
	    M = imaplib.IMAP4(imap_server)
	    M.login(imap_user, imap_password)
	except Exception, e:
	    self.list.insert(END, 'IMAP login error: ', e)
	    return

	try:
	    result, message = M.select(readonly=1)
	    if result != 'OK':
		raise Exception, message
	    typ, data = M.search(None, '(UNSEEN)')
	    for num in string.split(data[0]):
		try:
		    f = M.fetch(num, '(BODY[HEADER.FIELDS (SUBJECT FROM)])')
		    m = rfc822.Message(msg(f[1][0][1]), 0)
		    subject = m['subject']
		except KeyError:
		    f = M.fetch(num, '(BODY[HEADER.FIELDS (FROM)])')
		    m = rfc822.Message(msg(f[1][0][1]), 0)
		    subject = '(no subject)'
		fromaddr = m.getaddr('from')
		if fromaddr[0] == "": n = fromaddr[1]
		else: n = fromaddr[0]
		text = '%-20.20s  %s' % (n, subject)
		self.list.insert(END, text)
	    len = self.list.size()
	    if len > 0: self.list.see(len-1)
	except Exception, e:
	    self.list.delete(0,END)
	    print sys.exc_info()
	    self.list.insert(END, 'IMAP read error: ', e)
	M.logout()


getimapaccount()
root = Tk(className='mailwatcher')
root.title('mailwatcher')
mw = Mailwatcher(root)
mw.getmail()
mw.mainloop()



More information about the Python-list mailing list