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; +}