Mailcow: Bestimmte Absender blockieren, ablehnen oder bouncen

Immer wieder dieselben nervigen Absender, die mit Kaltaquise-Mails, Follow-ups und „nur kurz nachgehakt“-Nachrichten dein Postfach fluten.
Selbst ein gut trainiertes Spamfilter-System erkennt diese Mails oft nicht, weil sie halbwegs sauber formuliert und nicht klassischer Spam sind.

Was also tun?
In diesem Artikel zeige ich dir, wie du unter Mailcow solche Absender hart und sauber ablehnst, direkt auf SMTP-Ebene – und das elegant mit einem kleinen Shell-Script zur Verwaltung.

Warum nicht einfach filtern?

Natürlich könnte man mit Sieve-Filtern oder Roundcube-Regeln solche Mails in den Papierkorb werfen.
Aber:

  • Das belastet trotzdem dein Postfach.
  • Der Absender bekommt keine Fehlermeldung.
  • Und du siehst sie eventuell noch in Quarantäne oder Logs.

Besser ist, sie gar nicht erst anzunehmen.
Damit wird die Mail schon beim Eingang mit einem „550 5.7.1 Message rejected as spam or unwanted mail“ abgewiesen.
Kein Speicherverbrauch, kein Logging-Müll, kein Ärger.

Schritt 1: Eigene Rspamd-Blockliste aktivieren

Mailcow bringt Rspamd bereits als Spamfilter mit.
Wir nutzen dessen multimap-Funktion, um eine eigene Blockliste zu definieren.

Editiere daher (in einer Standard-Mailcow-Installation die folgende Datei:

sudo vim /opt/mailcow-dockerized/data/conf/rspamd/local.d/multimap.conf

Inhalt:

block_senders {
    type = "from";
    map = "/etc/rspamd/local.d/blocked_senders.map";
    action = "reject";
    message = "550 5.7.1 Message rejected as spam or unwanted mail";
    description = "Custom sender blocklist";
}

Damit sagst du Rspamd:
„Schau in diese Map-Datei, und wenn der Absender dort gelistet ist – lehne die Mail ab.“

Schritt 2: Blockliste anlegen

Lege die Datei an, in der du deine geblockten Adressen pflegst:

sudo vim /opt/mailcow-dockerized/data/conf/rspamd/local.d/blocked_senders.map

Beispielinhalt:

*@nervfirma.tld
ve******@*****le.org
doofie*@example.org

Jede Zeile ist ein Eintrag.
Wildcards *@domain.tld sind erlaubt.

Schritt 3: Konfiguration prüfen und Rspamd neu starten

Jetzt sicherstellen, dass die Syntax stimmt und dann den Dienst neu starten:

cd /opt/mailcow-dockerized
docker compose exec rspamd-mailcow rspamadm configtest
docker compose restart rspamd-mailcow

Wenn syntax OK erscheint, ist alles gut.
Absender aus deiner Liste werden ab sofort auf SMTP-Ebene geblockt – sie bekommen also ein korrektes 550-Reject und die Mail landet nie bei dir.

Schritt 4: Komfortabler mit Shell-Script verwalten

Natürlich willst du nicht jedes Mal herumeditieren.
Deshalb hier ein kleines Script, das dich fragt, ob du einen Eintrag hinzufügen oder entfernen willst, und danach automatisch Rspamd neu startet.

Speichere dieses Script als
/opt/mailcow-dockerized/blocksender.sh
und mach es ausführbar:

chmod +x /opt/mailcow-dockerized/blocksender.sh

Inhalt:

#!/bin/bash
#
# blocksender.sh
# Kleine Helper-CLI zum Verwalten der Rspamd-Blockliste in Mailcow
# - Einträge hinzufügen/entfernen
# - rspamd neu starten bei Änderungen
#
# Voraussetzung:
#   - läuft auf dem Mailcow-Host
#   - wird aus /opt/mailcow-dockerized ausgeführt (oder wir cd'n dorthin)
#

MAILCOW_DIR="/opt/mailcow-dockerized"
BLOCKLIST_FILE="$MAILCOW_DIR/data/conf/rspamd/local.d/blocked_senders.map"
SERVICE_NAME="rspamd-mailcow"

cd "$MAILCOW_DIR" || { echo "Fehler: Konnte nicht nach $MAILCOW_DIR wechseln."; exit 1; }

if [ ! -f "$BLOCKLIST_FILE" ]; then
    echo "Fehler: Blocklisten-Datei $BLOCKLIST_FILE existiert nicht."
    exit 1
fi

restart_rspamd() {
    echo "Starte $SERVICE_NAME neu..."
    docker compose exec "$SERVICE_NAME" rspamadm configtest >/tmp/rspamd_configtest.out 2>&1
    if ! grep -q "syntax OK" /tmp/rspamd_configtest.out; then
        echo "WARNUNG: configtest meldet kein 'syntax OK'. Ausgabe:"
        cat /tmp/rspamd_configtest.out
        echo "Breche ab, kein Restart durchgeführt."
        exit 1
    fi

    docker compose restart "$SERVICE_NAME"
    if [ $? -ne 0 ]; then
        echo "Fehler: Neustart von $SERVICE_NAME fehlgeschlagen."
        exit 1
    fi

    echo "OK: $SERVICE_NAME neu gestartet."
}

echo "Was möchtest du tun?"
echo "[A] Hinzufügen"
echo "[R] Entfernen"
read -r -p "> " ACTION

case "$ACTION" in
    A|a)
        read -r -p "Bitte Absender/Domain eingeben (z.B. sp**@***ma.de oder *@nervfirma.de): " ENTRY
        if [ -z "$ENTRY" ]; then
            echo "Keine Eingabe. Abbruch."
            exit 1
        fi

        # Prüfen ob schon vorhanden (exakte Zeile)
        if grep -Fxq "$ENTRY" "$BLOCKLIST_FILE"; then
            echo "'$ENTRY' ist bereits in der Blockliste, keine Änderung."
            exit 0
        fi

        echo "$ENTRY" >> "$BLOCKLIST_FILE"
        if [ $? -ne 0 ]; then
            echo "Fehler: Konnte '$ENTRY' nicht in $BLOCKLIST_FILE schreiben."
            exit 1
        fi

        echo
        echo "Neuer Stand der Blockliste:"
        nl -ba "$BLOCKLIST_FILE"
        echo

        restart_rspamd
        ;;

    R|r)
        echo "Aktuelle Blockliste:"
        nl -ba "$BLOCKLIST_FILE"
        echo
        read -r -p "Welchen Eintrag exakt entfernen? (bitte exakt kopieren): " ENTRY
        if [ -z "$ENTRY" ]; then
            echo "Keine Eingabe. Abbruch."
            exit 1
        fi

        # Prüfen ob vorhanden
        if ! grep -Fxq "$ENTRY" "$BLOCKLIST_FILE"; then
            echo "Fehler: '$ENTRY' wurde nicht gefunden. Keine Änderung durchgeführt."
            exit 1
        fi

        # Temporäre Datei erstellen ohne diese Zeile
        TMPFILE=$(mktemp)
        grep -Fxv "$ENTRY" "$BLOCKLIST_FILE" > "$TMPFILE"

        if [ $? -ne 0 ]; then
            echo "Fehler beim Bearbeiten der Liste."
            rm -f "$TMPFILE"
            exit 1
        fi

        mv "$TMPFILE" "$BLOCKLIST_FILE"

        echo
        echo "'$ENTRY' entfernt. Neuer Stand:"
        nl -ba "$BLOCKLIST_FILE"
        echo

        restart_rspamd
        ;;

    *)
        echo "Ungültige Auswahl. Bitte A oder R."
        exit 1
        ;;
esac

exit 0

Anwendung

Starte das Script einfach mit:

cd /opt/containers/mailcow
./blocksender.sh

Dann wählst du A (add) oder R (remove) und gibst die Adresse ein.
Das Script prüft automatisch die Syntax und startet Rspamd nur neu, wenn alles korrekt ist.

Fazit

Mit dieser kleinen Ergänzung hast du dein Mailcow-System um ein richtig nützliches Feature erweitert:

  • Du blockst gezielt Absender oder ganze Domains auf SMTP-Ebene.
  • Der Spammer bekommt eine korrekte „550 5.7.1“-Antwort.
  • Du hast keine Mails im Postfach, kein Quarantäne-Müll, keine Nacharbeit.
  • Und dank des Scripts kannst du das Ganze bequem in Sekunden pflegen.

Kleine Änderung, große Wirkung!

Schreibe einen Kommentar

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