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 '*,' -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

Schreiben Sie einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.