Ich wollte schon seitdem ich auf meinen eigenen Mailserver gewechselt bin, eine Spamreport-Email einrichten, wie ich es damals von 1&1 gewöhnt war. Schließlich sind auf dem Server knapp 100 Accounts hinterlegt und man kann nicht von jedem erwarten, dass dieser in regelmäßig in sein Postfach guckt.
Online habe ich nicht viel gefunden, außer zwei ältere Forumbeiträge. Einer aus 2004 und der andere aus 2014.
Letzten Endes konnte ich die Skripte von dem User @rolapp, die eigentlich für Plesk bzw. Ispconfig gedacht waren, für mein Setup mit Postfixadmin umschreiben.
Ein Spamreport an einen Nutzer sieht dann wie folgt aus.
Hallo <Postfix Name oder Username>,
Hier ist der täglich Spam-Bericht
In deinem Spam-Ordner befinden sich 23 Nachrichten davon sind 2 neu!
Hier sind die Daten der neuen Spam-Nachrichten:
Datum Von Betreff
2019-10-03 14:17:34 +0200 obama@jinrimiye.com Back To School Sale Starts Now!
2019-09-03 10:32:47 +0200 filip@ukrpost.ua My Good Friend,
Gruß postmaster@host.de
Die folgenden Skripte habe ich dafür geschrieben für mein Setup mit postfixadmin Version 3.2.
Voraussetzungen sind nur der mysql-client sowie die FILE Permission für den Mail-User.
In meiner Konfiguration werden außerdem via doveadm die Mailboxen von 60 Tage alten Spam befreit, was sich auch empfehlen lässt.
GRANT FILE ON . TO 'mail'@'localhost';
FLUSH PRIVILIGES;
#!/bin/bash
# Datei: select_accounts.sh
db="mail"
dbuser="mail" #Benutzername der Datenbank
dbpasswd="PASSWORT" #Datenbank Passwort
rm $1
mysql $db --user=$dbuser --password=$dbpasswd -e "SELECT CONCAT(username, ':', maildir, ':', IF(name = '', CONCAT(UPPER(SUBSTRING(local_part,1,1)),LOWER(SUBSTRING(local_part,2))), name)) FROM mailbox WHERE active = 1 INTO OUTFILE '${1}' FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\n';"
#!/bin/bash
# spamreport.sh
postmaster="postmaster@<EMAILADRESSE>" # Absender Email-Adresse
accounts="/tmp/accounts.conf"
mailtext="/<absolut_path>/mail.txt"
/<absolut_path>/select_accounts.sh $accounts
maildir="/var/vmail"
spamdir=".Junk"
typeset -a email
typeset -a spamnew
typeset -a name
### Ende Konfiguration ###
date=$(date '+%d.%m.%Y')
### Werte aus der accounts.conf lesen ###
while read -r email mailbox name;
do
cur=$maildir/${mailbox}$spamdir/cur
if [ ! -d "$cur" ]; then
continue
fi
spamcount=$(find $cur -type f | wc -l)
spamnewcount=$(find $cur -mtime -1 -name '*,' -type f | wc -l)
typeset -a spamnew
spamnew=(`find $cur -mtime -1 -type f -exec basename {} \;`)
echo -e "${email}: ${spamcount} ${spamnewcount}"
if [ $spamnewcount != "0" ];
then
na=`echo ${name}`
echo "Hallo $na" > $mailtext
echo >> $mailtext
echo "Hier ist der täglich Spam-Bericht" >> $mailtext
echo >> $mailtext
echo "In Deinem Spam-Ordner befinden sich $spamcount Nachrichten davon sind $spamnewcount neu!" >> $mailtext
echo >> $mailtext
echo "Hier sind die Daten der neuen Spam-Nachrichten:" >> $mailtext
echo >> $mailtext
spamdata="Uhrzeit|Von|Betreff\n"
for n in "${!spamnew[@]}"
do
file=$cur/${spamnew[$n]}
from=$(grep "From: " $file | cut -d':' -f2)
subject=$(grep "Subject: " $file | cut -d':' -f2)
time=$(stat -c %y $file | cut -c20-29 --complement)
spamdata="$spamdata$time|$from|$subject\n"
done
echo -e ${spamdata} | column -tx -s "|" >> $mailtext
echo >> $mailtext
echo "Beste Grüße $postmaster" >> $mailtext
mail -a "Content-type: text/plain; charset=utf-8" -s "Spam-Report vom ${date}" -a "From: $postmaster" ${email} < $mailtext
fi
done < <(cat $accounts | tr ':' "\t")
rm -f $mailtext
Die Skripte laufen dann jeden Tag via crontab um 16:00 Uhr ab.
0 16 * * * /<absolut_path>/spamreport.sh > /tmp/spamreport.log