From a25833314ea659e02bfe93bc928322b189a36379 Mon Sep 17 00:00:00 2001 From: Hinrikus Wolf <mail@hinrikus-wolf.de> Date: Wed, 16 May 2018 16:29:21 +0200 Subject: [PATCH] change dovecot s.t. a spamfilter can be plugged in --- dovecot/files/filter_junk.sieve | 10 ++++++++++ dovecot/files/report-ham.sieve | 15 +++++++++++++++ dovecot/files/report-spam.sieve | 7 +++++++ dovecot/handlers/main.yml | 5 +++++ dovecot/tasks/main.yml | 19 +++++++++++++++++++ dovecot/templates/conf.d/20-imap.conf.j2 | 22 ++++++++++++++++++++++ dovecot/templates/conf.d/90-sieve.conf.j2 | 3 +++ 7 files changed, 81 insertions(+) create mode 100644 dovecot/files/filter_junk.sieve create mode 100644 dovecot/files/report-ham.sieve create mode 100644 dovecot/files/report-spam.sieve diff --git a/dovecot/files/filter_junk.sieve b/dovecot/files/filter_junk.sieve new file mode 100644 index 0000000..e1d9d3a --- /dev/null +++ b/dovecot/files/filter_junk.sieve @@ -0,0 +1,10 @@ +require "fileinto"; + +if header :contains "X-Spam-Flag" "YES" { + fileinto "Junk"; +} + +if header :contains "Subject" "*SPAM*" { + fileinto "Junk"; +} + diff --git a/dovecot/files/report-ham.sieve b/dovecot/files/report-ham.sieve new file mode 100644 index 0000000..a9d30cf --- /dev/null +++ b/dovecot/files/report-ham.sieve @@ -0,0 +1,15 @@ +require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"]; + +if environment :matches "imap.mailbox" "*" { + set "mailbox" "${1}"; +} + +if string "${mailbox}" "Trash" { + stop; +} + +if environment :matches "imap.user" "*" { + set "username" "${1}"; +} + +pipe :copy "sa-learn-ham.sh" [ "${username}" ]; diff --git a/dovecot/files/report-spam.sieve b/dovecot/files/report-spam.sieve new file mode 100644 index 0000000..4dda267 --- /dev/null +++ b/dovecot/files/report-spam.sieve @@ -0,0 +1,7 @@ +require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"]; + +if environment :matches "imap.user" "*" { + set "username" "${1}"; +} + +pipe :copy "sa-learn-spam.sh" [ "${username}" ]; diff --git a/dovecot/handlers/main.yml b/dovecot/handlers/main.yml index 9f0e695..8ff9e91 100644 --- a/dovecot/handlers/main.yml +++ b/dovecot/handlers/main.yml @@ -3,3 +3,8 @@ - name: restart dovecot service: name=dovecot state=restarted +- name: compile sieve script + shell: "sievec /var/lib/dovecot/sieve.d/*.sieve" + + + diff --git a/dovecot/tasks/main.yml b/dovecot/tasks/main.yml index 7961665..9393299 100644 --- a/dovecot/tasks/main.yml +++ b/dovecot/tasks/main.yml @@ -31,6 +31,25 @@ - dovecot - mail +- name: ensure there is a folder for global sieve scripts + file: dest=/var/lib/dovecot/sieve.d state=directory owner=dovecot group=vmail mode=0770 + tags: + - dovecot + - mail + when: content_filter is defined + +- name: ensure the global spam filter and learning sieve script is present + copy: src="files/{{ item }}" dest="/var/lib/dovecot/sieve.d/{{ item }}" mode=0550 owner=dovecot group=vmail + with_items: + - filter_junk.sieve + - report-spam.sieve + - report-ham.sieve + notify: + - compile sieve script + tags: + - dovecot + - mail + when: content_filter is defined - name: ensure dsync config is present template: src=templates/conf.d/99-dsync.conf.j2 dest=/etc/dovecot/conf.d/99-dsync.conf diff --git a/dovecot/templates/conf.d/20-imap.conf.j2 b/dovecot/templates/conf.d/20-imap.conf.j2 index acad748..2fa9a16 100644 --- a/dovecot/templates/conf.d/20-imap.conf.j2 +++ b/dovecot/templates/conf.d/20-imap.conf.j2 @@ -75,3 +75,25 @@ protocol imap { #mail_max_userip_connections = 10 mail_max_userip_connections = 40 } + +{% if content_filter is defined %} + +plugin { + sieve_plugins = sieve_imapsieve sieve_extprograms + + # From elsewhere to Spam folder + imapsieve_mailbox1_name = Junk + imapsieve_mailbox1_causes = COPY + imapsieve_mailbox1_before = file:/usr/lib/dovecot/sieve.d/report-spam.sieve + + # From Spam folder to elsewhere + imapsieve_mailbox2_name = * + imapsieve_mailbox2_from = Junk + imapsieve_mailbox2_causes = COPY + imapsieve_mailbox2_before = file:/usr/lib/dovecot/sieve.d/report-ham.sieve + + sieve_pipe_bin_dir = /usr/lib/dovecot/sieve.d + + sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment +} +{% endif %} diff --git a/dovecot/templates/conf.d/90-sieve.conf.j2 b/dovecot/templates/conf.d/90-sieve.conf.j2 index ca494b0..bee89e3 100644 --- a/dovecot/templates/conf.d/90-sieve.conf.j2 +++ b/dovecot/templates/conf.d/90-sieve.conf.j2 @@ -76,6 +76,9 @@ plugin { #sieve_before = /var/lib/dovecot/sieve.d/ #sieve_before2 = ldap:/etc/sieve-ldap.conf;name=ldap-domain #sieve_before3 = (etc...) +{% if content_filter is defined %} + sieve_before = /var/lib/dovecot/sieve.d/filter_junk.sieve +{% endif %} # Identical to sieve_before, only the specified scripts are executed after the # user's script (only when keep is still in effect!). Multiple script -- GitLab