# -*- coding: utf-8 -*- # Copyright 2017-18 Eficent Business and IT Consulting Services S.L. # (www.eficent.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). import email import xmlrpclib import logging from email.message import Message from odoo import api, models from odoo.tools import decode_smtp_header as decode _logger = logging.getLogger(__name__) class MailThread(models.AbstractModel): _inherit = 'mail.thread' @api.model def message_parse_basic_data(self, message): """Parses a string or email.message.Message representing an RFC-2822 email, and returns a generic dict holding the message details. :param message: the message to parse :rtype: dict :return: A dict with the following structure, where each field may not be present if missing in original message: { 'message_id': msg_id, 'subject': subject, 'from': from, 'to': to, 'cc': cc } """ msg_dict = { '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 = message.encode('utf-8') message = email.message_from_string(message) message_id = message['message-id'] if not message_id: message_id = 'None' msg_dict['message_id'] = message_id if message.get('Subject'): msg_dict['subject'] = decode(message.get('Subject')) # Envelope fields not stored in mail.message but made available # for message_new() msg_dict['from'] = decode(message.get('from')) msg_dict['to'] = decode(message.get('to')) msg_dict['cc'] = decode(message.get('cc')) msg_dict['email_from'] = decode(message.get('from')) return msg_dict @api.model def message_process(self, model, message, custom_values=None, save_original=False, strip_attachments=False, thread_id=None): if isinstance(message, xmlrpclib.Binary): message = str(message.data) # Warning: message_from_string doesn't always work correctly on # unicode, we must use utf-8 strings here :-( if isinstance(message, unicode): message = message.encode('utf-8') msg_txt = email.message_from_string(message) msg = self.message_parse_basic_data(msg_txt) _logger.info( 'Fetched mail from %s to %s with Message-Id %s', msg.get('from'), msg.get('to'), msg.get('message_id')) return super(MailThread, self).message_process( model, message, custom_values=custom_values, save_original=save_original, strip_attachments=strip_attachments, thread_id=thread_id)