Holger Brunn
7 years ago
No known key found for this signature in database
GPG Key ID: 1C9760FECA3AE18
9 changed files with 211 additions and 0 deletions
-
61mail_autogenerated_header/README.rst
-
4mail_autogenerated_header/__init__.py
-
14mail_autogenerated_header/__manifest__.py
-
5mail_autogenerated_header/models/__init__.py
-
51mail_autogenerated_header/models/ir_mail_server.py
-
39mail_autogenerated_header/models/mail_thread.py
-
BINmail_autogenerated_header/static/description/icon.png
-
4mail_autogenerated_header/tests/__init__.py
-
33mail_autogenerated_header/tests/test_mail_autogenerated_header.py
@ -0,0 +1,61 @@ |
|||||
|
.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg |
||||
|
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html |
||||
|
:alt: License: AGPL-3 |
||||
|
|
||||
|
===================== |
||||
|
Autogenerated headers |
||||
|
===================== |
||||
|
|
||||
|
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. |
||||
|
|
||||
|
On the receiving side, this module drops all autogenerated incoming e-mails. |
||||
|
|
||||
|
The combination of both avoids possible mail loops with misconfigured or broken email servers on the opposite side. |
||||
|
|
||||
|
Usage |
||||
|
===== |
||||
|
|
||||
|
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_drop_autoreply`` to fine tune dropping autogenerated mails per model. |
||||
|
|
||||
|
Known issues / Roadmap |
||||
|
====================== |
||||
|
|
||||
|
* a configuration of this per message subtype would be nice |
||||
|
|
||||
|
Bug Tracker |
||||
|
=========== |
||||
|
|
||||
|
Bugs are tracked on `GitHub Issues |
||||
|
<https://github.com/OCA/social/issues>`_. In case of trouble, please |
||||
|
check there if your issue has already been reported. If you spotted it first, |
||||
|
help us smashing it by providing a detailed and welcomed feedback. |
||||
|
|
||||
|
Credits |
||||
|
======= |
||||
|
|
||||
|
Images |
||||
|
------ |
||||
|
|
||||
|
* Odoo Community Association: `Icon <https://github.com/OCA/maintainer-tools/blob/master/template/module/static/description/icon.svg>`_. |
||||
|
|
||||
|
Contributors |
||||
|
------------ |
||||
|
|
||||
|
* Holger Brunn <hbrunn@therp.nl> |
||||
|
|
||||
|
Do not contact contributors directly about help with questions or problems concerning this addon, but use the `community mailing list <mailto:community@mail.odoo.com>`_ or the `appropriate specialized mailinglist <https://odoo-community.org/groups>`_ for help, and the bug tracker linked in `Bug Tracker`_ above for technical issues. |
||||
|
|
||||
|
Maintainer |
||||
|
---------- |
||||
|
|
||||
|
.. image:: https://odoo-community.org/logo.png |
||||
|
:alt: Odoo Community Association |
||||
|
:target: https://odoo-community.org |
||||
|
|
||||
|
This module is maintained by the OCA. |
||||
|
|
||||
|
OCA, or the Odoo Community Association, is a nonprofit organization whose |
||||
|
mission is to support the collaborative development of Odoo features and |
||||
|
promote its widespread use. |
||||
|
|
||||
|
To contribute to this module, please visit https://odoo-community.org. |
@ -0,0 +1,4 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2018 Therp BV <https://therp.nl> |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
||||
|
from . import models |
@ -0,0 +1,14 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2018 Therp BV <https://therp.nl> |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
||||
|
{ |
||||
|
"name": "Autogenerated headers", |
||||
|
"version": "10.0.1.0.0", |
||||
|
"author": "Therp BV,Odoo Community Association (OCA)", |
||||
|
"license": "AGPL-3", |
||||
|
"category": "Tools", |
||||
|
"summary": "Add headers to Odoo's mails indicating they are autogenerated", |
||||
|
"depends": [ |
||||
|
'mail', |
||||
|
], |
||||
|
} |
@ -0,0 +1,5 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2018 Therp BV <https://therp.nl> |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
||||
|
from . import ir_mail_server |
||||
|
from . import mail_thread |
@ -0,0 +1,51 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2018 Therp BV <https://therp.nl> |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
||||
|
from odoo import api, models |
||||
|
|
||||
|
|
||||
|
class IrMailServer(models.Model): |
||||
|
_inherit = 'ir.mail_server' |
||||
|
|
||||
|
@api.model |
||||
|
def send_email( |
||||
|
self, message, mail_server_id=None, smtp_server=None, smtp_port=None, |
||||
|
smtp_user=None, smtp_password=None, smtp_encryption=None, |
||||
|
smtp_debug=False |
||||
|
): |
||||
|
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_debug=smtp_debug, |
||||
|
): |
||||
|
# 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(IrMailServer, self).send_email( |
||||
|
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_debug=smtp_debug, |
||||
|
) |
||||
|
|
||||
|
@api.model |
||||
|
def _send_email_set_autogenerated( |
||||
|
self, message, mail_server_id=None, smtp_server=None, smtp_port=None, |
||||
|
smtp_user=None, smtp_password=None, smtp_encryption=None, |
||||
|
smtp_debug=False |
||||
|
): |
||||
|
"""Determine if some mail should have the autogenerated headers""" |
||||
|
mail = self.env['mail.mail'].search([ |
||||
|
('message_id', '=', message['Message-Id']), |
||||
|
]) |
||||
|
if not mail: |
||||
|
return False |
||||
|
return mail.subtype_id != self.env.ref('mail.mt_comment') |
@ -0,0 +1,39 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# © 2018 Therp BV <https://therp.nl> |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
||||
|
import logging |
||||
|
from odoo import api, models |
||||
|
_logger = logging.getLogger(__name__) |
||||
|
|
||||
|
|
||||
|
class MailThread(models.AbstractModel): |
||||
|
_inherit = 'mail.thread' |
||||
|
|
||||
|
@api.model |
||||
|
def message_route( |
||||
|
self, message, message_dict, model=None, thread_id=None, |
||||
|
custom_values=None |
||||
|
): |
||||
|
if message['Auto-Submitted'] and message['Auto-Submitted'] != 'no': |
||||
|
if self._message_route_drop_autoreply( |
||||
|
message, message_dict, model=model, thread_id=thread_id, |
||||
|
custom_values=custom_values |
||||
|
): |
||||
|
return [] |
||||
|
return super(MailThread, self).message_route( |
||||
|
message, message_dict, model=model, thread_id=thread_id, |
||||
|
custom_values=custom_values |
||||
|
) |
||||
|
|
||||
|
@api.model |
||||
|
def _message_route_drop_autoreply( |
||||
|
self, message, message_dict, model=None, thread_id=None, |
||||
|
custom_values=None |
||||
|
): |
||||
|
"""React on an autoreply, return True if the mail should be dropped, |
||||
|
False otherwise""" |
||||
|
_logger.info( |
||||
|
'ignoring email %s from %s because it seems to be an auto ' |
||||
|
'reply', message.get('Message-ID'), message.get('From'), |
||||
|
) |
||||
|
return True |
After Width: 128 | Height: 128 | Size: 9.2 KiB |
@ -0,0 +1,4 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2018 Therp BV <https://therp.nl> |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
||||
|
from . import test_mail_autogenerated_header |
@ -0,0 +1,33 @@ |
|||||
|
# -*- coding: utf-8 -*- |
||||
|
# Copyright 2018 Therp BV <https://therp.nl> |
||||
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). |
||||
|
from openerp.tests.common import TransactionCase |
||||
|
|
||||
|
|
||||
|
class TestMailAutogeneratedHeader(TransactionCase): |
||||
|
def test_mail_autogenerated_header(self): |
||||
|
# sending |
||||
|
mail = self.env['mail.mail'].create({ |
||||
|
'subject': 'testmessage', |
||||
|
'email_from': 'test@test.com', |
||||
|
'email_to': 'test@test.com', |
||||
|
'message_id': 'message_id', |
||||
|
}) |
||||
|
message = self.env['ir.mail_server'].build_email( |
||||
|
[mail.email_from], [mail.email_to], mail.subject, '', |
||||
|
message_id=mail.message_id, |
||||
|
) |
||||
|
self.env['ir.mail_server'].send_email(message) |
||||
|
self.assertEqual(message['Auto-Submitted'], 'auto-generated') |
||||
|
|
||||
|
# receiving |
||||
|
message.replace_header('Message-Id', 'message_id2') |
||||
|
thread_id = self.env['mail.thread'].message_process( |
||||
|
'res.partner', message.as_string(), |
||||
|
) |
||||
|
self.assertFalse(thread_id) |
||||
|
del message['Auto-Submitted'] |
||||
|
thread_id = self.env['mail.thread'].message_process( |
||||
|
'res.partner', message.as_string(), |
||||
|
) |
||||
|
self.assertTrue(thread_id) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue