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!

