diff --git a/djrill/mail/backends/djrill.py b/djrill/mail/backends/djrill.py index 18ee6a8..6ddc7ce 100644 --- a/djrill/mail/backends/djrill.py +++ b/djrill/mail/backends/djrill.py @@ -294,15 +294,18 @@ class DjrillBackend(BaseEmailBackend): if mimetype is None: mimetype = DEFAULT_ATTACHMENT_MIME_TYPE + # b64encode requires bytes, so let's convert our content. try: - content_b64 = b64encode(content) - except TypeError: - # Python 3 b64encode requires bytes. Convert str attachment: + if isinstance(content, unicode): + # Python 2.X unicode string + content = content.encode(str_encoding) + except NameError: + # Python 3 doesn't differentiate between strings and unicode + # Convert python3 unicode str to bytes attachment: if isinstance(content, str): - content_bytes = content.encode(str_encoding) - content_b64 = b64encode(content_bytes) - else: - raise + content = content.encode(str_encoding) + + content_b64 = b64encode(content) mandrill_attachment = { 'type': mimetype, diff --git a/djrill/tests/test_mandrill_send.py b/djrill/tests/test_mandrill_send.py index 583d5b1..403584a 100644 --- a/djrill/tests/test_mandrill_send.py +++ b/djrill/tests/test_mandrill_send.py @@ -1,3 +1,7 @@ +# -*- coding: utf-8 -*- + +from __future__ import unicode_literals + from base64 import b64decode from datetime import date, datetime, timedelta, tzinfo from email.mime.base import MIMEBase @@ -177,6 +181,23 @@ class DjrillBackendTests(DjrillBackendMockAPITestCase): # Make sure the image attachment is not treated as embedded: self.assertFalse('images' in data['message']) + def test_unicode_attachment_correctly_decoded(self): + msg = mail.EmailMessage( + subject='Subject', + body='Body goes here', + from_email='from@example.com', + to=['to1@example.com'], + ) + # Slight modification from the Django unicode docs: + # http://django.readthedocs.org/en/latest/ref/unicode.html#email + msg.attach("Une pièce jointe.html", '

\u2019

', mimetype='text/html') + + msg.send() + data = self.get_api_call_data() + + attachments = data['message']['attachments'] + self.assertEqual(len(attachments), 1) + def test_embedded_images(self): image_data = self.sample_image_content() # Read from a png file image_cid = make_msgid("img") # Content ID per RFC 2045 section 7 (with <...>)