From c31a896e814e29e8e2f88470b05a3dbcc4e7edc9 Mon Sep 17 00:00:00 2001 From: fliu <10025-fliu@users.noreply.salsa.debian.org> Date: Thu, 29 Jul 2021 03:46:42 +0000 Subject: [PATCH] email: Implement spam sorting with sieve - Sieve script detects spam headers used by Rspamd and SpamAssassin - Autosubscribe to Archive, Drafts, Junk, Sent, Trash - Autoexpunge Trash and Junk folders - INBOX.Junk -> Junk, INBOX.Trash -> Trash, Sent Messages -> Sent --- plinth/modules/email_server/audit/spam.py | 20 +++++++++ .../dovecot/conf.d/90-freedombox-lmtp.conf | 6 +++ .../conf.d/90-freedombox-mailboxes.conf | 43 +++++++++++++++++++ .../dovecot/conf.d/95-freedombox-sieve.conf | 6 +++ .../freedombox-sieve-after/sort-spam.sieve | 8 ++++ 5 files changed, 83 insertions(+) create mode 100644 plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-lmtp.conf create mode 100644 plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-mailboxes.conf create mode 100644 plinth/modules/email_server/data/etc/dovecot/conf.d/95-freedombox-sieve.conf create mode 100644 plinth/modules/email_server/data/etc/dovecot/freedombox-sieve-after/sort-spam.sieve diff --git a/plinth/modules/email_server/audit/spam.py b/plinth/modules/email_server/audit/spam.py index 8a8f0c24b..baa763bb3 100644 --- a/plinth/modules/email_server/audit/spam.py +++ b/plinth/modules/email_server/audit/spam.py @@ -1,7 +1,9 @@ """Configures spam filters and the virus scanner""" # SPDX-License-Identifier: AGPL-3.0-or-later +import glob import logging +import subprocess from plinth import actions @@ -50,3 +52,21 @@ def fix_filter(diagnosis): def action_set_filter(): with postconf.mutex.lock_all(): fix_filter(check_filter()) + _compile_sieve() + + +def _compile_sieve(): + sieve_list = glob.glob('/etc/dovecot/freedombox-sieve-after/*.sieve') + for sieve_file in sieve_list: + _run_sievec(sieve_file) + + +def _run_sievec(sieve_file): + logger.info('Compiling sieve script %s', sieve_file) + args = ['sievec', '--', sieve_file] + completed = subprocess.run(args, capture_output=True) + if completed.returncode != 0: + logger.critical('Subprocess returned %d', completed.returncode) + logger.critical('Stdout: %r', completed.stdout) + logger.critical('Stderr: %r', completed.stderr) + raise OSError('Sieve compilation failed: ' + sieve_file) diff --git a/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-lmtp.conf b/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-lmtp.conf new file mode 100644 index 000000000..a0f2a3ca4 --- /dev/null +++ b/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-lmtp.conf @@ -0,0 +1,6 @@ +# Direct edits to this file will be lost! +# Manage your settings on Plinth + +protocol lmtp { + mail_plugins = $mail_plugins sieve +} diff --git a/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-mailboxes.conf b/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-mailboxes.conf new file mode 100644 index 000000000..d14f70d59 --- /dev/null +++ b/plinth/modules/email_server/data/etc/dovecot/conf.d/90-freedombox-mailboxes.conf @@ -0,0 +1,43 @@ +# Direct edits to this file will be lost! +# Manage your settings on Plinth + +namespace inbox { + mailbox Archive { + auto = subscribe + special_use = \Archive + } + mailbox Drafts { + auto = subscribe + special_use = \Drafts + } + mailbox Junk { + auto = subscribe + autoexpunge = 30d + special_use = \Junk + } + mailbox Trash { + auto = subscribe + autoexpunge = 30d + special_use = \Trash + } + + mailbox INBOX.Junk { + auto = no + autoexpunge = 30d + special_use = \Junk + } + mailbox INBOX.Trash { + auto = no + autoexpunge = 30d + special_use = \Trash + } + + mailbox Sent { + auto = subscribe + special_use = \Sent + } + mailbox "Sent Messages" { + auto = no + special_use = \Sent + } +} diff --git a/plinth/modules/email_server/data/etc/dovecot/conf.d/95-freedombox-sieve.conf b/plinth/modules/email_server/data/etc/dovecot/conf.d/95-freedombox-sieve.conf new file mode 100644 index 000000000..dc34ba411 --- /dev/null +++ b/plinth/modules/email_server/data/etc/dovecot/conf.d/95-freedombox-sieve.conf @@ -0,0 +1,6 @@ +# Direct edits to this file will be lost! +# Manage your settings on Plinth + +plugin { + sieve_after = /etc/dovecot/freedombox-sieve-after +} diff --git a/plinth/modules/email_server/data/etc/dovecot/freedombox-sieve-after/sort-spam.sieve b/plinth/modules/email_server/data/etc/dovecot/freedombox-sieve-after/sort-spam.sieve new file mode 100644 index 000000000..aebaf100a --- /dev/null +++ b/plinth/modules/email_server/data/etc/dovecot/freedombox-sieve-after/sort-spam.sieve @@ -0,0 +1,8 @@ +require ["fileinto", "mailbox"]; + +if anyof(header :contains "X-Spam" "Yes", + header :contains "X-Spam-Status" "Yes", + header :matches "X-Spam-Flag" "YES") { + fileinto :create "Junk"; + stop; +}