#!/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 += "| %s | %s | %s |
" % (mid, self.current_folder, mid, msg_class, msg_date, msg_from, msg_subject)
ret_string += "
"
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 += "| From: | %s | Date: | %s |
" % (wmutils.get_from_addr(msg['from']), msg['date'])
ret_string += "| Subject: | %s |
" % 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 += "%s |
" % msgbody
ret_string += "
"
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)