mail_outbound_static: Domain whitelist based logic.
This commit is contained in:
parent
bcff3bbb15
commit
7a9fcb44e3
@ -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
|
||||
~~~~~~~~~~~
|
||||
|
@ -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,
|
||||
|
63
mail_outbound_static/i18n/es.po
Normal file
63
mail_outbound_static/i18n/es.po
Normal 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á"
|
@ -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 ""
|
||||
|
@ -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)
|
||||
domain_whitelist = mail_server.domain_whitelist
|
||||
smtp_from = mail_server.smtp_from
|
||||
else:
|
||||
domain_whitelist = tools.config.get("smtp_domain_whitelist")
|
||||
smtp_from = tools.config.get("smtp_from")
|
||||
|
||||
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)
|
||||
else:
|
||||
email_from = mail_server.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()
|
||||
|
@ -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>
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 sender’s e-mail
|
||||
being appended into the proper Sender header instead.</p>
|
||||
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:</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
|
||||
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.</li>
|
||||
<li>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.</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 <<a class="reference external" href="mailto:dave@laslabs.com">dave@laslabs.com</a>></li>
|
||||
<li>Lorenzo Battistini <<a class="reference external" href="https://github.com/eLBati">https://github.com/eLBati</a>></li>
|
||||
<li>Pierre Pizzetta <<a class="reference external" href="mailto:pierre@devreaction.com">pierre@devreaction.com</a>></li>
|
||||
<li>Katherine Zaoral <<a class="reference external" href="mailto:kz@adhoc.com.ar">kz@adhoc.com.ar</a>></li>
|
||||
<li>Juan José Scarafía <<a class="reference external" href="mailto:jjs@adhoc.com.ar">jjs@adhoc.com.ar</a>></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" id="maintainers">
|
||||
|
@ -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),
|
||||
)
|
||||
|
@ -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>
|
||||
|
Loading…
Reference in New Issue
Block a user