Properly encode headers when sending an AR.

fixes #413
This commit is contained in:
Antoine Nguyen
2013-05-09 15:41:58 +02:00
parent 8b31a508b3
commit 182c48602d
5 changed files with 52 additions and 56 deletions
-6
View File
@@ -392,7 +392,6 @@ class AccountFormGeneral(forms.ModelForm):
self.fields["is_active"].label = _("Enabled")
self.user = user
if user.group == "DomainAdmins":
#del self.fields["role"]
self.fields["role"] = forms.CharField(
label="",
widget=forms.HiddenInput, required=False
@@ -443,11 +442,6 @@ class AccountFormGeneral(forms.ModelForm):
if self.cleaned_data["password1"] != "":
account.set_password(self.cleaned_data["password1"])
account.save()
# role = None
# if "role" in self.cleaned_data:
# role = self.cleaned_data["role"]
# elif self.user.group == "DomainAdmins" and self.user != account:
# role = "SimpleUsers"
account.set_role(self.cleaned_data["role"])
return account
+8 -7
View File
@@ -228,6 +228,14 @@ class User(AbstractBaseUser, PermissionsMixin):
def enabled(self):
return self.is_active
@property
def encoded_address(self):
from email.header import Header
if self.first_name != "" or self.last_name != "":
return "%s <%s>" % \
(Header(self.fullname, 'utf8').encode(), self.email)
return self.email
def belongs_to_group(self, name):
"""Simple shortcut to check if this user is a member of a
specific group.
@@ -816,13 +824,6 @@ class Mailbox(DatesAware):
def full_address(self):
return self.__full_address(self.address)
@property
def name_and_address(self):
if self.user.first_name != "" or self.user.last_name != "":
return "%s %s <%s>" % \
(self.user.first_name, self.user.last_name, self.full_address)
return self.full_address
@property
def enabled(self):
return self.user.is_active
@@ -32,7 +32,7 @@ def send_autoreply(sender, mailbox, armessage):
lastar.armessage = armessage
lastar.sender = sender
sendmail_simple(mailbox.name_and_address, sender, armessage.subject,
sendmail_simple(mailbox.user.encoded_address, sender, armessage.subject,
armessage.content.encode('utf-8'))
lastar.last_sent = datetime.datetime.now()
+8 -35
View File
@@ -2,8 +2,6 @@
import time
from datetime import datetime, timedelta
import email
from email.utils import parseaddr
from email.header import Header
import lxml
import chardet
@@ -18,7 +16,9 @@ from modoboa.lib.webutils import size2integer
from modoboa.lib.email_listing import EmailListing
from modoboa.extensions.webmail.exceptions import WebmailError
from modoboa.extensions.webmail.imaputils import IMAPconnector, get_imapconnector, BodyStructure
from modoboa.lib.emailutils import EmailAddress, Email
from modoboa.lib.emailutils import (
EmailAddress, Email, prepare_addresses, set_email_headers
)
class WMtable(tables.Table):
@@ -611,25 +611,6 @@ def create_mail_attachment(attdef):
return res
def prepare_addresses(addresses, usage="header"):
"""Prepare addresses before using them
:param list addresses: a list of addresses
:param string usage: how those addresses are going to be used
:return: a string or a list depending on usage value
"""
result = []
for address in addresses.split(','):
name, addr = parseaddr(address)
if name and usage == "header":
result.append("%s <%s>" % (Header(name, 'utf8').encode(), addr))
else:
result.append(addr)
if usage == "header":
return ",".join(result)
return result
def send_mail(request, posturl=None):
"""Email verification and sending.
@@ -650,7 +631,6 @@ def send_mail(request, posturl=None):
editormode = parameters.get_user(request.user, "EDITOR")
if form.is_valid():
from email.mime.text import MIMEText
from email.utils import make_msgid, formatdate
import smtplib
body = request.POST["id_body"]
@@ -680,18 +660,11 @@ def send_mail(request, posturl=None):
for attdef in request.session["compose_mail"]["attachments"]:
msg.attach(create_mail_attachment(attdef))
msg["Subject"] = Header(form.cleaned_data["subject"], 'utf8')
if request.user.first_name != "" or request.user.last_name != "":
fromaddress = "%s <%s>" % (Header(request.user.fullname, 'utf8').encode(),
request.user.email)
else:
fromaddress = request.user.email
msg["From"] = fromaddress
msg["To"] = prepare_addresses(form.cleaned_data["to"])
msg["Message-ID"] = make_msgid()
msg["User-Agent"] = "Modoboa"
msg["Date"] = formatdate(time.time(), True)
if form.cleaned_data.has_key("origmsgid"):
set_email_headers(
msg, form.cleaned_data["subject"], request.user.encoded_address,
form.cleaned_data['to']
)
if "origmsgid" in form.cleaned_data:
msg["References"] = msg["In-Reply-To"] = form.cleaned_data["origmsgid"]
rcpts = prepare_addresses(form.cleaned_data["to"], "envelope")
for hdr in ["cc", "cci"]:
+35 -7
View File
@@ -7,7 +7,7 @@ from django.template.loader import render_to_string
from django.conf import settings
import u2u_decode
import smtplib
from email.header import decode_header
from email.header import Header, decode_header
from email.mime.text import MIMEText
from email.utils import make_msgid, formatdate, parseaddr
import time
@@ -214,6 +214,39 @@ def decode(s, encodings=('utf8', 'latin1', 'windows-1252', 'ascii'), charset=Non
pass
return s.decode('ascii', 'ignore')
def prepare_addresses(addresses, usage="header"):
"""Prepare addresses before using them
:param list addresses: a list of addresses
:param string usage: how those addresses are going to be used
:return: a string or a list depending on usage value
"""
result = []
for address in addresses.split(','):
name, addr = parseaddr(address)
if name and usage == "header":
result.append("%s <%s>" % (Header(name, 'utf8').encode(), addr))
else:
result.append(addr)
if usage == "header":
return ",".join(result)
return result
def set_email_headers(msg, subject, sender, rcpt):
"""Set mandatory headers.
Subject, From, To, Message-ID, User-Agent, Date
"""
msg["Subject"] = Header(subject, 'utf8')
msg["From"] = sender
msg["To"] = prepare_addresses(rcpt)
msg["Message-ID"] = make_msgid()
msg["User-Agent"] = "Modoboa"
msg["Date"] = formatdate(time.time(), True)
def __sendmail(sender, rcpt, msgstring, server='localhost', port=25):
"""Message sending
@@ -250,12 +283,7 @@ def sendmail_simple(sender, rcpt, subject="Sample message", content="", **kwargs
:return: tuple
"""
msg = MIMEText(content, _charset='utf-8')
msg["Subject"] = subject
msg["From"] = sender
msg["To"] = rcpt
msg["Message-ID"] = make_msgid()
msg["Date"] = formatdate(time.time(), True)
set_email_headers(msg, subject, sender, rcpt)
return __sendmail(sender, rcpt, msg.as_string(), **kwargs)
def sendmail_fromfile(sender, rcpt, fname):