From 722edf3a306e495808c3ca751f6c74f5d6e5b138 Mon Sep 17 00:00:00 2001 From: Folker Bernitt Date: Tue, 1 Sep 2015 11:13:09 +0200 Subject: Encode headers in InputMail when generating mime multipart from it. - Issue #360 --- service/pixelated/adapter/model/mail.py | 15 ++++++++++++--- service/test/unit/adapter/test_mail.py | 10 ++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/service/pixelated/adapter/model/mail.py b/service/pixelated/adapter/model/mail.py index 388263ca..733678db 100644 --- a/service/pixelated/adapter/model/mail.py +++ b/service/pixelated/adapter/model/mail.py @@ -21,7 +21,7 @@ import dateutil.parser as dateparser from uuid import uuid4 from email import message_from_file from email.mime.text import MIMEText -from email.header import decode_header +from email.header import decode_header, Header from email.MIMEMultipart import MIMEMultipart from pycryptopp.hash import sha256 from leap.mail.adaptors import soledad_indexes as fields @@ -89,6 +89,15 @@ class Mail(object): def bounced(self): return False + def _encode_header_value_list(self, header_value_list): + return [self._encode_header_value(v) for v in header_value_list] + + def _encode_header_value(self, header_value): + if isinstance(header_value, unicode): + return str(Header(header_value, 'utf-8')) + else: + return str(header_value) + @property def _mime_multipart(self): if self._mime: @@ -96,9 +105,9 @@ class Mail(object): mime = MIMEMultipart() for key, value in self.headers.items(): if isinstance(value, list): - mime[str(key)] = ', '.join(value) + mime[str(key)] = ', '.join(self._encode_header_value_list(value)) else: - mime[str(key)] = str(value) + mime[str(key)] = self._encode_header_value(value) try: body_to_use = self.body diff --git a/service/test/unit/adapter/test_mail.py b/service/test/unit/adapter/test_mail.py index d30e2485..03a37c1f 100644 --- a/service/test/unit/adapter/test_mail.py +++ b/service/test/unit/adapter/test_mail.py @@ -465,6 +465,16 @@ class InputMailTest(unittest.TestCase): self.assertRegexpMatches(mime_multipart.as_string(), "\nSubject: Oi\n") self.assertRegexpMatches(mime_multipart.as_string(), base64.b64encode(simple_mail_dict()['body'])) + def test_to_mime_multipart_with_special_chars(self): + mail_dict = simple_mail_dict() + mail_dict['header']['to'] = u'"Älbert Übrö \xF0\x9F\x92\xA9" <äüö@example.mail>' + pixelated.support.date.iso_now = lambda: 'date now' + + mime_multipart = InputMail.from_dict(mail_dict).to_mime_multipart() + + expected_part_of_encoded_to = 'Iiwgw4QsIGwsIGIsIGUsIHIsIHQsICAsIMOcLCBiLCByLCDDtiwgICwgw7As' + self.assertRegexpMatches(mime_multipart.as_string(), expected_part_of_encoded_to) + def test_smtp_format(self): InputMail.FROM_EMAIL_ADDRESS = 'pixelated@org' -- cgit v1.2.3