Odoo 邮件系统设置

Odoo 邮件发送失败源代码分析

            Odoo的邮件跟踪功能是做的非常好的, 可以通过系统邮件,当客户回复邮件之后,系统会自动将邮件内容作为消息与原有记录进行对应。
            很多初学者,发送邮件时常常遇到如下错误。
            邮件投递失败
            通过SMTP发送邮件失败 'None'.
            SMTPSenderRefused: 501
            mail from address must be same as authorization user
            bounce+12-sale.order-6@odooqs.com
            为什么发送地址会变为"bounce+12-sale.order-6@odooqs.com"呢?
            我们来分析源代码,参见ir_mail_server.py中send_mail 方法:
            smtp_from = message['Return-Path'] or self._get_default_bounce_address() or message['From']
            assert smtp_from, "The Return-Path or From header is required for any outbound email"
            我们看到 smtp_from 的获取值的先后顺序,其中最后一个值message['From'],指的是当前用户的邮箱。如果我们要用当前用户的邮箱发送邮件,是不太好的, 因为,我们就需要为每个用户设置一个发送邮件的账号。
            message['Return-Path'] 来源自mail_mail.py 中_send 方法,代码如下:
            # headers
            headers = {}
            ICP = self.env['ir.config_parameter'].sudo()
            bounce_alias = ICP.get_param("mail.bounce.alias")
            catchall_domain = ICP.get_param("mail.catchall.domain")
            if bounce_alias and catchall_domain:
            if mail.model and mail.res_id:
            headers['Return-Path'] = '%s+%d-%s-%d@%s' % (bounce_alias, mail.id, mail.model, mail.res_id, catchall_domain)
            else:
            headers['Return-Path'] = '%s+%d@%s' % (bounce_alias, mail.id, catchall_domain)
            if mail.headers:
            try:
            headers.update(safe_eval(mail.headers))
            except Exception:
            pass
            从上述代码可以看出,icp.config_paramerter,中存在 bounce_alias,catchall_domain ,就会生成 Return-Path 的值
            self._get_default_bounce_address()来源自ir_mail_server.py 中_get_default_bounce_address方法:
            @api.model
            def _get_default_bounce_address(self):
            '''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.bounce.alias" and
            "mail.catchall.domain".

            If "mail.bounce.alias" is not set it defaults to "postmaster-odoo".

            If "mail.catchall.domain" is not set, return None.

            '''
            get_param = self.env['ir.config_parameter'].sudo().get_param
            postmaster = get_param('mail.bounce.alias', default='postmaster-odoo')
            domain = get_param('mail.catchall.domain')
            if postmaster and domain:
            return '%s@%s' % (postmaster, domain)
            从以上可以得知 _get_default_bounce_address 发送邮件名来源于 mail.bounce.alias ,默认值是postmaster-odoo.
            根据以上代码的值,不删除mail.bounce.alias的值,会导致发送地址错误,删除mail.bounce.alias的值,导致默认发送邮箱名是postmaster-odoo.
            综上所述,在不修改代码的情况,我们需要如何做才能正常收发邮件呢?
            1.设置自己公司的企业邮箱,我使用的是免费的腾讯企业邮箱。
            2.在自己企业内部邮箱中设置postmaster-odoo@xxx.com ,catchall@xxx.com(专门用于接收邮件) 等2个账号。
            3.在Odoo 系统中设置SMTP 服务器,用户名必须为postmaster-odoo@xxx.com.
            4.在Odoo 系统中设置POP3服务器,用户名必须为catchall@xxx.com.
            5.在Odoo系统中设置邮箱域名,对应xxx.com.
            6.为每个用户设置一个邮箱,否则发送邮件时,会报错,要求你设置邮箱。 这个邮箱也可以用户自己在用户资料中设置更改。
            最后一步,也是最重要的,在系统参数中删除 mail.bounce.alias 这条记录就可以了,否则,前功尽弃。
            欢迎大家讨论,参考。转载,请注明出处!