diff --git a/modoboa/admin/forms.py b/modoboa/admin/forms.py index 7fefb0af3..42ffdbb1e 100644 --- a/modoboa/admin/forms.py +++ b/modoboa/admin/forms.py @@ -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 diff --git a/modoboa/admin/models.py b/modoboa/admin/models.py index 6ef1e59e6..87c546c50 100644 --- a/modoboa/admin/models.py +++ b/modoboa/admin/models.py @@ -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 diff --git a/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py b/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py index 5731833c0..ed189fef4 100644 --- a/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py +++ b/modoboa/extensions/postfix_autoreply/management/commands/autoreply.py @@ -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() diff --git a/modoboa/extensions/webmail/lib.py b/modoboa/extensions/webmail/lib.py index 0bc18ef39..593052d18 100644 --- a/modoboa/extensions/webmail/lib.py +++ b/modoboa/extensions/webmail/lib.py @@ -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"]: diff --git a/modoboa/lib/emailutils.py b/modoboa/lib/emailutils.py index 125336c03..ca67ae35d 100644 --- a/modoboa/lib/emailutils.py +++ b/modoboa/lib/emailutils.py @@ -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):