diff --git a/openerp/addons/base/ir/ir_mail_server.py b/openerp/addons/base/ir/ir_mail_server.py index 881eafb8549..6a7784fead1 100644 --- a/openerp/addons/base/ir/ir_mail_server.py +++ b/openerp/addons/base/ir/ir_mail_server.py @@ -361,6 +361,27 @@ class ir_mail_server(osv.osv): msg.attach(part) return msg + def _get_default_bounce_address(self, cr, uid, context=None): + '''Compute the default bounce address. + + The default bounce address is used to set the envelop address if no + envelop address is provided in the message. It is formed by properly + joining the parameters "mail.catchall.alias" and + "mail.catchall.domain". + + If "mail.catchall.alias" is not set it defaults to "postmaster-odoo". + + If "mail.catchall.domain" is not set, return None. + + ''' + get_param = self.pool['ir.config_parameter'].get_param + postmaster = get_param(cr, uid, 'mail.catchall.alias', + default='postmaster-odoo', + context=context,) + domain = get_param(cr, uid, 'mail.catchall.domain', context=context) + if postmaster and domain: + return '%s@%s' % (postmaster, domain) + def send_email(self, cr, uid, message, mail_server_id=None, smtp_server=None, smtp_port=None, smtp_user=None, smtp_password=None, smtp_encryption=None, smtp_debug=False, context=None): @@ -376,8 +397,9 @@ class ir_mail_server(osv.osv): and fails if not found. :param message: the email.message.Message to send. The envelope sender will be extracted from the - ``Return-Path`` or ``From`` headers. The envelope recipients will be - extracted from the combined list of ``To``, ``CC`` and ``BCC`` headers. + ``Return-Path`` (if present), or will be set to the default bounce address. + The envelope recipients will be extracted from the combined list of ``To``, + ``CC`` and ``BCC`` headers. :param mail_server_id: optional id of ir.mail_server to use for sending. overrides other smtp_* arguments. :param smtp_server: optional hostname of SMTP server to use :param smtp_encryption: optional TLS mode, one of 'none', 'starttls' or 'ssl' (see ir.mail_server fields for explanation) @@ -388,7 +410,14 @@ class ir_mail_server(osv.osv): :return: the Message-ID of the message that was just sent, if successfully sent, otherwise raises MailDeliveryException and logs root cause. """ - smtp_from = message['Return-Path'] or message['From'] + # Use the default bounce address **only if** no Return-Path was + # provided by caller. Caller may be using Variable Envelope Return + # Path (VERP) to detect no-longer valid email addresses. + smtp_from = message['Return-Path'] + if not smtp_from: + smtp_from = self._get_default_bounce_address(cr, uid, context=context) + if not smtp_from: + smtp_from = message['From'] assert smtp_from, "The Return-Path or From header is required for any outbound email" # The email's "Envelope From" (Return-Path), and all recipient addresses must only contain ASCII characters.