From 507c1e03a723a67d22fd15c77e555e2f50bd34f6 Mon Sep 17 00:00:00 2001 From: Sanjay Jamod Date: Wed, 13 Dec 2017 15:27:50 +0530 Subject: [PATCH 1/3] [IMP] mass_mailing: allow users to choose a specific outgoing mail server Purpose of this commit is to allow mass mailing users to select an outgoing mail sever when performing mass mailing. It includes * add a field in mass_mailing to select specific outgoing mail server; it is put in debug mode because it sounds people would not understand what is its purpose; * add an option in settings to set a default outgoing mail server; * give read access to ir.mail_server to mass_mailing users; This commit is related to task ID 31737. --- addons/mass_mailing/models/mass_mailing.py | 14 ++++++++++++++ .../mass_mailing/models/res_config_settings.py | 10 +++++++++- addons/mass_mailing/security/ir.model.access.csv | 3 ++- addons/mass_mailing/views/mass_mailing_views.xml | 1 + .../views/res_config_settings_views.xml | 16 ++++++++++++++++ 5 files changed, 42 insertions(+), 2 deletions(-) diff --git a/addons/mass_mailing/models/mass_mailing.py b/addons/mass_mailing/models/mass_mailing.py index a714259f7f5..08287d8a4e6 100644 --- a/addons/mass_mailing/models/mass_mailing.py +++ b/addons/mass_mailing/models/mass_mailing.py @@ -6,6 +6,7 @@ import hmac import logging import random import threading +from ast import literal_eval from odoo import api, fields, models, tools, _ from odoo.exceptions import UserError @@ -360,6 +361,15 @@ class MassMailing(models.Model): _inherits = {'utm.source': 'source_id'} _rec_name = "source_id" + @api.model + def _get_default_mail_server_id(self): + server_id = self.env['ir.config_parameter'].sudo().get_param('mass_mailing.mail_server_id') + try: + server_id = literal_eval(server_id) if server_id else False + return self.env['ir.mail_server'].search([('id', '=', server_id)]).id + except ValueError: + return False + @api.model def default_get(self, fields): res = super(MassMailing, self).default_get(fields) @@ -403,6 +413,9 @@ class MassMailing(models.Model): default=lambda self: self.env.ref('mass_mailing.model_mail_mass_mailing_list').id) mailing_model_name = fields.Char(related='mailing_model_id.model', string='Recipients Model Name', readonly=True, related_sudo=True) mailing_domain = fields.Char(string='Domain', oldname='domain', default=[]) + mail_server_id = fields.Many2one('ir.mail_server', string='Mail Server', + default=_get_default_mail_server_id, + help="Use a specific mail server in priority. Otherwise Odoo relies on the first outgoing mail server available (based on their sequencing) as it does for normal mails.") contact_list_ids = fields.Many2many('mail.mass_mailing.list', 'mail_mass_mailing_list_rel', string='Mailing Lists') contact_ab_pc = fields.Integer(string='A/B Testing percentage', @@ -760,6 +773,7 @@ class MassMailing(models.Model): 'mass_mailing_id': mailing.id, 'mailing_list_ids': [(4, l.id) for l in mailing.contact_list_ids], 'no_auto_thread': mailing.reply_to_mode != 'thread', + 'mail_server_id': mailing.mail_server_id.id, } if mailing.reply_to_mode == 'email': composer_values['reply_to'] = mailing.reply_to diff --git a/addons/mass_mailing/models/res_config_settings.py b/addons/mass_mailing/models/res_config_settings.py index d23866c366b..aedcef27d69 100644 --- a/addons/mass_mailing/models/res_config_settings.py +++ b/addons/mass_mailing/models/res_config_settings.py @@ -1,10 +1,18 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -from odoo import fields, models +from odoo import api, fields, models class ResConfigSettings(models.TransientModel): _inherit = 'res.config.settings' group_mass_mailing_campaign = fields.Boolean(string="Mass Mailing Campaigns", implied_group='mass_mailing.group_mass_mailing_campaign', help="""This is useful if your marketing campaigns are composed of several emails""") + mass_mailing_outgoing_mail_server = fields.Boolean(string="Specific Mail Server", config_parameter='mass_mailing.outgoing_mail_server', + help='Use a specific mail server in priority. Otherwise Odoo relies on the first outgoing mail server available (based on their sequencing) as it does for normal mails.') + mass_mailing_mail_server_id = fields.Many2one('ir.mail_server', string='Mail Server', config_parameter='mass_mailing.mail_server_id') + + @api.onchange('mass_mailing_outgoing_mail_server') + def _onchange_mass_mailing_outgoing_mail_server(self): + if not self.mass_mailing_outgoing_mail_server: + self.mass_mailing_mail_server_id = False diff --git a/addons/mass_mailing/security/ir.model.access.csv b/addons/mass_mailing/security/ir.model.access.csv index 40a182fe6bd..d87aa9dbf41 100644 --- a/addons/mass_mailing/security/ir.model.access.csv +++ b/addons/mass_mailing/security/ir.model.access.csv @@ -10,4 +10,5 @@ access_mass_mailing_system,mail.mass_mailing.system,model_mail_mass_mailing,base access_mail_mail_statistics_user,mail.mail.statistics,model_mail_mail_statistics,base.group_user,1,1,1,1 access_mail_mail_statistics_mass_mailing_user,mail.mail.statistics,model_mail_mail_statistics,mass_mailing.group_mass_mailing_user,1,1,1,1 access_mail_statistics_report,mail.statistics.report,model_mail_statistics_report,mass_mailing.group_mass_mailing_user,1,1,1,1 -access_utm_source,access_utm_source,utm.model_utm_source,mass_mailing.group_mass_mailing_user,1,1,1,0 \ No newline at end of file +access_utm_source,access_utm_source,utm.model_utm_source,mass_mailing.group_mass_mailing_user,1,1,1,0 +access_ir_mail_server,access_ir_mail_server,base.model_ir_mail_server,mass_mailing.group_mass_mailing_user,1,0,0,0 diff --git a/addons/mass_mailing/views/mass_mailing_views.xml b/addons/mass_mailing/views/mass_mailing_views.xml index 95de69ee6e1..586d805bf8b 100644 --- a/addons/mass_mailing/views/mass_mailing_views.xml +++ b/addons/mass_mailing/views/mass_mailing_views.xml @@ -531,6 +531,7 @@
+ diff --git a/addons/mass_mailing/views/res_config_settings_views.xml b/addons/mass_mailing/views/res_config_settings_views.xml index 6412319d20f..a828ae2a734 100644 --- a/addons/mass_mailing/views/res_config_settings_views.xml +++ b/addons/mass_mailing/views/res_config_settings_views.xml @@ -28,6 +28,22 @@ +
+
+ +
+
+
+

Mailing Lists

From 7169a728696cb7564edc743447fd857716d0c5ce Mon Sep 17 00:00:00 2001 From: Sanjay Jamod Date: Fri, 5 Jan 2018 16:14:12 +0530 Subject: [PATCH 2/3] [REF] base: remove ir_mail_server name_get method and use default one Purpose of this commit is to not set parentheses around mail server name. Indeed it does not add any value to have its ID in the name_get. This commit is related to task ID 31737 --- odoo/addons/base/models/ir_mail_server.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/odoo/addons/base/models/ir_mail_server.py b/odoo/addons/base/models/ir_mail_server.py index 2ebeec8d300..6898de4ef4d 100644 --- a/odoo/addons/base/models/ir_mail_server.py +++ b/odoo/addons/base/models/ir_mail_server.py @@ -150,10 +150,6 @@ class IrMailServer(models.Model): "is used. Default priority is 10 (smaller number = higher priority)") active = fields.Boolean(default=True) - @api.multi - def name_get(self): - return [(server.id, "(%s)" % server.name) for server in self] - @api.multi def test_smtp_connection(self): for server in self: From fe5c8602b0da26c3f14b55cb49f1885d454ccacd Mon Sep 17 00:00:00 2001 From: Sanjay Jamod Date: Thu, 8 Feb 2018 17:20:27 +0530 Subject: [PATCH 3/3] [IMP] base: protect ir_mail_server credentials by `base.group_system` group Purpose of this commit is to prevent unauthenticated access on user name and password of the mail server. Indeed as mass mailing users notably gain access to mail servers let us protect its credentials. This commit is related to task ID 31737 --- odoo/addons/base/models/ir_mail_server.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/odoo/addons/base/models/ir_mail_server.py b/odoo/addons/base/models/ir_mail_server.py index 6898de4ef4d..d010d486f41 100644 --- a/odoo/addons/base/models/ir_mail_server.py +++ b/odoo/addons/base/models/ir_mail_server.py @@ -133,8 +133,8 @@ class IrMailServer(models.Model): name = fields.Char(string='Description', required=True, index=True) smtp_host = fields.Char(string='SMTP Server', required=True, help="Hostname or IP of SMTP server") smtp_port = fields.Integer(string='SMTP Port', size=5, required=True, default=25, help="SMTP Port. Usually 465 for SSL, and 25 or 587 for other cases.") - smtp_user = fields.Char(string='Username', help="Optional username for SMTP authentication") - smtp_pass = fields.Char(string='Password', help="Optional password for SMTP authentication") + smtp_user = fields.Char(string='Username', help="Optional username for SMTP authentication", groups='base.group_system') + smtp_pass = fields.Char(string='Password', help="Optional password for SMTP authentication", groups='base.group_system') smtp_encryption = fields.Selection([('none', 'None'), ('starttls', 'TLS (STARTTLS)'), ('ssl', 'SSL/TLS')],