Files
modoboa/extensions/webmail/main.py
T
tonio 809be7c017 Against : webmail navigation improvement...
It's now possible to write and send text emails.
2010-01-22 18:55:36 +01:00

137 lines
5.2 KiB
Python

# -*- coding: utf-8 -*-
import time
from django.http import HttpResponse
from django.template.loader import render_to_string
from django.utils import simplejson
from django.utils.translation import ugettext as _
from django.core.urlresolvers import reverse
from django.conf.urls.defaults import include
from django.contrib.auth.decorators import login_required
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", "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/',
include('mailng.extensions.webmail.urls'))
def menu(**kwargs):
if kwargs["target"] != "user_menu_box":
return []
return [
{"name" : _("Webmail"),
"url" : reverse(folder),
"img" : "/static/pics/webmail.png"}
]
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)
return lst.render(request, pageid=int(pageid))
def fetchmail(request, folder, mail_id, all=False):
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]
return None
@login_required
def viewmail(request, folder, mail_id=None):
header = fetchmail(request, folder, mail_id)
if header:
from templatetags.webextras import viewm_menu
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, "listing" : mailcontent}
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
@login_required
def getmailcontent(request, folder, mail_id):
from mailng.lib.email_listing import Email
msg = fetchmail(request, folder, mail_id, True)
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")