In meinem Beitrag  “MagicSpam: Auto Whitelisting und Log Filter” ging es darum, wie man die eigenen Mail-Kontakte automatisch auf eine Whitelist setzen kann, so dass diese nicht versehentlich als Spam gefiltert werden. Allerdings gibt es bei dem Verfahren einen kleinen Haken: Sobald man einen Autoresponder eingeschaltet hat, landen auch andere Adressen auf der Whitelist, denn der Autoresponder antwortet gnadenlos auch auf jede Spam-Mail, die es durch den Spam-Filter schafft. Das folgende Skript löst dieses Problem.

Postfix: Autoresponder-Mails von anderen Mails unterscheiden

Damit unsere Lösung funktioniert, ist es notwendig in den Logdateien von Postfix die Autoresponder Mails von allen anderen Mails zu unterscheiden. Das geschieht mit folgendem Trick über die Betreffzeile (Subject) der Autoresponder Mails:

In Plesk wird das Subject jedes Autoresponders mit dem Zusatz “(Auto-Reply)” versehen:

magicspam-autoreponder

Da Postfix standardmässig keine Betreffzeilen in die Logdateien schreibt, muss die Konfiguration von Postfix wie folgt angepasst werden:

Unter /etc/postfix/main.cf wird folgende Zeile angehängt:

header_checks = regexp:/etc/postfix/header_checks

Danach erstellen wird eine neue Datei namens /etc/postfix/header_checks mit folgendem Inhalt:
/^subject:/ INFO

Nun starten wir Postfix über folgenden Befehl neu:
sudo /etc/init.d/postfix restart

Das neue Auto Whitelisting Skript für MagicSpam

Das Auto-Whitelisting Skript wird wie folgt modifiziert:

#!/bin/bash
#
# build-magic-whitelist.sh 1.07
#
# Implements MagicSpam and Spam Assassin Auto Whitelisting by
# collecting recipient addresses from the Postfix log.
#
# Ignoring AUTORESPONDER mails requires the following Postfix modifications:
#
# EDIT: /etc/main.cf:
# ADD: header_checks = regexp:/etc/postfix/header_checks
#
# CREATE: /etc/postfix/header_checks
# ADD: /^subject:/ INFO
#
# Restart Postfix to apply above mods.
#
# (c)2016-2018 Harald Schneider
#

# Config.start
#
# These addresses won't be synced to Spamassassin
EXCLUDE=(myname@mydomain.com myname@mydomain2.com)

# Clear this, if you use a unmodified Postfix
AUTORESPONDER="(Auto-Reply)"

# Sync Whitelist with SpamAssassin
SA_SYNC="YES"

# Plesk command for adding addresses to the whitelist
SA_WLIST_ADD="/usr/sbin/plesk bin spamassassin --update-server -whitelist add:"

#
# Config.end

# Filter Postfix log
#
echo "Filtering Postfix Log ..."
if [ $AUTORESPONDER = "" ]; then
 cat /var/log/maillog |grep -v "relay=local" |grep "relay=" |grep "status=sent" |perl -ne 'print lc "$1\n" if /to=<(.*?)>/' >/var/log/maillog-filtered.txt
else
 cat /var/log/maillog |perl -MMIME::QuotedPrint=decode_qp -e 'print decode_qp join"",<>' |grep "info: header Subject:" |grep -v "Subject:.*$AUTORESPONDER" |perl -ne 'print lc "$1\n" if /to=<(.*?)>/' >/var/log/maillog-filtered.txt
fi

# Append existing MagicSpam Whitelist
#
echo "Processing MagicSpam Whitelist ..."
cat /etc/magicspam/from_whitelist |awk '{print tolower($0)}' >> /var/log/maillog-filtered.txt

# Filter duplicates and write back to MagicSpam Whitelist
#
perl -ne 'print unless $seen{$_}++' /var/log/maillog-filtered.txt > /etc/magicspam/from_whitelist
rm /var/log/maillog-filtered.txt

# Sync MagicSpam Whitelist to Spamassassin Whitelist.
# This works in one direction only.
#
if [ $SA_SYNC = "YES" ]; then
 echo "Syncing to SpamAssasin Whitelist ..."
 while read LINE
 do
   if ! [[ " ${EXCLUDE[*]} " == *"${LINE}"* ]]; then

     # Make sure, that only valid mail addresses are processed:
     #
     if echo ${LINE}|grep '^[a-zA-Z0-9_.*-]*@[a-zA-Z0-9-]*\.[a-zA-Z0-9]*$' >/dev/null; then
       echo ${LINE} 
       WLIST+=${LINE}","
     fi
   fi
 done < <(cat /etc/magicspam/from_whitelist)

 WLIST=${WLIST::-1}
 ${SA_WLIST_ADD}${WLIST}
fi

echo "DONE!"
exit 0

Zum Beitrag  “MagicSpam: Auto Whitelisting und Log Filter”