summaryrefslogtreecommitdiff
path: root/addons/mail/models/mail_thread.py
diff options
context:
space:
mode:
Diffstat (limited to 'addons/mail/models/mail_thread.py')
-rw-r--r--addons/mail/models/mail_thread.py27
1 files changed, 15 insertions, 12 deletions
diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py
index 35ae6d4ff9e..bc7b1d1072d 100644
--- a/addons/mail/models/mail_thread.py
+++ b/addons/mail/models/mail_thread.py
@@ -423,7 +423,7 @@ class MailThread(models.AbstractModel):
for field_name, (template, post_kwargs) in pycompat.items(templates):
if not template:
continue
- if isinstance(template, basestring):
+ if isinstance(template, pycompat.string_types):
self.message_post_with_view(template, **post_kwargs)
else:
self.message_post_with_template(template.id, **post_kwargs)
@@ -1268,12 +1268,15 @@ class MailThread(models.AbstractModel):
# convert it to utf-8 for transport between the mailgate script and here.
if isinstance(message, xmlrpclib.Binary):
message = bytes(message.data)
- # FIXME: message_from_string parses from a *native string*
- # Warning: message_from_string doesn't always work correctly on unicode,
- # we must use utf-8 strings here :-(
- if isinstance(message, unicode):
+ # message_from_string parses from a *native string*, except apparently
+ # sometimes message is ISO-8859-1 binary data or some shit and the
+ # straightforward version (pycompat.to_native) won't work right ->
+ # always encode message to bytes then use the relevant method
+ # depending on ~python version
+ if isinstance(message, pycompat.text_type):
message = message.encode('utf-8')
- msg_txt = email.message_from_string(message)
+ extract = getattr(email, 'message_from_bytes', email.message_from_string)
+ msg_txt = extract(message)
# parse the message, verify we are not in a loop by checking message_id is not duplicated
msg = self.message_parse(msg_txt, save_original=save_original)
@@ -1494,9 +1497,9 @@ class MailThread(models.AbstractModel):
'message_type': 'email',
}
if not isinstance(message, Message):
- if isinstance(message, unicode):
- # Warning: message_from_string doesn't always work correctly on unicode,
- # we must use utf-8 strings here :-(
+ # message_from_string works on a native str, so on py2 we need to
+ # encode incoming unicode strings
+ if pycompat.PY2 and not isinstance(message, str):
message = message.encode('utf-8')
message = email.message_from_string(message)
@@ -1725,11 +1728,11 @@ class MailThread(models.AbstractModel):
cid = info and info.get('cid')
else:
continue
- if isinstance(content, unicode):
+ if isinstance(content, pycompat.text_type):
content = content.encode('utf-8')
data_attach = {
'name': name,
- 'datas': base64.b64encode(str(content)),
+ 'datas': base64.b64encode(content),
'type': 'binary',
'datas_fname': name,
'description': name,
@@ -1922,7 +1925,7 @@ class MailThread(models.AbstractModel):
values['slug'] = slug
except ImportError:
values['slug'] = lambda self: self.id
- if isinstance(views_or_xmlid, basestring):
+ if isinstance(views_or_xmlid, pycompat.string_types):
views = self.env.ref(views_or_xmlid, raise_if_not_found=False)
else:
views = views_or_xmlid