From c2fb795191fe9b01156f80dc6aa6468e446121ce Mon Sep 17 00:00:00 2001 From: LauraCForgeFlow Date: Fri, 4 Jul 2025 14:33:52 +0200 Subject: [PATCH 1/4] [IMP] mail_autogenerated_header: system parameter to allow autogenerated outgoing mails --- mail_autogenerated_header/README.rst | 25 +++---- mail_autogenerated_header/__manifest__.py | 5 +- .../data/ir_config_parameter.xml | 7 ++ .../models/ir_mail_server.py | 66 ++++++++++--------- .../readme/DESCRIPTION.md | 7 +- mail_autogenerated_header/readme/USAGE.md | 15 +++-- .../static/description/index.html | 40 ++++++----- .../tests/test_mail_autogenerated_header.py | 28 ++++---- 8 files changed, 106 insertions(+), 87 deletions(-) create mode 100644 mail_autogenerated_header/data/ir_config_parameter.xml diff --git a/mail_autogenerated_header/README.rst b/mail_autogenerated_header/README.rst index 3e7935db2..74c14e95b 100644 --- a/mail_autogenerated_header/README.rst +++ b/mail_autogenerated_header/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - ===================== Autogenerated headers ===================== @@ -17,7 +13,7 @@ Autogenerated headers .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmail-lightgray.png?logo=github @@ -33,9 +29,9 @@ Autogenerated headers |badge1| |badge2| |badge3| |badge4| |badge5| This module was written to mark Odoo's emails as being autogenerated -according to `RFC 3834 `__, section -5. This allows receiving mail servers to act accordingly by for example -not sending a vacation autoreply. +according to ``RFC 3834 ``\ \_, +section 5. This allows receiving mail servers to act accordingly by for +example not sending a vacation autoreply. On the receiving side, this module drops all notifications for autogenerated incoming e-mails. @@ -51,9 +47,14 @@ broken email servers on the opposite side. Usage ===== -There's nothing the user has to do. Developers can set the context flag +For sending outgoing emails, users can change the config parameter +``mail_autogenerated_header.allow_autogenerated_outgoing`` to ``False`` +to avoid any outgoing emails being marked as autogenerated. For only +avoiding in certain cases, developers can set the context flag ``mail_autogenerated_header_disable`` in calls to ``send_email`` in -order to suppress adding any headers at all, and override +order to suppress adding any autogenerated headers. + +For receiving incoming emails, developers can override the method ``_message_route_process_autoreply`` to fine tune dropping autogenerated mails per model. @@ -79,8 +80,8 @@ Authors Contributors ------------ -- Holger Brunn - (https://hunki-enterprises.com) +- Holger Brunn + (https://hunki-enterprises.com) Maintainers ----------- diff --git a/mail_autogenerated_header/__manifest__.py b/mail_autogenerated_header/__manifest__.py index 2a6118158..cd5ed64d5 100644 --- a/mail_autogenerated_header/__manifest__.py +++ b/mail_autogenerated_header/__manifest__.py @@ -9,7 +9,6 @@ "license": "AGPL-3", "category": "Tools", "summary": "Add headers to Odoo's mails indicating they are autogenerated", - "depends": [ - "mail", - ], + "depends": ["mail"], + "data": ["data/ir_config_parameter.xml"], } diff --git a/mail_autogenerated_header/data/ir_config_parameter.xml b/mail_autogenerated_header/data/ir_config_parameter.xml new file mode 100644 index 000000000..8d4cfc3e6 --- /dev/null +++ b/mail_autogenerated_header/data/ir_config_parameter.xml @@ -0,0 +1,7 @@ + + + + mail_autogenerated_header.allow_autogenerated_outgoing + True + + diff --git a/mail_autogenerated_header/models/ir_mail_server.py b/mail_autogenerated_header/models/ir_mail_server.py index eb387f9c3..e6031ca30 100644 --- a/mail_autogenerated_header/models/ir_mail_server.py +++ b/mail_autogenerated_header/models/ir_mail_server.py @@ -22,31 +22,40 @@ def send_email( smtp_debug=False, smtp_session=None, ): - # Inject autogenerated header for autogoing mails - - if not self.env.context.get( - "mail_autogenerated_header_disable" - ) and self._send_email_set_autogenerated( - message, - mail_server_id=mail_server_id, - smtp_server=smtp_server, - smtp_port=smtp_port, - smtp_user=smtp_user, - smtp_password=smtp_password, - smtp_encryption=smtp_encryption, - smtp_ssl_certificate=smtp_ssl_certificate, - smtp_ssl_private_key=smtp_ssl_private_key, - smtp_debug=smtp_debug, - smtp_session=smtp_session, - ): - # MS Exchange's broken version as of - # http://blogs.technet.com/b/exchange/archive/2006/10/06/ - # 3395024.aspx - message["Precedence"] = "bulk" - message["X-Auto-Response-Suppress"] = "OOF" - # The right way to do it as of - # https://tools.ietf.org/html/rfc3834 - message["Auto-Submitted"] = "auto-generated" + # Inject autogenerated header for outgoing mails + allow_autogenerated_outgoing = ( + self.env["ir.config_parameter"] + .sudo() + .get_param("mail_autogenerated_header.allow_autogenerated_outgoing", False) + ) + if allow_autogenerated_outgoing: + mail_autogenerated_header_disable = self.env.context.get( + "mail_autogenerated_header_disable" + ) + if ( + not mail_autogenerated_header_disable + and self._send_email_set_autogenerated( + message, + mail_server_id=mail_server_id, + smtp_server=smtp_server, + smtp_port=smtp_port, + smtp_user=smtp_user, + smtp_password=smtp_password, + smtp_encryption=smtp_encryption, + smtp_ssl_certificate=smtp_ssl_certificate, + smtp_ssl_private_key=smtp_ssl_private_key, + smtp_debug=smtp_debug, + smtp_session=smtp_session, + ) + ): + # MS Exchange's broken version as of + # http://blogs.technet.com/b/exchange/archive/2006/10/06/ + # 3395024.aspx + message["Precedence"] = "bulk" + message["X-Auto-Response-Suppress"] = "OOF" + # The right way to do it as of + # https://tools.ietf.org/html/rfc3834 + message["Auto-Submitted"] = "auto-generated" return super().send_email( message, @@ -77,12 +86,9 @@ def _send_email_set_autogenerated( smtp_debug=False, smtp_session=None, ): - """Determine if some mail should have the autogenerated headers""" - + # Determine if some mail should have the autogenerated headers mail = self.env["mail.mail"].search( - [ - ("message_id", "=", message["Message-Id"]), - ] + [("message_id", "=", message["Message-Id"])] ) if not mail: return False diff --git a/mail_autogenerated_header/readme/DESCRIPTION.md b/mail_autogenerated_header/readme/DESCRIPTION.md index 3e17a4d4f..9f26a0b86 100644 --- a/mail_autogenerated_header/readme/DESCRIPTION.md +++ b/mail_autogenerated_header/readme/DESCRIPTION.md @@ -1,7 +1,6 @@ -This module was written to mark Odoo's emails as being autogenerated -according to [RFC 3834](https://tools.ietf.org/html/rfc3834), section 5. -This allows receiving mail servers to act accordingly by for example not -sending a vacation autoreply. +This module was written to mark Odoo's emails as being autogenerated according +to `RFC 3834 `_, section 5. This allows +receiving mail servers to act accordingly by for example not sending a vacation autoreply. On the receiving side, this module drops all notifications for autogenerated incoming e-mails. diff --git a/mail_autogenerated_header/readme/USAGE.md b/mail_autogenerated_header/readme/USAGE.md index 34380206c..d0e8e8885 100644 --- a/mail_autogenerated_header/readme/USAGE.md +++ b/mail_autogenerated_header/readme/USAGE.md @@ -1,5 +1,10 @@ -There's nothing the user has to do. Developers can set the context flag -`mail_autogenerated_header_disable` in calls to `send_email` in order to -suppress adding any headers at all, and override -`_message_route_process_autoreply` to fine tune dropping autogenerated -mails per model. +For sending outgoing emails, users can change the config parameter +``mail_autogenerated_header.allow_autogenerated_outgoing`` to ``False`` to +avoid any outgoing emails being marked as autogenerated. For only avoiding +in certain cases, developers can set the context flag +``mail_autogenerated_header_disable`` in calls to ``send_email`` in order to +suppress adding any autogenerated headers. + +For receiving incoming emails, developers can override the method +``_message_route_process_autoreply`` to fine tune dropping autogenerated mails +per model. diff --git a/mail_autogenerated_header/static/description/index.html b/mail_autogenerated_header/static/description/index.html index 443b39a36..7b11636c7 100644 --- a/mail_autogenerated_header/static/description/index.html +++ b/mail_autogenerated_header/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Autogenerated headers -
+
+

Autogenerated headers

- - -Odoo Community Association - -
-

Autogenerated headers

-

Beta License: AGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

This module was written to mark Odoo’s emails as being autogenerated -according to RFC 3834, section -5. This allows receiving mail servers to act accordingly by for example -not sending a vacation autoreply.

+according to RFC 3834 <https://tools.ietf.org/html/rfc3834>_, +section 5. This allows receiving mail servers to act accordingly by for +example not sending a vacation autoreply.

On the receiving side, this module drops all notifications for autogenerated incoming e-mails.

The combination of both avoids possible mail loops with misconfigured or @@ -397,15 +392,19 @@

Autogenerated headers

-

Usage

-

There’s nothing the user has to do. Developers can set the context flag +

Usage

+

For sending outgoing emails, users can change the config parameter +mail_autogenerated_header.allow_autogenerated_outgoing to False +to avoid any outgoing emails being marked as autogenerated. For only +avoiding in certain cases, developers can set the context flag mail_autogenerated_header_disable in calls to send_email in -order to suppress adding any headers at all, and override +order to suppress adding any autogenerated headers.

+

For receiving incoming emails, developers can override the method _message_route_process_autoreply to fine tune dropping autogenerated mails per model.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -413,23 +412,23 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

-
diff --git a/mail_autogenerated_header/tests/test_mail_autogenerated_header.py b/mail_autogenerated_header/tests/test_mail_autogenerated_header.py index 7a03fc3fe..2e6039435 100644 --- a/mail_autogenerated_header/tests/test_mail_autogenerated_header.py +++ b/mail_autogenerated_header/tests/test_mail_autogenerated_header.py @@ -1,6 +1,8 @@ # Copyright 2018 Therp BV # Copyright 2022 Hunki Enterprises BV # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +import copy + from odoo.tools.mail import generate_tracking_message_id from odoo.addons.base.tests.common import BaseCommon @@ -18,7 +20,7 @@ def setUpClass(cls): "message_id": "message_id", } ) - cls.message = cls.env["ir.mail_server"].build_email( + cls.base_message = cls.env["ir.mail_server"].build_email( [cls.mail.email_from], [cls.mail.email_to], cls.mail.subject, @@ -28,25 +30,29 @@ def setUpClass(cls): def test_sending(self): """Test that sending a mail has the Auto-Submitted header""" + self.message = copy.deepcopy(self.base_message) self.env["ir.mail_server"].send_email(self.message) self.assertEqual(self.message["Auto-Submitted"], "auto-generated") + # Test that the header is not set when the parameter is disabled + self.env["ir.config_parameter"].sudo().set_param( + "mail_autogenerated_header.allow_autogenerated_outgoing", False + ) + self.message = copy.deepcopy(self.base_message) + self.env["ir.mail_server"].send_email(self.message) + self.assertNotIn("Auto-Submitted", self.message) def test_receiving(self): """Test that receiving mails with some auto submitted marker won't cause new notifications being sent""" + self.message = copy.deepcopy(self.base_message) demo_user = self.env.ref("base.user_demo") - self.message.replace_header( - "Message-Id", - generate_tracking_message_id(42), - ) - + self.message.replace_header("Message-Id", generate_tracking_message_id(42)) self.env["mail.notification"].search( [("res_partner_id", "=", demo_user.partner_id.id)] ).unlink() partner_id = self.env["mail.thread"].message_process( - "res.partner", - self.message.as_string(), + "res.partner", self.message.as_string() ) partner = self.env["res.partner"].browse(partner_id) partner.message_subscribe(partner_ids=demo_user.partner_id.ids) @@ -54,8 +60,7 @@ def test_receiving(self): reply["References"] = self.message["Message-Id"] reply.replace_header("Message-Id", "message_id3") thread_id = self.env["mail.thread"].message_process( - "res.partner", - reply.as_string(), + "res.partner", reply.as_string() ) self.assertEqual(thread_id, partner.id) notifications = self.env["mail.notification"].search( @@ -68,8 +73,7 @@ def test_receiving(self): reply.replace_header("Message-Id", "message_id4") reply["Auto-Submitted"] = "auto-generated" thread_id = self.env["mail.thread"].message_process( - "res.partner", - reply.as_string(), + "res.partner", reply.as_string() ) self.assertEqual(thread_id, partner.id) notifications = self.env["mail.notification"].search( From 6df9d3d076658bea484781de852225e9441174a2 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 23 Nov 2025 15:01:30 +0000 Subject: [PATCH 2/4] [BOT] post-merge updates --- README.md | 2 +- mail_autogenerated_header/README.rst | 12 +++++--- mail_autogenerated_header/__manifest__.py | 2 +- .../static/description/index.html | 28 +++++++++++-------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 7464fb32a..e6a0614f2 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ addon | version | maintainers | summary [mail_activity_team](mail_activity_team/) | 18.0.1.0.1 | | Add Teams to Activities [mail_attach_existing_attachment](mail_attach_existing_attachment/) | 18.0.1.0.0 | | Adding attachment on the object by sending this one [mail_attach_existing_attachment_account](mail_attach_existing_attachment_account/) | 18.0.1.0.0 | | Module to use attach existing attachment for account module -[mail_autogenerated_header](mail_autogenerated_header/) | 18.0.1.0.0 | | Add headers to Odoo's mails indicating they are autogenerated +[mail_autogenerated_header](mail_autogenerated_header/) | 18.0.1.1.0 | | Add headers to Odoo's mails indicating they are autogenerated [mail_autosubscribe](mail_autosubscribe/) | 18.0.1.1.0 | | Automatically subscribe partners to its company's business documents [mail_composer_cc_bcc](mail_composer_cc_bcc/) | 18.0.1.0.2 | trisdoan | This module enables sending mail to CC and BCC partners in mail composer form. [mail_debrand](mail_debrand/) | 18.0.1.0.1 | pedrobaeza joao-p-marques | Remove Odoo branding in sent emails Removes anchor 20characters diff --git a/mail_autogenerated_header/README.rst b/mail_autogenerated_header/README.rst index 74c14e95b..9f592d172 100644 --- a/mail_autogenerated_header/README.rst +++ b/mail_autogenerated_header/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ===================== Autogenerated headers ===================== @@ -7,13 +11,13 @@ Autogenerated headers !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:591306323a242f6435b223e7ce1e718218d0db0b0fd45c776fa0e6715d168207 + !! source digest: sha256:0dd822572bebd34c9e428fe8f7cd191012396cd99b1655fa61c5cbd8dd572bf8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png :target: https://odoo-community.org/page/development-status :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |badge2| image:: https://img.shields.io/badge/license-AGPL--3-blue.png :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmail-lightgray.png?logo=github @@ -80,8 +84,8 @@ Authors Contributors ------------ -- Holger Brunn - (https://hunki-enterprises.com) +- Holger Brunn + (https://hunki-enterprises.com) Maintainers ----------- diff --git a/mail_autogenerated_header/__manifest__.py b/mail_autogenerated_header/__manifest__.py index cd5ed64d5..947876d36 100644 --- a/mail_autogenerated_header/__manifest__.py +++ b/mail_autogenerated_header/__manifest__.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). { "name": "Autogenerated headers", - "version": "18.0.1.0.0", + "version": "18.0.1.1.0", "author": "Hunki Enterprises BV, Therp BV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/mail", "license": "AGPL-3", diff --git a/mail_autogenerated_header/static/description/index.html b/mail_autogenerated_header/static/description/index.html index 7b11636c7..d5520f1a0 100644 --- a/mail_autogenerated_header/static/description/index.html +++ b/mail_autogenerated_header/static/description/index.html @@ -3,7 +3,7 @@ -Autogenerated headers +README.rst -
-

Autogenerated headers

+
+ + +Odoo Community Association + +
+

Autogenerated headers

-

Beta License: AGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

This module was written to mark Odoo’s emails as being autogenerated according to RFC 3834 <https://tools.ietf.org/html/rfc3834>_, section 5. This allows receiving mail servers to act accordingly by for @@ -392,7 +397,7 @@

Autogenerated headers

-

Usage

+

Usage

For sending outgoing emails, users can change the config parameter mail_autogenerated_header.allow_autogenerated_outgoing to False to avoid any outgoing emails being marked as autogenerated. For only @@ -404,7 +409,7 @@

Usage

mails per model.

-

Bug Tracker

+

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed @@ -412,23 +417,23 @@

Bug Tracker

Do not contact contributors directly about support or help with technical issues.

+
From 80afe1d07f980902242bdf61a36469c4d6d2eee5 Mon Sep 17 00:00:00 2001 From: Carlos Lopez Date: Tue, 25 Nov 2025 07:24:56 -0500 Subject: [PATCH 3/4] [FIX] mail_tracking: Prevent error when the SQL result is empty. Before this commit, when the user clicked on the icon of a message, the following error occurred: ValueError: not enough values to unpack (expected 4, got 0) Complementary to 86e188c1599638071621f850a0fe875afedd851c --- mail_tracking/models/mail_tracking_email.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mail_tracking/models/mail_tracking_email.py b/mail_tracking/models/mail_tracking_email.py index e08df78d8..36c1dcde0 100644 --- a/mail_tracking/models/mail_tracking_email.py +++ b/mail_tracking/models/mail_tracking_email.py @@ -231,7 +231,9 @@ def _get_allowed_ids(self, ids): ) ) result = self.env.cr.fetchall() - _, msg_ids, mail_ids, partner_ids = zip(*result, strict=True) + msg_ids, mail_ids, partner_ids = [], [], [] + if result: + _, msg_ids, mail_ids, partner_ids = zip(*result, strict=True) msg_ids = ( self.env["mail.message"] .search([("id", "in", [x for x in msg_ids if x])]) From d7f3ccc98c120e64dc9103541d471493d2fab652 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 25 Nov 2025 12:38:54 +0000 Subject: [PATCH 4/4] [BOT] post-merge updates --- README.md | 2 +- mail_tracking/README.rst | 2 +- mail_tracking/__manifest__.py | 2 +- mail_tracking/static/description/index.html | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e6a0614f2..d437f6235 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ addon | version | maintainers | summary [mail_send_confirmation](mail_send_confirmation/) | 18.0.1.0.0 | | Mail Send Confirmation [mail_show_follower](mail_show_follower/) | 18.0.1.0.1 | yajo | Show CC document followers in mails. [mail_suggested_recipient_unchecked](mail_suggested_recipient_unchecked/) | 18.0.1.0.0 | victoralmau | Mail suggested recipient unchecked -[mail_tracking](mail_tracking/) | 18.0.1.0.5 | | Email tracking system for all mails sent +[mail_tracking](mail_tracking/) | 18.0.1.0.6 | | Email tracking system for all mails sent [mail_tracking_mailgun](mail_tracking_mailgun/) | 18.0.1.0.0 | | Mail tracking and Mailgun webhooks integration [mail_tracking_mass_mailing](mail_tracking_mass_mailing/) | 18.0.1.0.0 | | Improve mass mailing email tracking diff --git a/mail_tracking/README.rst b/mail_tracking/README.rst index 59ce9d064..c378cae17 100644 --- a/mail_tracking/README.rst +++ b/mail_tracking/README.rst @@ -11,7 +11,7 @@ Email tracking !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:1dcb2ce7cde25d536c483309729542a0a80d35e24af13a43d9903a6284c3955f + !! source digest: sha256:1f1623a6f08afa9507deebf534e7eb24325927d829724858b58a3c9bb5bc2cb4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/mail_tracking/__manifest__.py b/mail_tracking/__manifest__.py index ae9df1252..0ce3008e5 100644 --- a/mail_tracking/__manifest__.py +++ b/mail_tracking/__manifest__.py @@ -7,7 +7,7 @@ { "name": "Email tracking", "summary": "Email tracking system for all mails sent", - "version": "18.0.1.0.5", + "version": "18.0.1.0.6", "category": "Social Network", "website": "https://github.com/OCA/mail", "author": ("Tecnativa, Odoo Community Association (OCA)"), diff --git a/mail_tracking/static/description/index.html b/mail_tracking/static/description/index.html index f55fbf1d0..3000021fa 100644 --- a/mail_tracking/static/description/index.html +++ b/mail_tracking/static/description/index.html @@ -372,7 +372,7 @@

Email tracking

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:1dcb2ce7cde25d536c483309729542a0a80d35e24af13a43d9903a6284c3955f +!! source digest: sha256:1f1623a6f08afa9507deebf534e7eb24325927d829724858b58a3c9bb5bc2cb4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Beta License: AGPL-3 OCA/mail Translate me on Weblate Try me on Runboat

This module shows email notification tracking status for any messages in