#!/usr/bin/env python import imaplib import email import email.Utils import re import os import sys import wmutils class Webmail: def __init__(self, user, passwd, req): self.req = req self.server = imaplib.IMAP4_SSL("sucs.org") self.server.login(user, passwd) self.server.select("INBOX") self.current_folder = "INBOX" self.mail_folders = [] pattern = re.compile("\([^)]*\) \"/\" (.*)") for folder in self.server.lsub()[1]: matches = pattern.match(folder) if len(matches.groups()) >= 1: name = matches.group(1).replace('"', '') unread = int(self.server.status(name, "(UNSEEN)")[1][0].replace('"%s" (UNSEEN ' % name, "").replace(")", "")) self.mail_folders.append((name, unread)) self.mail_folders.sort() def get_folders(self): ret_string = "
" ret_string += "Folder List
" for name, unread in self.mail_folders: if unread > 0: ret_string += "%s (%d)
" % (name, name, unread) else: ret_string += "%s
" % (name, name) ret_string += "
" ret_string += "
" return ret_string def get_messages(self): ret_string = "
" ret_string += "" messages = self.server.search(None, "(ALL)")[1][0].split(' ') messages.reverse() p = re.compile("[0-9]+ \(FLAGS \(([^\)]*)\) INTERNALDATE \"([^\"]*)\".*") if self.req.form.has_key("start"): start = int(self.req.form['start'].value) else: start = 0 for mid in messages[start:start+50]: if mid == "": continue # get the message msg = self.server.fetch(mid, "(FLAGS BODY.PEEK[HEADER.FIELDS (FROM SUBJECT DATE)])") # highlight the row if this is an unseen or deleted message if msg[1][0][0].count("\\Seen") == 0: msg_class = "msg_row_unseen" elif msg[1][0][0].count("\\Deleted") > 0: msg_class = "msg_row_deleted" else: msg_class = "msg_row" # parse headers for header in msg[1][0][1].splitlines(): if header.startswith("From: "): msg_from = wmutils.get_from_addr(header[6:]) elif header.startswith("Subject: "): msg_subject = header[9:] elif header.startswith("Date: "): try: msg_date = email.Utils.formatdate(email.Utils.mktime_tz(email.Utils.parsedate_tz(header[6:])), True) except OverflowError, e: msg_date = header[6:] # output the message line ret_string += "" % (mid, self.current_folder, mid, msg_class, msg_date, msg_from, msg_subject) ret_string += "
%s%s%s
" ret_string += "
" return ret_string def get_message(self, id): ret_string = "" ret_string += "
" ret_string += "" msg = email.message_from_string(self.server.fetch(str(id), "(RFC822)")[1][0][1]) ret_string += "" % (wmutils.get_from_addr(msg['from']), msg['date']) ret_string += "" % msg['subject'] if msg.is_multipart(): msgbody = "" for part in msg.walk(): if part.get_content_type() == "text/plain": msgbody += wmutils.wrap(part.get_payload(), 80) msgbody += "\n== NEXT PART ==\n" else: msgbody += part.get_content_type() msgbody += "\n== NEXT PART ==\n" else: msgbody = wmutils.wrap(msg.get_payload(), 80) ret_string += "" % msgbody ret_string += "
From:%sDate:%s
Subject:%s
%s
" return ret_string def set_folder(self, folder=None): if folder is None: self.server.select() self.current_folder = "INBOX" else: self.server.select(folder) self.current_folder = str(folder)