From 502206b8fa3d870803e241f22af9a45c2d8e4224 Mon Sep 17 00:00:00 2001 From: Antonio Espinosa Date: Fri, 25 Nov 2016 19:03:11 +0100 Subject: [PATCH] [8.0][FIX][mail_tracking] Use event recipient address to find partners and contacts to bounce (#133) --- mail_tracking/models/mail_tracking_email.py | 22 ++++++++++++++------- mail_tracking/models/mail_tracking_event.py | 17 ++++++++++++++++ mail_tracking/models/res_partner.py | 2 +- 3 files changed, 33 insertions(+), 8 deletions(-) diff --git a/mail_tracking/models/mail_tracking_email.py b/mail_tracking/models/mail_tracking_email.py index 845fe468..21c3728b 100644 --- a/mail_tracking/models/mail_tracking_email.py +++ b/mail_tracking/models/mail_tracking_email.py @@ -195,11 +195,16 @@ class MailTrackingEmail(models.Model): }) @api.multi - def _partners_email_bounced_set(self, reason): - for tracking_email in self: + def _partners_email_bounced_set(self, reason, event=None): + recipients = [] + if event and event.recipient_address: + recipients.append(event.recipient_address) + else: + recipients = list(filter(None, self.mapped('recipient_address'))) + for recipient in recipients: self.env['res.partner'].search([ - ('email', '=ilike', tracking_email.recipient_address) - ]).email_bounced_set(tracking_email, reason) + ('email', '=ilike', recipient) + ]).email_bounced_set(self, reason, event=event) @api.multi def smtp_error(self, mail_server, smtp_server, exception): @@ -296,11 +301,14 @@ class MailTrackingEmail(models.Model): if not other_ids: vals = tracking_email._event_prepare(event_type, metadata) if vals: - event_ids += event_ids.sudo().create(vals) + events = event_ids.sudo().create(vals) + if event_type in {'hard_bounce', 'spam', 'reject'}: + for event in events: + self.sudo()._partners_email_bounced_set( + event_type, event=event) + event_ids += events else: _logger.debug("Concurrent event '%s' discarded", event_type) - if event_type in {'hard_bounce', 'spam', 'reject'}: - self.sudo()._partners_email_bounced_set(event_type) return event_ids @api.model diff --git a/mail_tracking/models/mail_tracking_event.py b/mail_tracking/models/mail_tracking_event.py index c68d957a..ac3fab1d 100644 --- a/mail_tracking/models/mail_tracking_event.py +++ b/mail_tracking/models/mail_tracking_event.py @@ -2,6 +2,7 @@ # © 2016 Antonio Espinosa - # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +import re import time from datetime import datetime @@ -16,6 +17,9 @@ class MailTrackingEvent(models.Model): _description = 'MailTracking event' recipient = fields.Char(string="Recipient", readonly=True) + recipient_address = fields.Char( + string='Recipient email address', readonly=True, store=True, + compute='_compute_recipient_address', index=True) timestamp = fields.Float( string='UTC timestamp', readonly=True, digits=dp.get_precision('MailTracking Timestamp')) @@ -51,6 +55,19 @@ class MailTrackingEvent(models.Model): error_description = fields.Char(string='Error description', readonly=True) error_details = fields.Text(string='Error details', readonly=True) + @api.multi + @api.depends('recipient') + def _compute_recipient_address(self): + for email in self: + if email.recipient: + matches = re.search(r'<(.*@.*)>', email.recipient) + if matches: + email.recipient_address = matches.group(1).lower() + else: + email.recipient_address = email.recipient.lower() + else: + email.recipient_address = False + @api.multi @api.depends('time') def _compute_date(self): diff --git a/mail_tracking/models/res_partner.py b/mail_tracking/models/res_partner.py index faa1db88..6494b744 100644 --- a/mail_tracking/models/res_partner.py +++ b/mail_tracking/models/res_partner.py @@ -36,7 +36,7 @@ class ResPartner(models.Model): partner.tracking_emails_count = count @api.multi - def email_bounced_set(self, tracking_email, reason): + def email_bounced_set(self, tracking_emails, reason, event=None): """Inherit this method to make any other actions to partners""" partners = self.filtered(lambda r: not r.email_bounced) return partners.write({'email_bounced': True})