diff --git a/mail_cleanup/README.rst b/mail_cleanup/README.rst index c47d22592..2f75056f6 100644 --- a/mail_cleanup/README.rst +++ b/mail_cleanup/README.rst @@ -1,22 +1,48 @@ -.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 - ============ Mail cleanup ============ +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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 + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--tools-lightgray.png?logo=github + :target: https://github.com/OCA/server-tools/tree/11.0/mail_cleanup + :alt: OCA/server-tools +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-tools-11-0/server-tools-11-0-mail_cleanup + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/149/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + This module allows to: +---------------------- + * mark e-mails older than x days as read, * move those messages in a specific folder, * remove messages older than x days -on IMAP servers, just before fetching them. + on IMAP servers, just before fetching them. Since the main "mail" module does not mark unroutable e-mails as read, this means that if junk mail arrives in the catch-all address without any default route, fetching newer e-mails will happen after re-parsing those unroutable e-mails. +**Table of contents** + +.. contents:: + :local: + Configuration ============= @@ -25,45 +51,48 @@ per server. Example of a configuration file (add those values to your server):: - [incoming_mail.openerp_imap_mail1] - cleanup_days = False # default value - purge_days = False # default value - cleanup_folder = NotParsed # optional parameter - -Known issues / Roadmap -====================== - -* None + [incoming_mail.openerp_imap_mail1] + cleanup_days = False # default value + purge_days = False # default value + cleanup_folder = NotParsed # optional parameter 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 smashing it by providing a detailed and welcomed feedback -`here `_. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. +Do not contact contributors directly about support or help with technical issues. Credits ======= +Authors +~~~~~~~ + +* Camptocamp + Contributors ------------- +~~~~~~~~~~~~ * Matthieu Dietrich +* Artem Kostyuk + +Maintainers +~~~~~~~~~~~ -Maintainer ----------- +This module is maintained by the OCA. .. 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. +This module is part of the `OCA/server-tools `_ project on GitHub. +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mail_cleanup/__manifest__.py b/mail_cleanup/__manifest__.py new file mode 100644 index 000000000..1b9528f31 --- /dev/null +++ b/mail_cleanup/__manifest__.py @@ -0,0 +1,14 @@ +# Copyright 2015-2016 Matthieu Dietrich (Camptocamp SA) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + 'name': 'Mail cleanup', + 'version': '11.0.1.0.0', + 'category': 'Tools', + 'summary': 'Mark as read or delete mails after a set time', + 'author': 'Camptocamp, ' + 'Odoo Community Association (OCA)', + 'license': 'AGPL-3', + 'website': 'https://github.com/OCA/server-tools', + 'depends': ['mail_environment'], + 'data': ['views/mail_view.xml'], +} diff --git a/mail_cleanup/__openerp__.py b/mail_cleanup/__openerp__.py deleted file mode 100644 index 61d35938c..000000000 --- a/mail_cleanup/__openerp__.py +++ /dev/null @@ -1,16 +0,0 @@ -# -*- coding: utf-8 -*- -# © 2015-2016 Matthieu Dietrich (Camptocamp SA) -# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). - -{ - 'name': 'Mail cleanup', - 'version': '9.0.1.0.0', - 'category': 'Tools', - 'summary': 'Mark as read or delete mails after a set time', - 'author': "Camptocamp,Odoo Community Association (OCA)", - 'license': 'AGPL-3', - 'website': 'https://odoo-community.org', - 'depends': ['mail_environment'], - 'data': ['views/mail_view.xml'], - 'installable': True, -} diff --git a/mail_cleanup/models/__init__.py b/mail_cleanup/models/__init__.py index cc2c6b2e5..033e76401 100644 --- a/mail_cleanup/models/__init__.py +++ b/mail_cleanup/models/__init__.py @@ -1 +1 @@ -from . import mail_cleanup +from . import fetchmail_server diff --git a/mail_cleanup/models/mail_cleanup.py b/mail_cleanup/models/fetchmail_server.py similarity index 52% rename from mail_cleanup/models/mail_cleanup.py rename to mail_cleanup/models/fetchmail_server.py index b313febcc..cf37658b8 100644 --- a/mail_cleanup/models/mail_cleanup.py +++ b/mail_cleanup/models/fetchmail_server.py @@ -1,64 +1,49 @@ -# -*- coding: utf-8 -*- -# © 2015-2016 Matthieu Dietrich (Camptocamp SA) +# Copyright 2015-2016 Matthieu Dietrich (Camptocamp SA) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import logging import datetime -from openerp import api, fields, models + from dateutil.relativedelta import relativedelta -from openerp.addons.server_environment import serv_config +from odoo import api, fields, models _logger = logging.getLogger(__name__) class FetchmailServer(models.Model): - """Incoming POP/IMAP mail server account""" + """Incoming POP/IMAP mail server account.""" _inherit = 'fetchmail.server' cleanup_days = fields.Integer( - compute='_get_cleanup_conf', string='Expiration days', - help="Number of days before marking an e-mail as read") + help="Number of days before marking an e-mail as read", + ) cleanup_folder = fields.Char( - compute='_get_cleanup_conf', string='Expiration folder', - help="Folder where an e-mail marked as read will be moved.") + help="Folder where an e-mail marked as read will be moved.", + ) purge_days = fields.Integer( - compute='_get_cleanup_conf', string='Deletion days', - help="Number of days before removing an e-mail") - - @api.multi - def _get_cleanup_conf(self): - """ - Return configuration - """ - for fetchmail in self: - global_section_name = 'incoming_mail' - - # default vals - config_vals = {'cleanup_days': False, - 'purge_days': False, - 'cleanup_folder': False} - if serv_config.has_section(global_section_name): - config_vals.update(serv_config.items(global_section_name)) - - custom_section_name = '.'.join((global_section_name, - fetchmail.name)) - if serv_config.has_section(custom_section_name): - config_vals.update(serv_config.items(custom_section_name)) - - # convert string values to integer - if config_vals['cleanup_days']: - config_vals['cleanup_days'] = int(config_vals['cleanup_days']) - if config_vals['purge_days']: - config_vals['purge_days'] = int(config_vals['purge_days']) - - for field in ['cleanup_days', 'purge_days', 'cleanup_folder']: - fetchmail[field] = config_vals[field] + help="Number of days before removing an e-mail", + ) + + @property + def _server_env_fields(self): + base_fields = super()._server_env_fields + mail_cleanup_fields = { + 'cleanup_days': { + 'getter': 'getint', + }, + 'purge_days': { + 'getter': 'getint', + }, + 'cleanup_folder': {}, + } + mail_cleanup_fields.update(base_fields) + return mail_cleanup_fields def _cleanup_fetchmail_server(self, server, imap_server): count, failed = 0, 0 @@ -78,13 +63,15 @@ class FetchmailServer(models.Model): if result[0] == 'OK': imap_server.store(num, '+FLAGS', '\\Deleted') except Exception: - _logger.exception('Failed to cleanup mail from %s server %s.', - server.type, server.name) + _logger.exception( + 'Failed to cleanup mail from %s server %s.', + server.type, server.name) failed += 1 count += 1 - _logger.info("Marked %d email(s) as read on %s server %s; " - "%d succeeded, %d failed.", count, server.type, - server.name, (count - failed), failed) + _logger.info( + 'Marked %d email(s) as read on %s server %s;' + ' %d succeeded, %d failed.', count, server.type, + server.name, (count - failed), failed) def _purge_fetchmail_server(self, server, imap_server): # Purging e-mails older than the purge date, if available @@ -99,25 +86,29 @@ class FetchmailServer(models.Model): # Delete message imap_server.store(num, '+FLAGS', '\\Deleted') except Exception: - _logger.exception('Failed to remove mail from %s server %s.', - server.type, server.name) + _logger.exception( + 'Failed to remove mail from %s server %s.', + server.type, server.name) failed += 1 count += 1 - _logger.info("Removed %d email(s) on %s server %s; " - "%d succeeded, %d failed.", count, server.type, - server.name, (count - failed), failed) + _logger.info( + 'Removed %d email(s) on %s server %s;' + ' %d succeeded, %d failed.', count, server.type, + server.name, (count - failed), failed) @api.multi def fetch_mail(self): - """ Called before the fetch, in order to clean up - right before retrieving emails. """ + # Called before the fetch, in order to clean up right before + # retrieving emails. context = self.env.context.copy() context['fetchmail_cron_running'] = True for server in self: _logger.info('start cleaning up emails on %s server %s', server.type, server.name) - context.update({'fetchmail_server_id': server.id, - 'server_type': server.type}) + context.update({ + 'fetchmail_server_id': server.id, + 'server_type': server.type, + }) imap_server = False if server.type == 'imap': try: @@ -130,11 +121,12 @@ class FetchmailServer(models.Model): # flagged as deleted imap_server.expunge() except Exception: - _logger.exception("General failure when trying to cleanup " - "mail from %s server %s.", - server.type, server.name) + _logger.exception( + 'General failure when trying to cleanup' + ' mail from %s server %s.', + server.type, server.name) finally: if imap_server: imap_server.close() imap_server.logout() - return super(FetchmailServer, self).fetch_mail() + return super().fetch_mail() diff --git a/mail_cleanup/readme/CONFIGURE.rst b/mail_cleanup/readme/CONFIGURE.rst new file mode 100644 index 000000000..97b629552 --- /dev/null +++ b/mail_cleanup/readme/CONFIGURE.rst @@ -0,0 +1,9 @@ +This module depends on ``mail_environment`` in order to add "expiration dates" +per server. + +Example of a configuration file (add those values to your server):: + + [incoming_mail.openerp_imap_mail1] + cleanup_days = False # default value + purge_days = False # default value + cleanup_folder = NotParsed # optional parameter diff --git a/mail_cleanup/readme/CONTRIBUTORS.rst b/mail_cleanup/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..99169ecc8 --- /dev/null +++ b/mail_cleanup/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Matthieu Dietrich +* Artem Kostyuk diff --git a/mail_cleanup/readme/DESCRIPTION.rst b/mail_cleanup/readme/DESCRIPTION.rst new file mode 100644 index 000000000..f70c430bf --- /dev/null +++ b/mail_cleanup/readme/DESCRIPTION.rst @@ -0,0 +1,12 @@ +This module allows to: +---------------------- + +* mark e-mails older than x days as read, +* move those messages in a specific folder, +* remove messages older than x days + on IMAP servers, just before fetching them. + +Since the main "mail" module does not mark unroutable e-mails as read, +this means that if junk mail arrives in the catch-all address without +any default route, fetching newer e-mails will happen after re-parsing +those unroutable e-mails. diff --git a/mail_cleanup/views/mail_view.xml b/mail_cleanup/views/mail_view.xml index 290225066..432c7a9c6 100644 --- a/mail_cleanup/views/mail_view.xml +++ b/mail_cleanup/views/mail_view.xml @@ -5,7 +5,7 @@ inherit_fetchmail_for cleanup fetchmail.server - +