diff --git a/extensions/webmail/imap_listing.py b/extensions/webmail/imap_listing.py index 6d964678e..fc495d39f 100644 --- a/extensions/webmail/imap_listing.py +++ b/extensions/webmail/imap_listing.py @@ -217,23 +217,32 @@ class IMAPconnector(object): result[name] = None return result + def _add_flag(self, folder, mail_id, flag): + self.m.select(self._encodefolder(folder), True) + self.m.store(mail_id, "+FLAGS", flag) + def msg_unread(self, folder, msgset): self.m.select(self._encodefolder(folder), True) self.m.store(msgset, "-FLAGS", "\\Seen") def msg_read(self, folder, msgset): - self.m.select(self._encodefolder(folder), True) - self.m.store(msgset, "+FLAGS", "\\Seen") + self._add_flag(folder, msgset, "\\Seen") def msgforwarded(self, folder, imapid): - self.m.select(self._encodefolder(folder), True) - self.m.store(imapid, "+FLAGS", "$Forwarded") + self._add_flag(folder, imapid, "$Forwarded") + + def msg_answered(self, folder, imapid): + self._add_flag(folder, imapid, "\\Answered") def move(self, msgset, oldfolder, newfolder): self.m.select(self._encodefolder(oldfolder), True) self.m.copy(msgset, newfolder) self.m.store(msgset, "+FLAGS", "\\Deleted") + def push_mail(self, folder, msg): + now = imaplib.Time2Internaldate(time.time()) + self.m.append(self._encodefolder(folder), '\\Seen', now, str(msg)) + def empty(self, folder): self.m.select(self._encodefolder(folder)) typ, data = self.m.search(None, 'ALL') diff --git a/extensions/webmail/main.py b/extensions/webmail/main.py index 0c817b469..13a905220 100644 --- a/extensions/webmail/main.py +++ b/extensions/webmail/main.py @@ -215,10 +215,11 @@ def render_compose(request, form, posturl, bodyheader=None, body=None): ctx = getctx("ok", level=2, menu=menu, listing=content) return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") -def send_mail(request, withctx=False): +def send_mail(request, withctx=False, origmsg=None): form = ComposeMailForm(request.POST) if form.is_valid(): from email.mime.text import MIMEText + from email.utils import make_msgid, formatdate import smtplib msg = MIMEText(request.POST["id_body"].encode("utf-8"), @@ -226,6 +227,11 @@ def send_mail(request, withctx=False): msg["Subject"] = request.POST["subject"] msg["From"] = request.POST["from_"] msg["To"] = request.POST["to"] + msg["Message-ID"] = make_msgid() + msg["User-Agent"] = "MailNG" + msg["Date"] = formatdate() + if origmsg and origmsg.has_key("Message-ID"): + msg["References"] = msg["In-Reply-To"] = origmsg["Message-ID"] rcpts = msg['To'].split(',') if "cc" in request.POST.keys(): msg["Cc"] = request.POST["cc"] @@ -234,8 +240,7 @@ def send_mail(request, withctx=False): s = smtplib.SMTP(parameters.get("webmail", "SMTP_SERVER")) if parameters.get("webmail", "SMTP_SECURED") == "yes": s.starttls() - #except (smtplib.SMTPException, ssl.SSLError), error: - except Exception, e: + except (smtplib.SMTPException, ssl.SSLError), error: print error # Prévoir la remontée de cette erreur au niveau du client!! @@ -243,6 +248,7 @@ def send_mail(request, withctx=False): s.login(request.user.username, request.session["password"]) s.sendmail(msg['From'], rcpts, msg.as_string()) s.quit() + IMAPconnector(request).push_mail("Sent", msg) ctx = getctx("ok", url=__get_current_url(request)) else: ctx = getctx("ko", level=2, listing=render_to_string("webmail/compose.html", @@ -262,9 +268,12 @@ def compose(request): @login_required def reply(request, folder, mail_id): - if request.method == "POST": - return send_mail(request) msg = fetchmail(request, folder, mail_id, True) + if request.method == "POST": + ctx, r = send_mail(request, True, origmsg=msg) + if ctx["status"] == "ok": + IMAPconnector(request).msg_answered(folder, mail_id) + return r email = ImapEmail(msg, True) lines = email.body.split('\n') body = "" diff --git a/extensions/webmail/templates/index.html b/extensions/webmail/templates/index.html index d4f70f141..61221268e 100644 --- a/extensions/webmail/templates/index.html +++ b/extensions/webmail/templates/index.html @@ -278,7 +278,9 @@ ul.visible { $$("a[name=fdaction]").addEvent("click", function(evt) { evt.stop(); - current_anchor.parse_string(evt.target.get("href"), true).update(); + new Request.JSON({url : evt.target.get("href"), + onSuccess : get_callback("folder") + }).get(); }); $$("tbody>tr").each(function(item) { diff --git a/lib/email_listing.py b/lib/email_listing.py index fc8755b3a..de190322e 100644 --- a/lib/email_listing.py +++ b/lib/email_listing.py @@ -2,6 +2,7 @@ import time import re import os +import time, random, hashlib from email.header import decode_header import lxml import lxml.html