#!/usr/bin/python # Copyright (c) 2007 Sebastien Gross # Released under GPL, see http://gnu.org for further information. import email import email.Header import sys import os from optparse import OptionParser import locale def read_mail(opts): # print "export LC_ALL='%s'" % opts['locale'] locale.setlocale(locale.LC_ALL, opts['locale']) #locale.setlocale(locale.LANG, opts['locale']) # parse msg msg_str = sys.stdin.read() msg = email.message_from_string(msg_str) #get header fields = ['From', 'Subject', 'Date'] lines = opts['lines'] + len(fields) header = {} for type in fields: _h = email.Header.decode_header(msg.get(type)) line = [] for part in _h: if part[1] is None: #pass line.append(part[0]) else: line.append(part[0].decode(part[1]).encode('latin-1')) header[type] = ' '.join(line) cs = msg.get_content_charset() if cs is None: cs = 'iso8859-15' # get the body try: body = msg.get_payload()[0].get_payload(decode=True).split('\n') except: body = msg.get_payload(decode=True).split('\n') if len(body) > opts['lines']: b_str = '\n'.join(body[0:opts['lines'] - 1]).decode(cs).encode('iso8859-15') else: b_str = '\n'.join(body).decode(cs).encode('iso8859-15') if opts['folded']: action='entertitle=uncollapse;leaveslave=collapse;button3=togglecollapse;' #enterslave=uncollapse;leaveslave=collapse;' # assume status bar=16px font heigth=16 + 1-line title y = opts['height'] - 14 #- 16 #+ 1 else: action='onstart=uncollapse;' # Assume status bar=16px font heigth=16 + 2-line title y = opts['height'] - lines * 14 # assume window width = 400 x = opts['width'] - opts['window_width'] #print "x=%i y=%i" %(x, y) cmd_str = ( 'dzen2', '-p', str(opts['peristant']), '-l', str(lines), '-fn', '-xos4-terminus-medium-r-normal--12-*-*-*-*-*-iso8859-1', '-e', '%sbutton1=exit;' % action, '-bg', opts['background'], '-fg', opts['foreground'], '-ta', 'l', '-y', str(y), '-x', str(x), '-w', str(opts['window_width'])) #print ' '.join(cmd_str) (c_in, c_out, c_err) = os.popen3(cmd_str) if opts['folded']: c_in.write('^fg(white) New mail from %s^fg()\n' % (header['From'])) c_in.write('^fg(red)From: ^fg(green)%s^fg()\n' % (header['From'])) else: c_in.write('^fg(red)From: ^fg(green)%s^fg()\n' % (header['From'])) for f in fields[1:]: c_in.write('^fg(red)%s: ^fg(white)%s^fg()\n' % (f, header[f])) c_in.write('\n%s\n' % b_str) c_in.close() c_out.close() c_err.close() def parse_opts(): p = OptionParser() p.add_option("-x", "--width", help="Width of screen", metavar="PIXEL", default=0, type="int") p.add_option("-y", "--height", help="Height of screen", metavar="PIXEL", default=0, type="int") p.add_option("-w", "--window-width", help="Width of window", metavar="PIXEL", default=450, type="int") p.add_option("-l", "--lines", help="Lines to display", metavar="LINES", default=5, type="int") p.add_option("", "--background", help="Background color", metavar="COLOR", default="black") p.add_option("", "--foreground", help="Foreground color", metavar="COLOR", default="#a8a3f7") p.add_option("-p", "--peristant", help="Delay", metavar="SEC", default=5, type="int") p.add_option("-f", "--folded", help="Display folded window", metavar="BOOL", action="store_true", default=False) p.add_option("-L", "--locale", help="Locale", metavar="LOCALE", default='fr_FR@euro') (options, args) = p.parse_args() return options.__dict__ def __init__(): opts = parse_opts() #print opts read_mail(opts) if __name__ == '__main__': __init__() # vim:ts=2:set expandtab: