From b4e725bbdcaa0c4ecc81e4f4d235a15cc0476023 Mon Sep 17 00:00:00 2001 From: Sergey Lavrinenko Date: Thu, 2 Apr 2015 14:45:13 +0300 Subject: [PATCH] idna-encode emails on sent --- emails/backend/smtp/client.py | 7 +++++-- emails/django/__init__.py | 8 ++++---- emails/utils.py | 6 ++++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/emails/backend/smtp/client.py b/emails/backend/smtp/client.py index a2f865d..14d362f 100644 --- a/emails/backend/smtp/client.py +++ b/emails/backend/smtp/client.py @@ -1,11 +1,10 @@ # encoding: utf-8 - __all__ = ['SMTPClientWithResponse', 'SMTPClientWithResponse_SSL'] import smtplib from smtplib import _have_ssl, SMTP import logging - +from ... utils import sanitize_email logger = logging.getLogger(__name__) @@ -67,6 +66,8 @@ class SMTPClientWithResponse(SMTP): response = self.make_response() + from_addr = sanitize_email(from_addr) + response.from_addr = from_addr response.esmtp_opts = esmtp_opts[:] @@ -82,6 +83,8 @@ class SMTPClientWithResponse(SMTP): if not isinstance(to_addrs, (list, tuple)): to_addrs = [to_addrs] + to_addrs = [sanitize_email(e) for e in to_addrs] + response.to_addrs = to_addrs response.rcpt_options = rcpt_options[:] response.refused_recipients = {} diff --git a/emails/django/__init__.py b/emails/django/__init__.py index 3b9b9f4..a9dd409 100644 --- a/emails/django/__init__.py +++ b/emails/django/__init__.py @@ -2,6 +2,7 @@ from __future__ import absolute_import from django.core.mail import get_connection from .. message import MessageTransformerMixin, MessageSignMixin, MessageBuildMixin, BaseMessage +from .. utils import sanitize_email __all__ = ['DjangoMessageMixin', 'DjangoMessage'] @@ -15,13 +16,12 @@ class DjangoMessageMixin(object): return self.charset or 'utf-8' def recipients(self): - if self._recipients is not None: - return self._recipients - return [r[1] for r in self.mail_to] + r = self._recipients if self._recipients is not None else [r[1] for r in self.mail_to] + return [sanitize_email(e) for e in r] @property def from_email(self): - return self._from_email or self.mail_from[1] + return sanitize_email(self._from_email or self.mail_from[1]) def _set_emails(self, mail_to=None, set_mail_to=True, mail_from=None, set_mail_from=False, to=None): diff --git a/emails/utils.py b/emails/utils.py index 24374d9..67d2985 100644 --- a/emails/utils.py +++ b/emails/utils.py @@ -136,7 +136,9 @@ def parse_name_and_email(obj, encoding='utf-8'): return to_unicode(name, encoding) or None, to_unicode(email, encoding) or None -def sanitize_email(addr, encoding='ascii'): +def sanitize_email(addr, encoding='ascii', parse=False): + if parse: + _, addr = parseaddr(to_unicode(addr)) try: addr.encode('ascii') except UnicodeEncodeError: # IDN @@ -160,7 +162,7 @@ def sanitize_address(addr, encoding='ascii'): nm = Header(nm, encoding).encode() except UnicodeEncodeError: nm = Header(nm, 'utf-8').encode() - return formataddr((nm, sanitize_email(addr))) + return formataddr((nm, sanitize_email(addr, encoding=encoding, parse=False))) class MIMEMixin():