diff options
| author | Julien Castiaux <juc@odoo.com> | 2019-08-14 12:45:20 +0000 |
|---|---|---|
| committer | Julien Castiaux <juc@odoo.com> | 2019-09-17 11:20:13 +0000 |
| commit | 1b057dd76b19db00eb5b63dc02f87cdc13cc07cf (patch) | |
| tree | c1dd1597e47d68413a32f22cb03a21d18b37294c /addons/mail/models/mail_thread.py | |
| parent | a7a63bdb4a933fb54e78c3176e37ffca0e457735 (diff) | |
[REF] mail,test_mail: prefer EmailMessage over deprecated Message
[PEP 594][1] is going to depreciate legacy `email.message.Message` API in
PY3.8 in favor `email.message.EmailMessage`.
All `email.message_from_x` constructor functions take an optional
`policy` argument. The policy can either be `policy.compat32` to
generate an `email.message.Message` instance, either be `policy.SMTP`
to generate an `email.message.EmailMessage` instance.
The [current][2] default policy is `policy.compat32` but will change in
a future version of python. It is recommended to always specify the
policy.
[1]: https://www.python.org/dev/peps/pep-0594/#email-legacy-api
[2] https://docs.python.org/3.7/library/email.parser.html#email.parser.BytesParser
Diffstat (limited to 'addons/mail/models/mail_thread.py')
| -rw-r--r-- | addons/mail/models/mail_thread.py | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/addons/mail/models/mail_thread.py b/addons/mail/models/mail_thread.py index 94ae2e4b448..15d5f882f0a 100644 --- a/addons/mail/models/mail_thread.py +++ b/addons/mail/models/mail_thread.py @@ -5,6 +5,7 @@ import base64 import datetime import dateutil import email +import email.policy import hashlib import hmac import lxml @@ -20,7 +21,7 @@ except ImportError: import xmlrpclib from collections import namedtuple -from email.message import Message +from email.message import EmailMessage from email.utils import formataddr from lxml import etree from werkzeug import url_encode @@ -876,8 +877,8 @@ class MailThread(models.AbstractModel): :raises: ValueError, TypeError """ - if not isinstance(message, Message): - raise TypeError('message must be an email.message.Message at this point') + if not isinstance(message, EmailMessage): + raise TypeError('message must be an email.message.EmailMessage at this point') catchall_alias = self.env['ir.config_parameter'].sudo().get_param("mail.catchall.alias") bounce_alias = self.env['ir.config_parameter'].sudo().get_param("mail.bounce.alias") fallback_model = model @@ -1093,7 +1094,7 @@ class MailThread(models.AbstractModel): message = bytes(message.data) if isinstance(message, str): message = message.encode('utf-8') - message = email.message_from_bytes(message) + message = email.message_from_bytes(message, policy=email.policy.SMTP) # parse the message, verify we are not in a loop by checking message_id is not duplicated msg_dict = self.message_parse(message, save_original=save_original) @@ -1301,8 +1302,8 @@ class MailThread(models.AbstractModel): :param message_dict: dictionary holding already-parsed values and in which bounce-related values will be added; """ - if not isinstance(email_message, Message): - raise TypeError('message must be an email.message.Message at this point') + if not isinstance(email_message, EmailMessage): + raise TypeError('message must be an email.message.EmailMessage at this point') email_part = next((part for part in email_message.walk() if part.get_content_type() == 'message/rfc822'), None) dsn_part = next((part for part in email_message.walk() if part.get_content_type() == 'message/delivery-status'), None) @@ -1361,8 +1362,8 @@ class MailThread(models.AbstractModel): ('file2', 'bytes')} } """ - if not isinstance(message, Message): - raise ValueError(_('Message should be a valid Message instance')) + if not isinstance(message, EmailMessage): + raise ValueError(_('Message should be a valid EmailMessage instance')) msg_dict = {'message_type': 'email'} message_id = message.get('Message-Id') |
