summaryrefslogtreecommitdiff
path: root/addons/mass_mailing/models/mail_thread.py
diff options
context:
space:
mode:
authorThibault Delavallée <tde@openerp.com>2016-07-08 14:18:08 +0200
committerThibault Delavallée <tde@openerp.com>2016-09-01 13:11:49 +0200
commit9c1af690d58068f3831bc7e22878d9b0065f8a28 (patch)
treedda85513159d57a46c697a88073608adeb336855 /addons/mass_mailing/models/mail_thread.py
parent72dfcae2a4b03623e780b857abf37c7aec5b8456 (diff)
[IMP] mail: bounce management
Handle bounces using bounce alias directly in mailgateway. Previously bounces were used only in mass mailing to update campaign statistics. Now the mailgateway tries to find data from standard delivery status emails. This data is used to update state of emails sent to customers, to display it in the Chatter. It is also used to increment the message_bounce counter on the bounced partner and bounced record, if any and if the field exists. Previous more generic code that detect bounces is kept. This code is more specific to standard delivery failure notifications by parsing its content.
Diffstat (limited to 'addons/mass_mailing/models/mail_thread.py')
-rw-r--r--addons/mass_mailing/models/mail_thread.py47
1 files changed, 8 insertions, 39 deletions
diff --git a/addons/mass_mailing/models/mail_thread.py b/addons/mass_mailing/models/mail_thread.py
index af5782b9360..066dd285c79 100644
--- a/addons/mass_mailing/models/mail_thread.py
+++ b/addons/mass_mailing/models/mail_thread.py
@@ -4,63 +4,32 @@
import logging
import re
-from odoo import api, models
+from odoo import api, models, tools
from odoo.tools import decode_smtp_header, decode_message_header
_logger = logging.getLogger(__name__)
class MailThread(models.AbstractModel):
- """ Update MailThread to add the feature of bounced emails and replied emails
- in message_process. """
+ """ Update MailThread to add the support of bounce management in mass mailing statistics. """
_inherit = 'mail.thread'
- def message_route_check_bounce(self, message):
- """ Override to verify that the email_to is the bounce alias. If it is the
- case, log the bounce, set the parent and related document as bounced and
- return False to end the routing process. """
+ @api.model
+ def message_route(self, message, message_dict, model=None, thread_id=None, custom_values=None):
+ """ Override to udpate mass mailing statistics based on bounce emails """
bounce_alias = self.env['ir.config_parameter'].get_param("mail.bounce.alias")
- message_id = message.get('Message-Id')
- email_from = decode_message_header(message, 'From')
email_to = decode_message_header(message, 'To')
+ email_to_localpart = (tools.email_split(email_to) or [''])[0].split('@', 1)[0].lower()
- # 0. Verify whether this is a bounced email (wrong destination,...) -> use it to collect data, such as dead leads
- if bounce_alias and bounce_alias in email_to:
- # Bounce regex
- # Typical form of bounce is bounce_alias-128-crm.lead-34@domain
- # group(1) = the mail ID; group(2) = the model (if any); group(3) = the record ID
+ if bounce_alias and bounce_alias in email_to_localpart:
bounce_re = re.compile("%s\+(\d+)-?([\w.]+)?-?(\d+)?" % re.escape(bounce_alias), re.UNICODE)
bounce_match = bounce_re.search(email_to)
if bounce_match:
- bounced_model, bounced_thread_id = None, False
bounced_mail_id = bounce_match.group(1)
- statistics = self.env['mail.mail.statistics'].set_bounced(mail_mail_ids=[bounced_mail_id])
- for stat in statistics:
- bounced_model = stat.model
- bounced_thread_id = stat.res_id
- _logger.info('Routing mail from %s to %s with Message-Id %s: bounced mail from mail %s, model: %s, thread_id: %s',
- email_from, email_to, message_id, bounced_mail_id, bounced_model, bounced_thread_id)
- if bounced_model and bounced_model in self.env and hasattr(self.env[bounced_model], 'message_receive_bounce') and bounced_thread_id:
- self.env[bounced_model].browse(bounced_thread_id).message_receive_bounce(mail_id=bounced_mail_id)
- return False
-
- return True
+ self.env['mail.mail.statistics'].set_bounced(mail_mail_ids=[bounced_mail_id])
- @api.model
- def message_route(self, message, message_dict, model=None, thread_id=None, custom_values=None):
- if not self.message_route_check_bounce(message):
- return []
return super(MailThread, self).message_route(message, message_dict, model, thread_id, custom_values)
- def message_receive_bounce(self, mail_id=None):
- """Called by ``message_process`` when a bounce email (such as Undelivered
- Mail Returned to Sender) is received for an existing thread. The default
- behavior is to check is an integer ``message_bounce`` column exists.
- If it is the case, its content is incremented. """
- if 'message_bounce' in self._fields:
- for mail_thread in self:
- mail_thread.message_bounce = mail_thread.message_bounce + 1
-
@api.model
def message_route_process(self, message, message_dict, routes):
""" Override to update the parent mail statistics. The parent is found