diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py index 1c53d0477a7..b71176bcd08 100644 --- a/addons/mail/mail_mail.py +++ b/addons/mail/mail_mail.py @@ -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 diff --git a/openerp/addons/base/ir/ir_mail_server.py b/openerp/addons/base/ir/ir_mail_server.py index 2624abb8c5f..881eafb8549 100644 --- a/openerp/addons/base/ir/ir_mail_server.py +++ b/openerp/addons/base/ir/ir_mail_server.py @@ -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):