diff --git a/extensions/amavis_quarantine/sql_listing.py b/extensions/amavis_quarantine/sql_listing.py index f4744adef..5e29fc3e7 100644 --- a/extensions/amavis_quarantine/sql_listing.py +++ b/extensions/amavis_quarantine/sql_listing.py @@ -16,6 +16,12 @@ class Qtable(tables.Table): def parse_date(self, value): return datetime.fromtimestamp(value) + def parse(self, header, value): + try: + return getattr(self, "parse_%s" % header)(value) + except AttributeError: + return value + class SQLconnector(MBconnector): def __init__(self, filter=None): self.conn = db.getconnection("amavis_quarantine") @@ -76,10 +82,8 @@ LIMIT %d,%d class SQLlisting(EmailListing): tpl = "amavis_quarantine/index.html" + tbltype = Qtable def __init__(self, filter, **kwargs): self.mbc = SQLconnector(filter) EmailListing.__init__(self, **kwargs) - - def fetch(self, id_start, id_stop): - return Qtable(self.mbc.fetch(start=id_start, stop=id_stop)) diff --git a/extensions/webmail/forms.py b/extensions/webmail/forms.py new file mode 100644 index 000000000..21c2bd86f --- /dev/null +++ b/extensions/webmail/forms.py @@ -0,0 +1,8 @@ +from django import forms +from django.utils.translation import ugettext as _ + +class ComposeMailForm(forms.Form): + from_ = forms.CharField(label=_("From")) + to = forms.CharField(label=_("To"), widget=forms.Textarea()) + subject = forms.CharField(label=_("Subject"), max_length=255) + diff --git a/extensions/webmail/imap_listing.py b/extensions/webmail/imap_listing.py index 2ee488a29..b5a2d33ce 100644 --- a/extensions/webmail/imap_listing.py +++ b/extensions/webmail/imap_listing.py @@ -119,6 +119,10 @@ class IMAPconnector(MBconnector): result += [name] return sorted(result) + def msgseen(self, imapid): + folder, id = imapid.split("/") + self.m.store(id, "+FLAGS", "\\Seen") + def fetch(self, start=None, stop=None, folder=None, all=False): if not start and not stop: return [] @@ -155,9 +159,10 @@ class IMAPconnector(MBconnector): class ImapListing(EmailListing): tpl = "webmail/index.html" + tbltype = WMtable def __init__(self, user, password, baseurl=None, **kwargs): - self.mbc = IMAPconnector(parameters.get("webmail", "SERVER_ADDRESS"), 143) + self.mbc = IMAPconnector(parameters.get("webmail", "IMAP_SERVER"), 143) status, text = self.mbc.login(user, password) if not status: print "Login error: %s" % text @@ -175,7 +180,3 @@ class ImapListing(EmailListing): for fd in folders: md_folders += [{"name" : fd}] return md_folders - - def fetch(self, id_start, id_stop): - return WMtable(self.mbc.fetch(start=id_start, stop=id_stop, - folder=self.folder)) diff --git a/extensions/webmail/main.py b/extensions/webmail/main.py index 444d05008..a3e7b18e6 100644 --- a/extensions/webmail/main.py +++ b/extensions/webmail/main.py @@ -11,12 +11,18 @@ from mailng.admin.models import Mailbox from mailng.lib import events, parameters from mailng.lib import _render from imap_listing import * +from forms import * +from templatetags.webextras import * + +mbc = None def init(): events.register("UserMenuDisplay", menu) events.register("UserLogin", userlogin) - parameters.register("webmail", "SERVER_ADDRESS", "string", "127.0.0.1", - help=_("Mailboxes server address")) + parameters.register("webmail", "IMAP_SERVER", "string", "127.0.0.1", + help=_("Address of your IMAP server")) + parameters.register("webmail", "SMTP_SERVER", "string", "127.0.0.1", + help=_("Address of your SMTP server")) def urls(): return (r'^mailng/webmail/', @@ -34,32 +40,40 @@ def menu(**kwargs): def userlogin(**kwargs): kwargs["request"].session["password"] = kwargs["password"] +def folder_ajax(request, name, pageid, menu=False): + lst = ImapListing(request.user.username, request.session["password"], + reverse(folder, args=[name]), folder=name) + page = lst.paginator.getpage(pageid) + if page: + content = lst.fetch(request, page.id_start, page.id_stop) + navbar = lst.render_navbar(page) + else: + content = "Empty folder" + navbar = "" + ctx = {"status" : "ok", "listing" : content, "navbar" : navbar} + if menu or "menu" in request.GET.keys(): + from templatetags.webextras import listing_menu + ctx["menu"] = listing_menu("", request.user.get_all_permissions()) + return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") + @login_required def folder(request, name=None): if not name: name = "INBOX" + pageid = request.GET.has_key("page") and int(request.GET["page"]) or 1 + request.session["folder"] = name + request.session["page"] = pageid + if "mode" in request.GET.keys() and request.GET["mode"] == "ajax": + return folder_ajax(request, name, pageid) lst = ImapListing(request.user.username, request.session["password"], reverse(folder, args=[name]), folder=name) - pageid = request.GET.has_key("page") and int(request.GET["page"]) or 1 - if "mode" in request.GET.keys() and request.GET["mode"] == "ajax": - page = lst.paginator.getpage(pageid) - if page: - content = lst.fetch(page.id_start, page.id_stop).render(request) - navbar = lst.render_navbar(page) - else: - content = "Empty folder" - navbar = "" - ctx = {"status" : "ok", "listing" : content, "navbar" : navbar, - "menu" : "", "current_page" : pageid} - if "menu" in request.GET.keys(): - from templatetags.webextras import listing_menu - ctx["menu"] = listing_menu("", request.user.get_all_permissions()) - return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") return lst.render(request, pageid=int(pageid)) def fetchmail(request, folder, mail_id, all=False): - mbc = IMAPconnector(parameters.get("webmail", "SERVER_ADDRESS"), 143) - mbc.login(request.user.username, request.session["password"]) + global mbc + if not mbc: + mbc = IMAPconnector(parameters.get("webmail", "IMAP_SERVER"), 143) + mbc.login(request.user.username, request.session["password"]) res = mbc.fetch(start=mail_id, folder=folder, all=all) if len(res): return res[0] @@ -68,26 +82,55 @@ def fetchmail(request, folder, mail_id, all=False): @login_required def viewmail(request, folder, mail_id=None): header = fetchmail(request, folder, mail_id) - pageid = request.GET.has_key("page") and request.GET["page"] or "1" if header: from templatetags.webextras import viewm_menu - menu = viewm_menu("", folder, mail_id, pageid, + menu = viewm_menu("", request.session["folder"], mail_id, + request.session["page"], request.user.get_all_permissions()) folder, imapid = header["imapid"].split("/") mailcontent = render_to_string("webmail/viewmail.html", { "header" : header, "folder" : folder, "imapid" : imapid }) - ctx = {"status" : "ok", "menu" : menu, "mailcontent" : mailcontent} + ctx = {"status" : "ok", "menu" : menu, "listing" : mailcontent} return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") -# return _render(request, "webmail/viewmail.html", { -# "header" : header, "folder" : folder, "pageid" : pageid, -# "menu" : menu -# }) @login_required def getmailcontent(request, folder, mail_id): from mailng.lib.email_listing import Email msg = fetchmail(request, folder, mail_id, True) - email = Email(msg) + if "class" in msg.keys() and msg["class"] == "unseen": + global mbc + mbc.msgseen(msg["imapid"]) + + email = Email(msg, mode="html", links="1") return email.render(request) + +@login_required +def compose(request): + if request.method == "POST": + form = ComposeMailForm(request.POST) + if form.is_valid(): + from email.mime.text import MIMEText + import smtplib + + msg = MIMEText(request.POST["id_body"].encode("utf-8"), + _charset="utf-8") + msg["Subject"] = request.POST["subject"] + msg["From"] = request.POST["from_"] + msg["to"] = request.POST["to"] + s = smtplib.SMTP(parameters.get("webmail", "SMTP_SERVER")) + s.sendmail(msg['From'], [msg['To']], msg.as_string()) + s.quit() + return folder_ajax(request, request.session["folder"], + request.session["page"], True) + + form = ComposeMailForm() + form.fields["from_"].initial = request.user.username + menu = compose_menu("", request.session["folder"], request.session["page"], + request.user.get_all_permissions()) + content = render_to_string("webmail/compose.html", { + "form" : form + }) + ctx = {"status" : "ok", "menu" : menu, "listing" : content} + return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") diff --git a/extensions/webmail/templates/compose.html b/extensions/webmail/templates/compose.html new file mode 100644 index 000000000..86450e4da --- /dev/null +++ b/extensions/webmail/templates/compose.html @@ -0,0 +1,48 @@ +{% load i18n %} + + +{% url extensions.webmail.main.compose as compurl %} +
diff --git a/extensions/webmail/templates/headers.html b/extensions/webmail/templates/headers.html index fa570da53..244d108df 100644 --- a/extensions/webmail/templates/headers.html +++ b/extensions/webmail/templates/headers.html @@ -1,5 +1,5 @@| {{ hdr.name }} | {{ hdr.value }} |
|---|---|
| {{ hdr.name }} | {{ hdr.value }} |