[FIX] mail: partners with missing/invalid emails must not halt notifications to others
authorManuel Vázquez Acosta <mva.led@gmail.com>
Fri, 3 Oct 2014 13:19:30 +0000 (09:19 -0400)
committerOlivier Dony <odo@openerp.com>
Tue, 4 Nov 2014 16:32:32 +0000 (17:32 +0100)
addons/mail/mail_mail.py
openerp/addons/base/ir/ir_mail_server.py

index 1c53d04..b71176b 100644 (file)
@@ -305,8 +305,23 @@ class mail_mail(osv.Model):
                         object_id = mail.res_id and ('%s-%s' % (mail.res_id, mail.model)),
                         subtype = 'html',
                         subtype_alternative = 'plain')
-                    res = ir_mail_server.send_email(cr, uid, msg,
-                        mail_server_id=mail.mail_server_id.id, context=context)
+                    try:
+                        res = ir_mail_server.send_email(
+                            cr, uid,
+                            msg,
+                            mail_server_id=mail.mail_server_id.id,
+                            context=context
+                        )
+                    except AssertionError as error:
+                        if error.message == ir_mail_server.NO_VALID_RECIPIENT:
+                            # No valid recipient found for this particular
+                            # mail item -> ignore error to avoid blocking
+                            # delivery to next recipients, if any. If this is
+                            # the only recipient, the mail will show as failed.
+                            _logger.warning("Ignoring invalid recipients for mail.mail %s: %s",
+                                            mail.message_id, email.get('email_to'))
+                        else:
+                            raise
                 if res:
                     mail.write({'state': 'sent', 'message_id': res})
                     mail_sent = True
index 2624abb..881eafb 100644 (file)
@@ -146,11 +146,15 @@ def encode_rfc2822_address_header(header_text):
 
     addresses = getaddresses([tools.ustr(header_text).encode('utf-8')])
     return COMMASPACE.join(map(encode_addr, addresses))
+
+
 class ir_mail_server(osv.osv):
     """Represents an SMTP server, able to send outgoing emails, with SSL and TLS capabilities."""
     _name = "ir.mail_server"
 
+    NO_VALID_RECIPIENT = ("At least one valid recipient address should be "
+                          "specified for outgoing emails (To/Cc/Bcc)")
+
     _columns = {
         'name': fields.char('Description', size=64, required=True, select=True),
         'smtp_host': fields.char('SMTP Server', size=128, required=True, help="Hostname or IP of SMTP server"),
@@ -397,7 +401,7 @@ class ir_mail_server(osv.osv):
         email_cc = message['Cc']
         email_bcc = message['Bcc']
         smtp_to_list = filter(None, tools.flatten(map(extract_rfc2822_addresses,[email_to, email_cc, email_bcc])))
-        assert smtp_to_list, "At least one valid recipient address should be specified for outgoing emails (To/Cc/Bcc)"
+        assert smtp_to_list, self.NO_VALID_RECIPIENT
 
         # Do not actually send emails in testing mode!
         if getattr(threading.currentThread(), 'testing', False):