Spamreport – Infomail über den Inhalt des Spamordners

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 &#039;*,&#039; -type f | wc -l)

typeset -a spamnew
spamnew=(`find $cur -mtime -1 -type f -exec basename {} \;`)
echo -e "${email}: ${spamcount} ${spamnewcount}"
if &#x5B; $spamnewcount != "0" ];
then
    na=`echo ${name}`
    echo "Hallo  $na" &gt; $mailtext
    echo &gt;&gt; $mailtext
    echo "Hier ist der täglich Spam-Bericht" &gt;&gt; $mailtext
    echo &gt;&gt; $mailtext
    echo "In Deinem Spam-Ordner befinden sich $spamcount Nachrichten davon sind $spamnewcount neu!" &gt;&gt; $mailtext
    echo &gt;&gt; $mailtext
    echo "Hier sind die Daten der neuen Spam-Nachrichten:" &gt;&gt; $mailtext
    echo &gt;&gt; $mailtext

    spamdata="Uhrzeit|Von|Betreff\n"
    for n in "${!spamnew&#x5B;@]}"
    do
        file=$cur/${spamnew&#x5B;$n]}
        from=$(grep "From: " $file | cut -d&#039;:&#039; -f2)
        subject=$(grep "Subject: " $file | cut -d&#039;:&#039; -f2)
        time=$(stat -c %y $file | cut -c20-29 --complement)
        spamdata="$spamdata$time|$from|$subject\n"
    done
    echo -e ${spamdata} | column -tx -s "|" &gt;&gt; $mailtext

    echo &gt;&gt; $mailtext
    echo "Beste Grüße $postmaster" &gt;&gt; $mailtext

    mail -a "Content-type: text/plain; charset=utf-8" -s "Spam-Report vom ${date}" -a "From: $postmaster" ${email} &lt; $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

Gurkengewuerz

Ein privater Blog.


By gurkengewuerz, 2019-10-11