From 1c5a7a79fe1e43b90e46eb89f737a8a48155d222 Mon Sep 17 00:00:00 2001 From: fordprefect Date: Sun, 13 Feb 2022 12:50:00 +0100 Subject: [PATCH] implementation of altermime invocation and filtering for dukun use case --- disclaimerfilter.py | 87 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100755 disclaimerfilter.py diff --git a/disclaimerfilter.py b/disclaimerfilter.py new file mode 100755 index 0000000..bbdd178 --- /dev/null +++ b/disclaimerfilter.py @@ -0,0 +1,87 @@ +#!/usr/bin/python +""" +Postfix filter for adding a disclaimer to selected email. + +Emails are + +License: GPLv3 +Author: Georg Schlisio +""" + +import subprocess +import sys +import email.parser + +# configuration: +# each rule is a tuple of +# 1. the (fragment of) the email address in the To: field +# 2. the absolute path of the disclaimer text file (must be readable for the filter user!) +rules = [ +# augustinerkantorei + ["chor@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["sopran@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["alt@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["tenor@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["bass@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["mitglied@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["vorstand@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["chorvertreter@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["freunde@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["ehemalig@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["kreativ@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["reise@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], + ["reiseorg@augustiner-kantorei.de", "/etc/postfix/mailinglists/disclaimers/augustinerdisclaimer"], +# nordenrunt + ["nordenrunt19@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["sopran.nordenrunt19@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["alt.nordenrunt19@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["tenor.nordenrunt19@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["bass.nordenrunt19@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["nordenrunt21@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["sopran.nordenrunt21@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["alt.nordenrunt21@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["tenor.nordenrunt21@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["bass.nordenrunt21@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["nordenrunt@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["sopran.nordenrunt@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["alt.nordenrunt@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["tenor.nordenrunt@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["bass.nordenrunt@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["undercover.nordenrunt@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], + ["nordenrunt_animanordica19@dukun.de", "/etc/postfix/mailinglists/disclaimers/nordenruntdisclaimer"], +# greifswalder domchor + ["chor@greifswalder-domchor.de", "/etc/postfix/mailinglists/disclaimers/domchordisclaimer"] + ] + +# DEBUGGING CASE - don't use in production! overwrites above +rules = [["abmelden@augustiner-kantorei.de", "augustinerdisclaimer"]] + +# read input and find recipient +mail = "".join(sys.stdin.readlines()) +recipient = email.parser.HeaderParser().parsestr(mail)["To"] + +for rule, disclaimer in rules: + if recipient.find(rule) >= 0: + # altermime invocation + am = subprocess.run(["/usr/bin/altermime", + "--input=-", + f"--disclaimer={disclaimer}", + "--htmltoo", + "--force-for-bad-html", + ], + input=mail.encode(), + capture_output=True + ) + + # check altermime return code + if am.returncode > 0: + sys.exit(EX_UNAVAILABLE) + + # write back result + mail = am.stdout.decode() + + # only first matching disclaimer! + break + +sendmailprocess = subprocess.Popen(["/usr/bin/sendmail"] + sys.argv[1:], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) +sendmailprocess.communicate(input=mail.encode('utf-8'))