# -*- coding: utf-8 -*-
# Copyright 2017 Lorenzo Battistini - Agile Business Group
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl).
import logging
from odoo import models, api, tools, _
from odoo.tools import ustr
_logger = logging.getLogger(__name__)
class MailThread(models.AbstractModel):
_inherit = 'mail.thread'
@api.model
def notify_bounce_partners(self, message, fetchmail, message_dict):
message_id = message.get('Message-Id')
email_from = tools.decode_message_header(message, 'From')
email_from_localpart = (
(
tools.email_split(email_from) or ['']
)[0].split('@', 1)[0].lower()
)
# same criteria used by odoo
# see addons/mail/models/mail_thread.py
if (
message.get_content_type() == 'multipart/report' or
email_from_localpart == 'mailer-daemon'
):
references = tools.decode_message_header(message, 'References')
in_reply_to = tools.decode_message_header(
message, 'In-Reply-To').strip()
thread_references = references or in_reply_to
msg_references = [
ref for ref in
tools.mail_header_msgid_re.findall(thread_references) if
'reply_to' not in ref
]
MailMessage = self.env['mail.message']
mail_messages = MailMessage.sudo().search([
('message_id', 'in', msg_references)], limit=1)
recipients = mail_messages.mapped('author_id')
recipients |= fetchmail.bounce_notify_partner_ids
if not recipients:
_logger.info(
'Not notifying bounce email from %s with Message-Id %s: '
'no recipients found',
email_from, message_id
)
return
_logger.info(
'Notifying bounce email from %s with Message-Id %s',
email_from, message_id
)
email = self.env['mail.mail'].create({
'body_html': (
u"%s
%s
%s"
% (
ustr(message_dict['body']),
_("Raw message:"),
ustr(message.__str__()).replace(
"\n", "
")
)),
'subject': message_dict['subject'],
'recipient_ids': [
(6, 0, [p.id for p in recipients])
]
})
email.send()
@api.model
def message_route(
self, message, message_dict, model=None, thread_id=None,
custom_values=None
):
if self.env.context.get('fetchmail_server_id'):
fetchmail = self.env['fetchmail.server'].browse(
self.env.context['fetchmail_server_id'])
self.notify_bounce_partners(message, fetchmail, message_dict)
return super(MailThread, self).message_route(
message=message, message_dict=message_dict, model=model,
thread_id=thread_id, custom_values=custom_values
)