[8.0][FIX][mail_tracking] Use event recipient address to find partners and contacts to bounce (#133)
This commit is contained in:
parent
527a8d09c5
commit
3b5ee4cd61
@ -190,12 +190,19 @@ class MailTrackingEmail(models.Model):
|
|||||||
'tracking_email_id': self.id,
|
'tracking_email_id': self.id,
|
||||||
})
|
})
|
||||||
|
|
||||||
def _partners_email_bounced_set(self, reason):
|
@api.multi
|
||||||
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([
|
self.env['res.partner'].search([
|
||||||
('email', '=ilike', tracking_email.recipient_address)
|
('email', '=ilike', recipient)
|
||||||
]).email_bounced_set(tracking_email, reason)
|
]).email_bounced_set(self, reason, event=event)
|
||||||
|
|
||||||
|
@api.multi
|
||||||
def smtp_error(self, mail_server, smtp_server, exception):
|
def smtp_error(self, mail_server, smtp_server, exception):
|
||||||
self.sudo().write({
|
self.sudo().write({
|
||||||
'error_smtp_server': tools.ustr(smtp_server),
|
'error_smtp_server': tools.ustr(smtp_server),
|
||||||
@ -206,6 +213,7 @@ class MailTrackingEmail(models.Model):
|
|||||||
self.sudo()._partners_email_bounced_set('error')
|
self.sudo()._partners_email_bounced_set('error')
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@api.multi
|
||||||
def tracking_img_add(self, email):
|
def tracking_img_add(self, email):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
tracking_url = self._get_mail_tracking_img()
|
tracking_url = self._get_mail_tracking_img()
|
||||||
@ -233,6 +241,7 @@ class MailTrackingEmail(models.Model):
|
|||||||
})
|
})
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
@api.multi
|
||||||
def _tracking_sent_prepare(self, mail_server, smtp_server, message,
|
def _tracking_sent_prepare(self, mail_server, smtp_server, message,
|
||||||
message_id):
|
message_id):
|
||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
@ -278,6 +287,7 @@ class MailTrackingEmail(models.Model):
|
|||||||
concurrent_event_ids = m_event.search(domain)
|
concurrent_event_ids = m_event.search(domain)
|
||||||
return concurrent_event_ids
|
return concurrent_event_ids
|
||||||
|
|
||||||
|
@api.multi
|
||||||
def event_create(self, event_type, metadata):
|
def event_create(self, event_type, metadata):
|
||||||
event_ids = self.env['mail.tracking.event']
|
event_ids = self.env['mail.tracking.event']
|
||||||
for tracking_email in self:
|
for tracking_email in self:
|
||||||
@ -285,11 +295,14 @@ class MailTrackingEmail(models.Model):
|
|||||||
if not other_ids:
|
if not other_ids:
|
||||||
vals = tracking_email._event_prepare(event_type, metadata)
|
vals = tracking_email._event_prepare(event_type, metadata)
|
||||||
if vals:
|
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:
|
else:
|
||||||
_logger.debug("Concurrent event '%s' discarded", event_type)
|
_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
|
return event_ids
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
|
# © 2016 Antonio Espinosa - <antonio.espinosa@tecnativa.com>
|
||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||||
|
|
||||||
|
import re
|
||||||
import time
|
import time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
@ -16,6 +17,9 @@ class MailTrackingEvent(models.Model):
|
|||||||
_description = 'MailTracking event'
|
_description = 'MailTracking event'
|
||||||
|
|
||||||
recipient = fields.Char(string="Recipient", readonly=True)
|
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(
|
timestamp = fields.Float(
|
||||||
string='UTC timestamp', readonly=True,
|
string='UTC timestamp', readonly=True,
|
||||||
digits=dp.get_precision('MailTracking Timestamp'))
|
digits=dp.get_precision('MailTracking Timestamp'))
|
||||||
@ -51,6 +55,20 @@ class MailTrackingEvent(models.Model):
|
|||||||
error_description = fields.Char(string='Error description', readonly=True)
|
error_description = fields.Char(string='Error description', readonly=True)
|
||||||
error_details = fields.Text(string='Error details', 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')
|
@api.depends('time')
|
||||||
def _compute_date(self):
|
def _compute_date(self):
|
||||||
for email in self:
|
for email in self:
|
||||||
|
@ -35,7 +35,7 @@ class ResPartner(models.Model):
|
|||||||
partner.tracking_emails_count = count
|
partner.tracking_emails_count = count
|
||||||
|
|
||||||
@api.multi
|
@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"""
|
"""Inherit this method to make any other actions to partners"""
|
||||||
partners = self.filtered(lambda r: not r.email_bounced)
|
partners = self.filtered(lambda r: not r.email_bounced)
|
||||||
return partners.write({'email_bounced': True})
|
return partners.write({'email_bounced': True})
|
||||||
|
Loading…
Reference in New Issue
Block a user