mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
196 lines
7.2 KiB
Python
196 lines
7.2 KiB
Python
# -*- coding: utf-8 -*-
|
|
import time
|
|
import sys
|
|
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, _render, _render_error
|
|
from mailng.lib.email_listing import Email
|
|
from imap_listing import *
|
|
from forms import *
|
|
from templatetags.webextras import *
|
|
|
|
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", "IMAP_SECURED", "list_yesno", "no",
|
|
help=_("Use a secure connexion to access IMAP server"))
|
|
parameters.register("webmail", "IMAP_PORT", "int", "143",
|
|
help=_("Listening port of your IMAP server"))
|
|
parameters.register("webmail", "SMTP_SERVER", "string", "127.0.0.1",
|
|
help=_("Address of your SMTP server"))
|
|
parameters.register("webmail", "SMTP_PORT", "int", "25",
|
|
help=_("Listening port 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(index),
|
|
"img" : "/static/pics/webmail.png"}
|
|
]
|
|
|
|
def userlogin(**kwargs):
|
|
kwargs["request"].session["password"] = kwargs["password"]
|
|
|
|
def getctx(status, level=1, **kwargs):
|
|
callername = sys._getframe(level).f_code.co_name
|
|
ctx = {"status" : status, "callback" : callername}
|
|
for kw, v in kwargs.iteritems():
|
|
ctx[kw] = v
|
|
return ctx
|
|
|
|
@login_required
|
|
def folder(request, name, updatenav=True):
|
|
if not name:
|
|
name = "INBOX"
|
|
order = request.GET.has_key("order") and request.GET["order"] or None
|
|
if updatenav:
|
|
pageid = request.GET.has_key("page") and int(request.GET["page"]) or 1
|
|
if not "navparams" in request.session.keys():
|
|
request.session["navparams"] = {}
|
|
request.session["folder"] = name
|
|
request.session["page"] = pageid
|
|
if order:
|
|
request.session["navparams"]["order"] = order
|
|
|
|
lst = ImapListing(request.user.username, request.session["password"],
|
|
name, folder=name, order=order)
|
|
page = lst.paginator.getpage(request.session["page"])
|
|
if page:
|
|
content = lst.fetch(request, page.id_start, page.id_stop)
|
|
navbar = lst.render_navbar(page)
|
|
else:
|
|
content = "Empty folder"
|
|
navbar = ""
|
|
ctx = getctx("ok", listing=content, navbar=navbar,
|
|
menu=listing_menu("", name, request.user.get_all_permissions()))
|
|
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
|
|
|
|
@login_required
|
|
def index(request):
|
|
try:
|
|
navp = request.session.has_key("navparams") \
|
|
and request.session["navparams"] or {}
|
|
lst = ImapListing(request.user.username, request.session["password"],
|
|
"INBOX", navparams=navp, folder="INBOX")
|
|
except Exception as exp:
|
|
return _render_error(request, {"error" : exp})
|
|
return lst.render(request, empty=True)
|
|
|
|
def fetchmail(request, folder, mail_id, all=False):
|
|
res = IMAPconnector(request).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
|
|
try:
|
|
pageid = request.session["page"]
|
|
except KeyError:
|
|
pageid = "1"
|
|
menu = viewm_menu("", request.session, mail_id,
|
|
request.user.get_all_permissions())
|
|
folder, imapid = header["imapid"].split("/")
|
|
mailcontent = render_to_string("webmail/viewmail.html", {
|
|
"header" : header, "folder" : folder, "imapid" : imapid
|
|
})
|
|
ctx = getctx("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":
|
|
IMAPconnector(request).msgseen(msg["imapid"])
|
|
email = Email(msg, mode="html", links="1")
|
|
return email.render(request)
|
|
|
|
@login_required
|
|
def move(request):
|
|
for arg in ["msgset", "to"]:
|
|
if not request.GET.has_key(arg):
|
|
return
|
|
folder, id = request.GET["msgset"].split("/")
|
|
mbc = IMAPconnector(request)
|
|
mbc.move(id, folder, request.GET["to"])
|
|
return HttpResponse(simplejson.dumps({"status" : "ok"}),
|
|
mimetype="application/json")
|
|
|
|
@login_required
|
|
def empty(request, name):
|
|
mbc = IMAPconnector(request)
|
|
mbc.empty(name)
|
|
return folder(request, name, False)
|
|
|
|
def render_compose(request, form, bodyheader=None, body=None):
|
|
menu = compose_menu("", request.session, request.user.get_all_permissions())
|
|
content = render_to_string("webmail/compose.html", {
|
|
"form" : form, "bodyheader" : bodyheader, "body" : body
|
|
})
|
|
ctx = getctx("ok", level=2, menu=menu, listing=content)
|
|
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
|
|
|
|
@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(request, request.session["navparams"]["folder"], False)
|
|
|
|
form = ComposeMailForm()
|
|
form.fields["from_"].initial = request.user.username
|
|
return render_compose(request, form)
|
|
|
|
@login_required
|
|
def reply(request, folder, mail_id):
|
|
if request.method == "POST":
|
|
return
|
|
msg = fetchmail(request, folder, mail_id, True)
|
|
email = Email(msg)
|
|
lines = email.body.split('\n')
|
|
body = ""
|
|
for l in lines:
|
|
if body != "":
|
|
body += "\n"
|
|
body += ">%s" % l
|
|
form = ComposeMailForm()
|
|
form.fields["from_"].initial = request.user.username
|
|
form.fields["to"].initial = msg["From"]
|
|
m = re.match("re\s*:\s*.+", msg["Subject"].lower())
|
|
if m:
|
|
form.fields["subject"].initial = msg["Subject"]
|
|
else:
|
|
form.fields["subject"].initial = "Re: %s" % msg["Subject"]
|
|
textheader = msg["From"] + " " + _("wrote:")
|
|
return render_compose(request, form, textheader, body)
|