mail_outbound_static: Domain whitelist based logic.

This commit is contained in:
Katherine Zaoral 2020-08-25 13:59:39 -03:00 committed by Maksym Yankin
parent bcff3bbb15
commit 7a9fcb44e3
12 changed files with 477 additions and 25 deletions

View File

@ -26,8 +26,29 @@ Mail Outbound Static
|badge1| |badge2| |badge3| |badge4| |badge5|
This module brings Odoo outbound emails in to strict compliance with RFC-2822
by allowing for a statically configured From header, with the sender's e-mail
being appended into the proper Sender header instead.
by allowing for a dynamically configured From header, with the sender's e-mail
being appended into the proper Sender header instead. To accomplish this we:
* Add a domain whitelist field in the mail server model. This one represent an
allowed Domains list separated by commas. If there is not given SMTP server
it will let us to search the proper mail server to be used to sent themessages
where the message 'From' email domain match with the domain whitelist. If
there is not mail sever that match then will use the default mail server to
sent the message.
* Add a Email From field that will let us to email from a specific address taking
into account this conditions:
1) If the sender domain match with the domain whitelist then the original
message's 'From' will remain as it is and will not be changed because the
mail server is able to sent in the name of the sender domain.
2) If the original message's 'From' does not match with the domain whitelist
then the email From is replaced with the Email From field value.
* Add compatibility to define the smtp information in Odoo config file. Both
smtp_from and smtp_whitelist_domain values will be used if there is not mail
server configured in the system.
**Table of contents**
@ -39,11 +60,13 @@ Usage
* Navigate to an Outbound Email Server
* Set the `Email From` option to an email address
* Set the `Domain Whitelist` option with the domain whitelist
Known issues / Roadmap
======================
* Allow for domain-based whitelist that will not be manipulated
* Add validation of smtp_from field to ensure that is a valid email address
* Add validation of domain_whitelist field to ensure that they are valid domains
Bug Tracker
===========
@ -63,6 +86,7 @@ Authors
* brain-tec AG
* LasLabs
* Adhoc SA
Contributors
~~~~~~~~~~~~
@ -71,6 +95,8 @@ Contributors
* Dave Lasley <dave@laslabs.com>
* Lorenzo Battistini <https://github.com/eLBati>
* Pierre Pizzetta <pierre@devreaction.com>
* Katherine Zaoral <kz@adhoc.com.ar>
* Juan José Scarafía <jjs@adhoc.com.ar>
Maintainers
~~~~~~~~~~~

View File

@ -7,7 +7,7 @@
"version": "14.0.1.0.0",
"category": "Discuss",
"website": "https://github.com/OCA/social",
"author": "brain-tec AG, LasLabs, Odoo Community Association (OCA)",
"author": "brain-tec AG, LasLabs, Adhoc SA, Odoo Community Association (OCA)",
"license": "LGPL-3",
"application": False,
"installable": True,

View File

@ -0,0 +1,63 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mail_outbound_static
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 13.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-03 12:53+0000\n"
"PO-Revision-Date: 2020-09-03 12:53+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: mail_outbound_static
#: model:ir.model.fields,help:mail_outbound_static.field_ir_mail_server__domain_whitelist
msgid ""
"Allowed Domains list separated by commas. If there is not given SMTP server "
"it will let us to search the proper mail server to be used to sent the "
"messages where the message 'From' email domain match with the domain "
"whitelist."
msgstr ""
"Lista de dominios permitidos separados por comas. Si no se ha seleccionado un servidor SMTP "
"nos permitirá seleccionar el servidor de mail apropiado para enviar los "
"mensajes donde el dominio del email del 'De' coincida con la lista blanca "
"de dominios."
#. module: mail_outbound_static
#: model:ir.model.fields,field_description:mail_outbound_static.field_ir_mail_server__domain_whitelist
msgid "Domain Whitelist"
msgstr "Lista blanca de dominios"
#. module: mail_outbound_static
#: model:ir.model.fields,field_description:mail_outbound_static.field_ir_mail_server__smtp_from
msgid "Email From"
msgstr "Email De"
#. module: mail_outbound_static
#: model:ir.model,name:mail_outbound_static.model_ir_mail_server
msgid "Mail Server"
msgstr "Servidor de correo"
#. module: mail_outbound_static
#: code:addons/mail_outbound_static/models/ir_mail_server.py:0
#, python-format
msgid "Please define a list of domains separate by comma"
msgstr "Por favor defina una lista de dominios separados por coma"
#. module: mail_outbound_static
#: model:ir.model.fields,help:mail_outbound_static.field_ir_mail_server__smtp_from
msgid ""
"Set this in order to email from a specific address. If the original "
"message's 'From' does not match with the domain whitelist then it is "
"replaced with this value. If does match with the domain whitelist then the "
"original message's 'From' will not change"
msgstr ""
"Definalo para usar un dirección de correo 'De' especifica. Si el 'De' del mensaje "
"original no coincide con la lista blanca de dominios entonces este será "
"remplazado con este valor. Si coincide con la lista blanca de dominios entonces "
"el 'De' del mensajee original no cambiará"

View File

@ -6,6 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-09-03 12:53+0000\n"
"PO-Revision-Date: 2020-09-03 12:53+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
@ -18,6 +20,19 @@ msgstr ""
msgid "Display Name"
msgstr ""
#: model:ir.model.fields,help:mail_outbound_static.field_ir_mail_server__domain_whitelist
msgid ""
"Allowed Domains list separated by commas. If there is not given SMTP server "
"it will let us to search the proper mail server to be used to sent the "
"messages where the message 'From' email domain match with the domain "
"whitelist."
msgstr ""
#. module: mail_outbound_static
#: model:ir.model.fields,field_description:mail_outbound_static.field_ir_mail_server__domain_whitelist
msgid "Domain Whitelist"
msgstr ""
#. module: mail_outbound_static
#: model:ir.model.fields,field_description:mail_outbound_static.field_ir_mail_server__smtp_from
msgid "Email From"
@ -39,6 +54,16 @@ msgid "Mail Server"
msgstr ""
#. module: mail_outbound_static
#: model:ir.model.fields,help:mail_outbound_static.field_ir_mail_server__smtp_from
msgid "Set this in order to email from a specific address."
#: code:addons/mail_outbound_static/models/ir_mail_server.py:0
#, python-format
msgid "Please define a list of domains separate by comma"
msgstr ""
#. module: mail_outbound_static
#: model:ir.model.fields,help:mail_outbound_static.field_ir_mail_server__smtp_from
msgid ""
"Set this in order to email from a specific address. If the original "
"message's 'From' does not match with the domain whitelist then it is "
"replaced with this value. If does match with the domain whitelist then the "
"original message's 'From' will not change"
msgstr ""

View File

@ -1,7 +1,10 @@
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
from odoo import api, fields, models
from email.utils import formataddr, parseaddr
from odoo import _, api, fields, models, tools
from odoo.exceptions import ValidationError
class IrMailServer(models.Model):
@ -9,28 +12,72 @@ class IrMailServer(models.Model):
_inherit = "ir.mail_server"
smtp_from = fields.Char(
string="Email From", help="Set this in order to email from a specific address."
string="Email From",
help="Set this in order to email from a specific address."
" If the original message's 'From' does not match with the domain"
" whitelist then it is replaced with this value. If does match with the"
" domain whitelist then the original message's 'From' will not change",
)
domain_whitelist = fields.Char(
help="Allowed Domains list separated by commas. If there is not given"
" SMTP server it will let us to search the proper mail server to be"
" used to sent the messages where the message 'From' email domain"
" match with the domain whitelist."
)
@api.constrains("domain_whitelist")
def check_valid_domain_whitelist(self):
if self.domain_whitelist:
values = False
try:
values = list(self.domain_whitelist.split(","))
except Exception:
pass
if not isinstance(values, list):
raise ValidationError(
_("Please define a list of domains separate by comma")
)
@api.model
def _get_domain_whitelist(self, domain_whitelist_string):
res = domain_whitelist_string.split(",") if domain_whitelist_string else []
res = [item.strip() for item in res]
return res
@api.model
def send_email(
self, message, mail_server_id=None, smtp_server=None, *args, **kwargs
):
# Get email_from and name_from
if message["From"].count("<") > 1:
split_from = message["From"].rsplit(" <", 1)
name_from = split_from[0]
email_from = split_from[-1].replace(">", "")
else:
name_from, email_from = parseaddr(message["From"])
email_domain = email_from.split("@")[1]
# Replicate logic from core to get mail server
mail_server = None
# Get proper mail server to use
if not smtp_server and not mail_server_id:
mail_server_id = self._get_mail_sever(email_domain)
# If not mail sever defined use smtp_from defined in odoo config
if mail_server_id:
mail_server = self.sudo().browse(mail_server_id)
elif not smtp_server:
mail_server = self.sudo().search([], order="sequence", limit=1)
if mail_server and mail_server.smtp_from:
split_from = message["From"].rsplit(" <", 1)
if len(split_from) > 1:
email_from = "{} <{}>".format(split_from[0], mail_server.smtp_from)
domain_whitelist = mail_server.domain_whitelist
smtp_from = mail_server.smtp_from
else:
email_from = mail_server.smtp_from
domain_whitelist = tools.config.get("smtp_domain_whitelist")
smtp_from = tools.config.get("smtp_from")
domain_whitelist = self._get_domain_whitelist(domain_whitelist)
# Replace the From only if needed
if smtp_from and (not domain_whitelist or email_domain not in domain_whitelist):
email_from = formataddr((name_from, smtp_from))
message.replace_header("From", email_from)
bounce_alias = (
self.env["ir.config_parameter"].sudo().get_param("mail.bounce.alias")
@ -46,3 +93,32 @@ class IrMailServer(models.Model):
return super(IrMailServer, self).send_email(
message, mail_server_id, smtp_server, *args, **kwargs
)
@tools.ormcache("email_domain")
def _get_mail_sever(self, email_domain):
""" return the mail server id that match with the domain_whitelist
If not match then return the default mail server id available one """
mail_server_id = None
for item in self.sudo().search(
[("domain_whitelist", "!=", False)], order="sequence"
):
domain_whitelist = self._get_domain_whitelist(item.domain_whitelist)
if email_domain in domain_whitelist:
mail_server_id = item.id
break
if not mail_server_id:
mail_server_id = self.sudo().search([], order="sequence", limit=1).id
return mail_server_id
@api.model
def create(self, values):
self.clear_caches()
return super().create(values)
def write(self, values):
self.clear_caches()
return super().write(values)
def unlink(self):
self.clear_caches()
return super().unlink()

View File

@ -2,3 +2,5 @@
* Dave Lasley <dave@laslabs.com>
* Lorenzo Battistini <https://github.com/eLBati>
* Pierre Pizzetta <pierre@devreaction.com>
* Katherine Zaoral <kz@adhoc.com.ar>
* Juan José Scarafía <jjs@adhoc.com.ar>

View File

@ -1,3 +1,24 @@
This module brings Odoo outbound emails in to strict compliance with RFC-2822
by allowing for a statically configured From header, with the sender's e-mail
being appended into the proper Sender header instead.
by allowing for a dynamically configured From header, with the sender's e-mail
being appended into the proper Sender header instead. To accomplish this we:
* Add a domain whitelist field in the mail server model. This one represent an
allowed Domains list separated by commas. If there is not given SMTP server
it will let us to search the proper mail server to be used to sent themessages
where the message 'From' email domain match with the domain whitelist. If
there is not mail sever that match then will use the default mail server to
sent the message.
* Add a Email From field that will let us to email from a specific address taking
into account this conditions:
1) If the sender domain match with the domain whitelist then the original
message's 'From' will remain as it is and will not be changed because the
mail server is able to sent in the name of the sender domain.
2) If the original message's 'From' does not match with the domain whitelist
then the email From is replaced with the Email From field value.
* Add compatibility to define the smtp information in Odoo config file. Both
smtp_from and smtp_whitelist_domain values will be used if there is not mail
server configured in the system.

View File

@ -1 +1,2 @@
* Allow for domain-based whitelist that will not be manipulated
* Add validation of smtp_from field to ensure that is a valid email address
* Add validation of domain_whitelist field to ensure that they are valid domains

View File

@ -1,2 +1,3 @@
* Navigate to an Outbound Email Server
* Set the `Email From` option to an email address
* Set the `Domain Whitelist` option with the domain whitelist

View File

@ -369,8 +369,28 @@ ul.auto-toc {
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external" href="http://www.gnu.org/licenses/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external" href="https://github.com/OCA/social/tree/14.0/mail_outbound_static"><img alt="OCA/social" src="https://img.shields.io/badge/github-OCA%2Fsocial-lightgray.png?logo=github" /></a> <a class="reference external" href="https://translation.odoo-community.org/projects/social-14-0/social-14-0-mail_outbound_static"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external" href="https://runbot.odoo-community.org/runbot/205/14.0"><img alt="Try me on Runbot" src="https://img.shields.io/badge/runbot-Try%20me-875A7B.png" /></a></p>
<p>This module brings Odoo outbound emails in to strict compliance with RFC-2822
by allowing for a statically configured From header, with the senders e-mail
being appended into the proper Sender header instead.</p>
by allowing for a dynamically configured From header, with the senders e-mail
being appended into the proper Sender header instead. To accomplish this we:</p>
<ul class="simple">
<li>Add a domain whitelist field in the mail server model. This one represent an
allowed Domains list separated by commas. If there is not given SMTP server
it will let us to search the proper mail server to be used to sent themessages
where the message From email domain match with the domain whitelist. If
there is not mail sever that match then will use the default mail server to
sent the message.</li>
<li>Add a Email From field that will let us to email from a specific address taking
into account this conditions:<ol class="arabic">
<li>If the sender domain match with the domain whitelist then the original
messages From will remain as it is and will not be changed because the
mail server is able to sent in the name of the sender domain.</li>
<li>If the original messages From does not match with the domain whitelist
then the email From is replaced with the Email From field value.</li>
</ol>
</li>
<li>Add compatibility to define the smtp information in Odoo config file. Both
smtp_from and smtp_whitelist_domain values will be used if there is not mail
server configured in the system.</li>
</ul>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
@ -390,12 +410,14 @@ being appended into the proper Sender header instead.</p>
<ul class="simple">
<li>Navigate to an Outbound Email Server</li>
<li>Set the <cite>Email From</cite> option to an email address</li>
<li>Set the <cite>Domain Whitelist</cite> option with the domain whitelist</li>
</ul>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id2">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>Allow for domain-based whitelist that will not be manipulated</li>
<li>Add validation of smtp_from field to ensure that is a valid email address</li>
<li>Add validation of domain_whitelist field to ensure that they are valid domains</li>
</ul>
</div>
<div class="section" id="bug-tracker">
@ -413,6 +435,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
<ul class="simple">
<li>brain-tec AG</li>
<li>LasLabs</li>
<li>Adhoc SA</li>
</ul>
</div>
<div class="section" id="contributors">
@ -422,6 +445,8 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
<li>Dave Lasley &lt;<a class="reference external" href="mailto:dave&#64;laslabs.com">dave&#64;laslabs.com</a>&gt;</li>
<li>Lorenzo Battistini &lt;<a class="reference external" href="https://github.com/eLBati">https://github.com/eLBati</a>&gt;</li>
<li>Pierre Pizzetta &lt;<a class="reference external" href="mailto:pierre&#64;devreaction.com">pierre&#64;devreaction.com</a>&gt;</li>
<li>Katherine Zaoral &lt;<a class="reference external" href="mailto:kz&#64;adhoc.com.ar">kz&#64;adhoc.com.ar</a>&gt;</li>
<li>Juan José Scarafía &lt;<a class="reference external" href="mailto:jjs&#64;adhoc.com.ar">jjs&#64;adhoc.com.ar</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">

View File

@ -1,14 +1,18 @@
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
import logging
import os
import threading
from email import message_from_string
from mock import MagicMock
import odoo.tools as tools
from odoo.tests.common import TransactionCase
_logger = logging.getLogger(__name__)
class TestIrMailServer(TransactionCase):
def setUp(self):
@ -17,6 +21,7 @@ class TestIrMailServer(TransactionCase):
self.email_from_another = "another@example.com"
self.Model = self.env["ir.mail_server"]
self.parameter_model = self.env["ir.config_parameter"]
self._delete_mail_servers()
self.Model.create(
{
"name": "localhost",
@ -30,6 +35,44 @@ class TestIrMailServer(TransactionCase):
with open(message_file, "r") as fh:
self.message = message_from_string(fh.read())
def _init_mail_server_domain_whilelist_based(self):
self._delete_mail_servers()
self.mail_server_domainone = self.Model.create(
{
"name": "sandbox domainone",
"smtp_host": "localhost",
"smtp_from": "notifications@domainone.com",
"domain_whitelist": "domainone.com",
}
)
self.mail_server_domaintwo = self.Model.create(
{
"name": "sandbox domaintwo",
"smtp_host": "localhost",
"smtp_from": "hola@domaintwo.com",
"domain_whitelist": "domaintwo.com",
}
)
self.mail_server_domainthree = self.Model.create(
{
"name": "sandbox domainthree",
"smtp_host": "localhost",
"smtp_from": "notifications@domainthree.com",
"domain_whitelist": "domainthree.com,domainmulti.com",
}
)
def _skip_test(self, reason):
_logger.warn(reason)
self.skipTest(reason)
def _delete_mail_servers(self):
""" Delete all available mail servers """
all_mail_servers = self.Model.search([])
if all_mail_servers:
all_mail_servers.unlink()
self.assertFalse(self.Model.search([]))
def _send_mail(self, message=None, mail_server_id=None, smtp_server=None):
if message is None:
message = self.message
@ -70,7 +113,175 @@ class TestIrMailServer(TransactionCase):
# Also check passing mail_server_id
mail_server_id = self.Model.sudo().search([], order="sequence", limit=1)[0].id
message = self._send_mail(mail_server_id=mail_server_id)
self.assertEqual(message["From"], "{} <{}>".format(user, self.email_from))
self.assertEqual(message["From"], '"{}" <{}>'.format(user, self.email_from))
self.assertEqual(
message["Return-Path"], "{} <{}>".format(user, self.email_from)
message["Return-Path"], '"{}" <{}>'.format(user, self.email_from)
)
def test_1_from_outgoing_server_domainone(self):
self._init_mail_server_domain_whilelist_based()
domain = "domainone.com"
email_from = "Mitchell Admin <admin@%s>" % domain
expected_mail_server = self.mail_server_domainone
self.message.replace_header("From", email_from)
message = self._send_mail()
self.assertEqual(message["From"], email_from)
used_mail_server = self.Model._get_mail_sever(domain)
used_mail_server = self.Model.browse(used_mail_server)
self.assertEqual(
used_mail_server,
expected_mail_server,
"It using %s but we expect to use %s"
% (used_mail_server.name, expected_mail_server.name),
)
def test_2_from_outgoing_server_domaintwo(self):
self._init_mail_server_domain_whilelist_based()
domain = "domaintwo.com"
email_from = "Mitchell Admin <admin@%s>" % domain
expected_mail_server = self.mail_server_domaintwo
self.message.replace_header("From", email_from)
message = self._send_mail()
self.assertEqual(message["From"], email_from)
used_mail_server = self.Model._get_mail_sever(domain)
used_mail_server = self.Model.browse(used_mail_server)
self.assertEqual(
used_mail_server,
expected_mail_server,
"It using %s but we expect to use %s"
% (used_mail_server.name, expected_mail_server.name),
)
def test_3_from_outgoing_server_another(self):
self._init_mail_server_domain_whilelist_based()
domain = "example.com"
email_from = "Mitchell Admin <admin@%s>" % domain
expected_mail_server = self.mail_server_domainone
self.message.replace_header("From", email_from)
message = self._send_mail()
self.assertEqual(
message["From"], "Mitchell Admin <%s>" % expected_mail_server.smtp_from
)
used_mail_server = self.Model._get_mail_sever(domain)
used_mail_server = self.Model.browse(used_mail_server)
self.assertEqual(
used_mail_server,
expected_mail_server,
"It using %s but we expect to use %s"
% (used_mail_server.name, expected_mail_server.name),
)
def test_4_from_outgoing_server_none_use_config(self):
self._init_mail_server_domain_whilelist_based()
domain = "example.com"
email_from = "Mitchell Admin <admin@%s>" % domain
self._delete_mail_servers()
# Find config values
config_smtp_from = tools.config.get("smtp_from")
config_smtp_domain_whitelist = tools.config.get("smtp_domain_whitelist")
if not config_smtp_from or not config_smtp_domain_whitelist:
self._skip_test(
"Cannot test transactions because there is not either smtp_from"
" or smtp_domain_whitelist."
)
self.message.replace_header("From", email_from)
message = self._send_mail()
self.assertEqual(message["From"], "Mitchell Admin <%s>" % config_smtp_from)
used_mail_server = self.Model._get_mail_sever("example.com")
used_mail_server = self.Model.browse(used_mail_server)
self.assertFalse(
used_mail_server, "using this mail server %s" % (used_mail_server.name)
)
def test_5_from_outgoing_server_none_same_domain(self):
self._init_mail_server_domain_whilelist_based()
# Find config values
config_smtp_from = tools.config.get("smtp_from")
config_smtp_domain_whitelist = domain = tools.config.get(
"smtp_domain_whitelist"
)
if not config_smtp_from or not config_smtp_domain_whitelist:
self._skip_test(
"Cannot test transactions because there is not either smtp_from"
" or smtp_domain_whitelist."
)
email_from = "Mitchell Admin <admin@%s>" % domain
self._delete_mail_servers()
self.message.replace_header("From", email_from)
message = self._send_mail()
self.assertEqual(message["From"], email_from)
used_mail_server = self.Model._get_mail_sever(domain)
used_mail_server = self.Model.browse(used_mail_server)
self.assertFalse(used_mail_server)
def test_6_from_outgoing_server_no_name_from(self):
self._init_mail_server_domain_whilelist_based()
domain = "example.com"
email_from = "test@%s" % domain
expected_mail_server = self.mail_server_domainone
self.message.replace_header("From", email_from)
message = self._send_mail()
self.assertEqual(message["From"], expected_mail_server.smtp_from)
used_mail_server = self.Model._get_mail_sever(domain)
used_mail_server = self.Model.browse(used_mail_server)
self.assertEqual(
used_mail_server,
expected_mail_server,
"It using %s but we expect to use %s"
% (used_mail_server.name, expected_mail_server.name),
)
def test_7_from_outgoing_server_multidomain_1(self):
self._init_mail_server_domain_whilelist_based()
domain = "domainthree.com"
email_from = "Mitchell Admin <admin@%s>" % domain
expected_mail_server = self.mail_server_domainthree
self.message.replace_header("From", email_from)
message = self._send_mail()
self.assertEqual(message["From"], email_from)
used_mail_server = self.Model._get_mail_sever(domain)
used_mail_server = self.Model.browse(used_mail_server)
self.assertEqual(
used_mail_server,
expected_mail_server,
"It using %s but we expect to use %s"
% (used_mail_server.name, expected_mail_server.name),
)
def test_8_from_outgoing_server_multidomain_3(self):
self._init_mail_server_domain_whilelist_based()
domain = "domainmulti.com"
email_from = "test@%s" % domain
expected_mail_server = self.mail_server_domainthree
self.message.replace_header("From", email_from)
message = self._send_mail()
self.assertEqual(message["From"], email_from)
used_mail_server = self.Model._get_mail_sever(domain)
used_mail_server = self.Model.browse(used_mail_server)
self.assertEqual(
used_mail_server,
expected_mail_server,
"It using %s but we expect to use %s"
% (used_mail_server.name, expected_mail_server.name),
)

View File

@ -11,6 +11,7 @@
<field name="inherit_id" ref="base.ir_mail_server_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='smtp_pass']" position="after">
<field name="domain_whitelist"/>
<field name="smtp_from" />
</xpath>
</field>