Zum Inhalt springen
Zurück zum Blog
Open-Source-Tools

Mailcow mit Rspamd und LLM gegen Spam erweitern

Michael Ortner30. Juni 20262 Min. Lesezeit
mailcow mit rspamd und llm

Warum ich das überhaupt gemacht habe

Der klassische Spam-Filter in Mailcow und Rspamd ist schon brauchbar, aber bei sauber formulierten Phishing-Mails und neuen Spam-Wellen stößt man irgendwann an Grenzen. Genau da wollte ich einen zweiten Prüfschritt ergänzen: ein LLM, das den Textinhalt mitbewertet.

Wichtig ist mir dabei: Das ersetzt keinen Spamfilter, sondern ergänzt ihn. Ich würde das nur als zusätzlichen Signalgeber einsetzen, nicht als alleinige Entscheidung.

Wo die Konfiguration hingehört

Für Mailcow legst du die Datei data/conf/rspamd/local.d/gpt.conf an. Dort kommt genau die innere Konfiguration für das Rspamd-GPT-Modul hinein, also ohne zusätzlichen gpt { }-Wrapper.

# GPT / LLM spam classification module
# Managed manually - DO NOT COMMIT (contains secret API key)
# Docs: https://docs.rspamd.com/modules/gpt
#
# NOTE: This file is auto-included INSIDE the gpt { } section by rspamd's
# modules.d/gpt.conf, so it must contain ONLY the inner keys (no gpt { } wrapper).

enabled = true;
type = "openai";

# OpenAI API key (rotate after testing!)
api_key = "sk-proj-your-key>

# Primary model. To fall back, change this to "gpt-4o-mini" (same key).
model = "gpt-5-mini";

url = "https://api.openai.com/v1/chat/completions";
timeout = 20s;

# Per-model request parameters.
# IMPORTANT: gpt-5 reasoning models reject temperature!=1 and 'max_tokens';
# they only accept 'max_completion_tokens'. gpt-4o-mini uses the classic params.
model_parameters = {
  "gpt-5-mini" = {
    # Extra headroom so reasoning tokens don't starve the answer (~576 observed)
    max_completion_tokens = 2000;
  }
  "gpt-4o-mini" = {
    max_tokens = 1000;
    temperature = 0.0;
  }
}

# Only evaluate text parts with at least this many words
min_words = 10;

# Active mode: GPT verdict influences the spam score.
# Do NOT learn Bayes from GPT verdicts (avoid poisoning the classifier).
autolearn = false;

# Write the model's reasoning into a header for transparency / debugging
reason_header = "X-GPT-Reason";


Was die Optionen praktisch bedeuten

Ich habe das Ganze mit OpenAI getestet. Laut Rspamd sind aber nicht nur OpenAI-Modelle möglich, sondern auch andere KIs bzw. lokale Modelle. Genau das ist für Selfhosting interessant: Du bist nicht auf einen einzigen Anbieter festgenagelt.

Ein paar Punkte aus der Praxis:

  • enabled = true; schaltet das Modul aktiv.
  • autolearn = false; würde ich so lassen, damit dir das Bayes-System nicht mit LLM-Fehlentscheidungen „vergiftet“ wird.
  • min_words = 10; verhindert, dass Mini-Inhalte wie Signaturen oder kurze Antworten unnötig an das Modell gehen.
  • reason_header = "X-GPT-Reason"; ist hilfreich beim Debuggen, aber genau da musst du aufpassen, was du intern loggst.

Mailcow neu starten

Nach dem Anlegen oder Ändern der Datei reicht es nicht, nur Rspamd anzufassen. Mailcow muss neu gestartet werden, damit die neue Konfiguration sauber geladen wird.

Je nach Setup mache ich das direkt über die Mailcow-Container bzw. den vorgesehenen Restart-Weg in meiner Umgebung. Wenn du danach testest, prüf zuerst, ob Rspamd die Datei wirklich geladen hat und ob das Header-Feld auftaucht.

rspamd Test


Was du nicht unterschätzen solltest

Ein LLM-Filter kostet immer zusätzlich Latenz und Abhängigkeit von einem externen Dienst, wenn du kein lokales Modell nutzt. Außerdem ist Spam-Erkennung nie binär: Auch ein LLM irrt sich bei Newsletter-Mails, automatisierten Benachrichtigungen oder „komischen“ aber legitimen Geschäftsmails.

Darum würde ich das in Stufen einführen:

  1. erst loggen und beobachten,
  2. dann Score-Auswirkung aktivieren,
  3. danach die Regeln für deine Umgebung feinjustieren.

Fazit

Für Mailcow kann ein Rspamd-LLM-Modul ein sinnvoller Zusatz gegen schwer erkennbare Spam-Mails sein. Die Kernpunkte sind: Datei in data/conf/rspamd/local.d/gpt.conf anlegen, Konfiguration eintragen, Mailcow neu starten und das Ganze vorsichtig ausrollen. Ich würde es nur mit klarer Beobachtung und sauberem Debugging in Betrieb nehmen.

Michael Ortner
Michael Ortner
Systemadministrator · Linux, Virtualisierung & Infrastruktur
Weiterlesen

Weitere Beiträge