IMAP mailwatcher w/Tkinter

Discussion in 'Python' started by Kevin F, Mar 23, 2006.

  1. Kevin F

    Kevin F Guest

    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()
     
    Kevin F, Mar 23, 2006
    #1
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.