{"id":301,"date":"2025-11-21T16:38:40","date_gmt":"2025-11-21T15:38:40","guid":{"rendered":"https:\/\/www.schmueller.de\/?p=301"},"modified":"2026-02-05T11:55:10","modified_gmt":"2026-02-05T10:55:10","slug":"mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren","status":"publish","type":"post","link":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/","title":{"rendered":"Mailcow&#8217;s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern"},"content":{"rendered":"\r\n\n<p class=\"wp-block-paragraph\">Meine <a href=\"https:\/\/github.com\/mailcow\/mailcow-dockerized\">Mailcow<\/a> ist ein wunderbares St\u00fcck Software und filtert f\u00fcr alle darauf eingerichteten Konten sehr sch\u00f6n die SPAM heraus. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Jetzt habe ich noch einige weitere IMAP Konten von diversen Vereinen, die keinen so guten Spamfilter haben. Da kam mir der Gedanke ob ich nicht die Filterfunktion des Rspamd meiner Mailcow benutzen kann um damit jede neu eingehende Mail auf einem der IMAP Konten zu pr\u00fcfen. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"427\" src=\"https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/11\/Mailcow-frisst-Spam-1024x427.webp\" alt=\"\" class=\"wp-image-307\" srcset=\"https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/11\/Mailcow-frisst-Spam-1024x427.webp 1024w, https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/11\/Mailcow-frisst-Spam-300x125.webp 300w, https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/11\/Mailcow-frisst-Spam-768x320.webp 768w, https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/11\/Mailcow-frisst-Spam-660x275.webp 660w, https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/11\/Mailcow-frisst-Spam.webp 1536w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Das folgende Python3 Skript habe ich auf dem Host der Mailcow als Dienst installiert und seitdem verschiebt es mir die Spam-Mails sehr sch\u00f6n in den SPAM Ordner.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Alternativ habe ich das Skript in einen Docker Container gepackt und starte diesen nun zusammen mit Mailcow <a href=\"#Docker\" data-type=\"internal\" data-id=\"#Docker\">(Siehe unten)<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3\n\"\"\"\nimap_async_rspamd_scan.py\nVerarbeitet mehrere IMAP-Konten gleichzeitig mit IMAP IDLE und Rspamd.\nAngepasst f\u00fcr imapclient Version 3.0.1.\n\"\"\"\nimport imaplib, requests, logging, time, sys\nimport concurrent.futures\nfrom imapclient import IMAPClient, exceptions\n\n# === GLOBALE KONFIGURATION (F\u00fcr alle Konten gleich) ===\nRSPAMD_URL = \"http:\/\/172.22.1.11:11333\/checkv2\"\nSPAM_THRESHOLD = 6.0\nSPAM_FOLDER = \"INBOX.Spam\" \nIDLE_TIMEOUT = 540 # 9 Minuten\nIDLE_CHECK_INTERVAL = 10 \nLOGFILE = \"\/var\/log\/imap_rspamd_scan.log\"\nPROCESSED_FLAG = b'RspamdScanned'\n\nlogging.basicConfig(filename=LOGFILE, level=logging.INFO,\n                    format='%(asctime)s %(levelname)s &#91;%(user)s] %(message)s') # user-Feld hinzugef\u00fcgt\n\n# === KONTO-KONFIGURATIONEN ===\n# HINWEIS: Hier ALLE Konten mit den jeweiligen Zugangsdaten eintragen.\nACCOUNTS = &#91;\n    {\n        \"USER\": \"a@contoso.com\",\n        \"PASS\": \"Super-Geheim\",\n        \"HOST\": \"imap.server.contoso.com\",\n        \"PORT\": 993,\n    },\n    {\n        \"USER\": \"b@woanders.com\",\n        \"PASS\": \"Auch-Geheimes-Passwort\",\n        \"HOST\": \"imap.server.woanders.com\",\n        \"PORT\": 993,\n    },\n    {\n        \"USER\": \"c@xy-verein.com\",\n        \"PASS\": \"Super-Dooper-Geheim\",\n        \"HOST\": \"imap.server.xy-verein.com\",\n        \"PORT\": 993,\n    },\n]\n\n# === FUNKTIONEN ===\ndef imap_connect_and_login(config):\n    \"\"\"Stellt die IMAPClient-Verbindung her, loggt sich ein und w\u00e4hlt INBOX.\"\"\"\n    client = IMAPClient(config&#91;'HOST'], port=config&#91;'PORT'], ssl=True)\n    client.login(config&#91;'USER'], config&#91;'PASS'])\n    # Wichtig: W\u00e4hlt INBOX aus, um auf Nachrichten\u00e4nderungen zu achten\n    client.select_folder('INBOX', readonly=False) \n    return client\n\ndef post_to_rspamd(raw_message_bytes):\n    \"\"\"POST rohe Nachricht an Rspamd und gibt geparstes JSON zur\u00fcck.\"\"\"\n    headers = {'Content-Type': 'application\/octet-stream'}\n    try:\n        r = requests.post(RSPAMD_URL, headers=headers, data=raw_message_bytes, timeout=20)\n        r.raise_for_status()\n        return r.json()\n    except Exception as e:\n        logging.exception(\"Error contacting Rspamd: %s\", e)\n        return None\n\ndef process_messages(client, uids, config):\n    \"\"\"Ruft die Nachrichten ab, scannt sie und verschiebt Spam.\"\"\"\n    if not uids:\n        return\n\n    log_extra = {\"user\": config&#91;'USER']}\n    \n    # Abrufen der E-Mails: \n    fetch_data = client.fetch(uids, &#91;b'BODY.PEEK&#91;]', b'ENVELOPE'])\n\n    for uid, data in fetch_data.items():\n        raw_message_bytes = None\n        \n        # Verschiedene IMAP Server geben etwas andere Antworten\n        if b'BODY.PEEK&#91;]' in data:\n            raw_message_bytes = data&#91;b'BODY.PEEK&#91;]']\n        if not raw_message_bytes and b'RFC822' in data:\n            raw_message_bytes = data&#91;b'RFC822']\n        if not raw_message_bytes and b'BODY&#91;]' in data:\n            raw_message_bytes = data&#91;b'BODY&#91;]']\n\n        if not raw_message_bytes:\n            logging.error(\"Could not find email body data for UID %s\", uid, extra=log_extra)\n            continue\n            \n        subject = data&#91;b'ENVELOPE'].subject.decode() if data&#91;b'ENVELOPE'].subject else '(no-subject)'\n        \n        # 1. Sende an Rspamd\n        rsp = post_to_rspamd(raw_message_bytes)\n        \n        if not rsp:\n            logging.warning(\"No rspamd response for UID %s\", uid, extra=log_extra)\n            continue\n            \n        score = rsp.get('score')\n        required = rsp.get('required_score')\n        action = rsp.get('action')\n\n        logging.info(\"UID %s subject=%s score=%.2f required=%.2f action=%s\",\n                     uid, subject, score or 0.0, required or 0.0, action, extra=log_extra)\n        \n        # 2. Spam-Entscheidung\n        is_spam = (score is not None and required is not None and score &gt;= required) or \n                  (score is not None and score &gt;= SPAM_THRESHOLD) or \n                  (action in ('reject', 'discard'))\n\n        # 3. Verschieben, wenn Spam\n        if is_spam:\n            try:\n                client.move(uid, SPAM_FOLDER) \n                logging.info(\"Moved SPAM UID %s to %s.\", uid, SPAM_FOLDER, extra=log_extra)\n            except Exception as e:\n                logging.exception(\"Error moving UID %s: %s\", uid, e, extra=log_extra)\n        else:\n            logging.info(\"Clean mail UID %s. Leaving in INBOX.\", uid, extra=log_extra)\n\n\n# === HAUPT-LOOP JE KONTO ===\ndef handle_account(config):\n    \"\"\"Hauptlogik: Verbindet, scannt und wartet im IDLE-Modus f\u00fcr ein einzelnes Konto.\"\"\"\n    user = config&#91;'USER']\n    log_extra = {\"user\": user}\n\n    logging.info(\"Handler gestartet f\u00fcr Konto.\", extra=log_extra)\n    \n    while True:\n        client = None\n        try:\n            client = imap_connect_and_login(config)\n            # Initialer Scan: Verarbeite alle Mails, die UNGELSEN sind UND NICHT gescannt wurden.\n            # Die Suche wird auf 'UNSEEN' und 'NOT RspamdScanned' eingeschr\u00e4nkt.\n            flag_name = PROCESSED_FLAG.decode()\n            search_criteria = &#91;'UNSEEN', 'NOT', 'KEYWORD', flag_name]\n            initial_uids = client.search(search_criteria)\n            process_messages(client, initial_uids, config)\n            \n            start_time = time.time()\n            client.idle()\n            # IDLE Check Schleife\n            while True:\n                responses = client.idle_check(timeout=IDLE_CHECK_INTERVAL)\n                if responses:\n                    pass\n                    break \n\n                if time.time() - start_time &gt; IDLE_TIMEOUT:\n                    logging.info(\"IDLE timeout reached. Stopping IDLE for connection refresh.\", extra=log_extra)\n                    break \n\n            client.idle_done()\n            \n            # F\u00fchre einen erneuten Scan nach UNSEEN-Mails durch, die NICHT gescannt wurden.\n            final_uids = client.search(search_criteria) # Verwendet dieselben Kriterien wie Oben\n            process_messages(client, final_uids, config)\n\n            client.logout()\n            \n        except exceptions.IMAPClientError as e:\n            logging.error(\"IMAPClient Error: %s. Reconnecting in 10s.\", e, extra=log_extra)\n            if client:\n                try:\n                    client.close()\n                except:\n                    pass\n            time.sleep(10)\n        except Exception as e:\n            logging.exception(\"Fatal error in main loop: %s. Reconnecting in 10s.\", e, extra=log_extra)\n            if client:\n                try:\n                    client.close()\n                except:\n                    pass\n            time.sleep(10)\n\n# === HAUPT-LOOP ===\nif __name__ == '__main__':\n    logging.info(\"Starting multi-account IMAP IDLE scanner. Total accounts: %d\", \n                 len(ACCOUNTS), \n                 extra={\"user\": \"System\"}) \n    \n    # ThreadPoolExecutor erstellt einen Pool von Threads, um die Konten parallel zu verarbeiten\n    with concurrent.futures.ThreadPoolExecutor(max_workers=len(ACCOUNTS)) as executor:\n        # F\u00fchrt handle_account f\u00fcr jedes Konto in der ACCOUNTS-Liste aus\n        executor.map(handle_account, ACCOUNTS)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Das Skript startet f\u00fcr jedes Konto einen eigenen Thread, der jeweils asyncron per IMAP IDLE auf neue Mails im Konto wartet. Die Mails, die schon verarbeitet wurden erhalten eine Markierung, damit sie nicht wieder verarbeitet werden. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Als Spam erkannte Mails werden in den im Konfigurationsblock angegebenen Ordner verschoben. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dlie Rspamd-URL sollte sich eigentlich maximal in der IP des Rsapmd Containers der Mailcow unterscheiden. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Test<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nachdem man die Zugangsdaten f\u00fcr die IMAP Konten in der Konfiguration hinterlegt hat kann man das Skript erstmal so ausf\u00fchren und testen. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Als Service bootfest einrichten<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn alles so klappt wie man es haben m\u00f6chte, dann kann man das Script als Service einrichten indem man die folgende Datei als \/etc\/systemd\/system\/rspamd-imap-scanner.service ablegt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">anschlie\u00dfend ein &#8222;systemctl daemon-reload&#8220; und systemctl enable rspamd-imap-scanner.service und systemctl start rspamd-imap-scanner.service<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;Unit]\nDescription=Rspamd IMAP Scanner and Mover (Multi-Account IDLE)\nAfter=network.target\n\n&#91;Service]\n# Der Benutzer, unter dem das Skript laufen soll (empfohlen: nicht root, z.B. nobody)\nUser=nobody\nGroup=nobody\n\n# Typ: simple ist ausreichend, da Ihr Skript eine Endlosschleife enth\u00e4lt.\nType=simple\n\n# Der Befehl, der das Skript ausf\u00fchrt\nExecStart=\/usr\/bin\/python3 \/pfad_zum_script\/imap_async_rspamd_scan.py\n\n# Auto-Neustart bei abnormaler Beendigung (z.B. nach einem Fehler oder Crash)\nRestart=always\nRestartSec=5\n\n# Standard-Ausgabe und Fehler werden in das Journal von Systemd geschrieben\nStandardOutput=journal\nStandardError=journal\n\n&#91;Install]\n# Aktiviert den Dienst beim Systemstart\nWantedBy=multi-user.target\n\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Docker\">Alternative: Direkt in der Mailcow-Dockerumgebung in einem separaten Container starten<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nachdem ich das obige Skript als Dienst laufen hatte es ab und zu das Problem, dass es die IP des RSpamd Containers verloren hat und erst neu finden musste. Also kam mir der Gedanke, dass man das Skript ja direkt in einem Docker Container im &#8222;mailcow-netzwerk&#8220; laufen lassen kann und dann kein Problem mehr mit sich \u00e4ndernden IP&#8217;s hat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ich habe die Konfiguration ausgelagert und das Logging auf das Docker typische Logging umgestellt. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Es braucht ein neues Verzeichnis in der Mailcow Umgebung <strong>\/opt\/mailcow-dockerized\/data\/custom\/imap-scanner.<\/strong> In dieses kommt das Skript, die Konfigurationsdatei und das Dockerfile.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Dockerfile<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># Dockerfile f\u00fcr den Rspamd IMAP Scanner\nFROM python:3.11-slim\n\n# Installiere ben\u00f6tigte Pakete\nRUN pip install imapclient requests docker\n\n# Lege das Arbeitsverzeichnis fest\nWORKDIR \/app\n\n# F\u00fchre das Skript beim Start aus\nCMD &#91;\"python3\", \"imap_rspamd_docker.py\"]<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Konfigurationsdatei: imap_rspamd_config.json<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In dieser Datei m\u00fcssen die Zugangsdaten f\u00fcr die IMAP Konten angegeben werden. Die Anzahl ist prinzipiell beliebig.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n    \"GLOBAL\": {\n        \"RSPAMD_CONTAINER\": \"mailcowdockerized-rspamd-mailcow-1\",\n        \"SPAM_THRESHOLD\": 16.0,\n        \"SPAM_FOLDER\": \"INBOX.Spam\",\n        \"IDLE_TIMEOUT\": 540,\n        \"IDLE_CHECK_INTERVAL\": 10,\n        \"LOGFILE\": \"\/var\/log\/imap_rspamd_scan.log\",\n        \"PROCESSED_FLAG\": \"RspamdScanned\"\n    },\n    \"ACCOUNTS\": &#91;\n        {\n            \"USER\": \"hein.bloed@contoso.com\",\n            \"PASS\": \"8MJp45L$#p%\",\n            \"HOST\": \"imap.contoso.com\",\n            \"PORT\": 993\n        },\n        {\n            \"USER\": \"friedrich.maerz@contoso.com\",\n            \"PASS\": \"FriedensNobelPreisFuerMich\",\n            \"HOST\": \"contoso.com\",\n            \"PORT\": 993\n        },\n        {\n            \"USER\": \"chef@contoso.com\",\n            \"PASS\": \"8hzhmdaodu0fwer\",\n            \"HOST\": \"contoso.com\",\n            \"PORT\": 993\n        }\n    ]\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Das angepasste Skript: imap_rspamd_docker.py<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/usr\/bin\/env python3\n\"\"\"\nimap_rspamd_docker.py\nVerarbeitet mehrere IMAP-Konten gleichzeitig mit IMAP IDLE und Rspamd.\n\"\"\"\nimport imaplib, requests, logging, time, sys\nimport concurrent.futures\nfrom imapclient import IMAPClient, exceptions\nimport sys\nimport json\n\n# === KONFIGURATIONSDATEI liegt in .\/data\/custom\/imap-scanner ===\nCONFIG_PATH = \"\/etc\/imap_rspamd_config.json\"\nRSPAMD_CONTAINER = \"rspamd\"\nSPAM_THRESHOLD = None\nSPAM_FOLDER = None\nIDLE_TIMEOUT = None\n# ... weitere globale Variablen hier definieren (z.B. LOGFILE, PROCESSED_FLAG) ...\nPROCESSED_FLAG = None\nACCOUNTS = &#91;] # Wird aus der Konfiguration geladen\nRSPAMD_URL = None # Wird sp\u00e4ter berechnet\n\n# === FUNKTIONEN ===\n\ndef imap_connect_and_login(config):\n    \"\"\"Stellt die IMAPClient-Verbindung her, loggt sich ein und w\u00e4hlt INBOX.\"\"\"\n    client = IMAPClient(config&#91;'HOST'], port=config&#91;'PORT'], ssl=True)\n    client.login(config&#91;'USER'], config&#91;'PASS'])\n    client.select_folder('INBOX', readonly=False) \n    return client\n\ndef post_to_rspamd(raw_message_bytes):\n    \"\"\"POST rohe Nachricht an Rspamd und parsed das zur\u00fcckgegebene JSON\"\"\"\n    headers = {'Content-Type': 'application\/octet-stream'}\n    try:\n        r = requests.post(RSPAMD_URL, headers=headers, data=raw_message_bytes, timeout=20)\n        r.raise_for_status()\n        return r.json()\n    except Exception as e:\n        logging.exception(\"Error contacting Rspamd: %s\", e)\n        return None\n\ndef load_config(config_path):\n    \"\"\"L\u00e4dt die Konfiguration aus einer JSON-Datei.\"\"\"\n    try:\n        with open(config_path, 'r') as f:\n            return json.load(f)\n    except FileNotFoundError:\n        print(f\"FATAL: Konfigurationsdatei nicht gefunden: {config_path}\")\n        sys.exit(1)\n    except json.JSONDecodeError:\n        print(f\"FATAL: Fehler beim Parsen der Konfigurationsdatei: {config_path}\")\n        sys.exit(1)\n    except Exception as e:\n        print(f\"FATAL: Fehler beim Laden der Konfiguration: {e}\")\n        sys.exit(1)\n\ndef process_messages(client, uids, config):\n    \"\"\"Ruft die neuen Nachrichten ab, scannt sie und verschiebt Spam.\"\"\"\n    if not uids:\n        return\n\n    log_extra = {\"user\": config&#91;'USER']}\n    \n    # Abrufen der E-Mails: BODY.PEEK&#91;] verhindert das Setzen des Seen-Flags.\n    fetch_data = client.fetch(uids, &#91;b'BODY.PEEK&#91;]', b'ENVELOPE'])\n    for uid, data in fetch_data.items():\n        raw_message_bytes = None\n        # Verschiedene Keys f\u00fcr pr\u00fcfen, da der Key nicht bei allen Servern RFC822 ist\n        if b'BODY.PEEK&#91;]' in data:\n            raw_message_bytes = data&#91;b'BODY.PEEK&#91;]']\n        if not raw_message_bytes and b'RFC822' in data:\n            raw_message_bytes = data&#91;b'RFC822']\n        if not raw_message_bytes and b'BODY&#91;]' in data:\n            raw_message_bytes = data&#91;b'BODY&#91;]']\n\n        if not raw_message_bytes:\n            logging.error(\"Could not find email body data for UID %s\", uid, extra=log_extra)\n            continue\n            \n        subject = data&#91;b'ENVELOPE'].subject.decode() if data&#91;b'ENVELOPE'].subject else '(no-subject)'\n        \n        # Sende an Rspamd\n        rsp = post_to_rspamd(raw_message_bytes)           \n        score = rsp.get('score')\n        required = rsp.get('required_score')\n        action = rsp.get('action')\n\n        logging.info(\"UID %s subject=%s score=%.2f required=%.2f action=%s\",\n                     uid, subject, score or 0.0, required or 0.0, action, extra=log_extra)\n        \n        # Spam-Entscheidung\n        is_spam = action in ('reject', 'add header', 'rewrite subject', 'discard') or \n                  (score is not None and required is not None and score &gt;= required)\n\n        # Verschieben, wenn Spam\n        if is_spam:\n            try:\n                client.move(uid, SPAM_FOLDER) \n                logging.info(\"Moved SPAM UID %s to %s.\", uid, SPAM_FOLDER, extra=log_extra)\n            except Exception as e:\n                logging.exception(\"Error moving UID %s: %s\", uid, e, extra=log_extra)\n        else:\n            logging.info(\"Clean mail UID %s. Leaving in INBOX.\", uid, extra=log_extra)\n        try:\n            # Hier wird ein Flag gesetzt, damit diese Mail nicht nocheinmal bearbeitet wird.\n            client.add_flags(uids, (PROCESSED_FLAG,))\n            logging.info(\"Set flag %s on UIDs: %s\", PROCESSED_FLAG.decode(), uids, extra=log_extra)\n        except Exception as e:\n            logging.exception(\"Error adding flag %s to UIDs %s: %s\", PROCESSED_FLAG.decode(), uids, e, extra=log_extra)\n\n# === HAUPT-LOOP F\u00dcR EIN KONTO ===\ndef handle_account(config):\n    \"\"\"Hauptlogik: Verbindet, scannt und wartet im IDLE-Modus f\u00fcr ein einzelnes Konto.\"\"\"\n    user = config&#91;'USER']\n    log_extra = {\"user\": user}\n    logging.info(\"Handler gestartet f\u00fcr Konto.\", extra=log_extra)\n    \n    while True:\n        client = None\n        try:\n            client = imap_connect_and_login(config)\n            logging.info(\"IMAP connection established. Entering IDLE mode.\", extra=log_extra)\n            # Initialer Scan: Verarbeite alle Mails, die UNGELSEN sind UND NICHT das Flag haben.\n            # Also wird die Suche auf 'UNSEEN' und 'NOT RspamdScanned' eingeschr\u00e4nkt.\n            flag_name = PROCESSED_FLAG.decode()\n            search_criteria = &#91;'UNSEEN', 'NOT', 'KEYWORD', flag_name]\n            initial_uids = client.search(search_criteria)\n            process_messages(client, initial_uids, config)\n            \n            start_time = time.time()\n            client.idle()\n            # IDLE Check Schleife\n            while True:\n                responses = client.idle_check(timeout=IDLE_CHECK_INTERVAL)\n                if responses:\n                    pass\n                    break \n\n                if time.time() - start_time &gt; IDLE_TIMEOUT:\n                    logging.info(\"IDLE timeout reached. Stopping IDLE for connection refresh.\", extra=log_extra)\n                    break \n\n            client.idle_done()            \n            # F\u00fchre einen erneuten Scan nach UNSEEN-Mails durch, die NICHT gescannt wurden.\n            final_uids = client.search(search_criteria) \n            process_messages(client, final_uids, config)\n            client.logout()\n            \n        except exceptions.IMAPClientError as e:\n            logging.error(\"IMAPClient Error: %s. Reconnecting in 10s.\", e, extra=log_extra)\n            if client:\n                try:\n                    client.close()\n                except:\n                    pass\n            time.sleep(10)\n        except Exception as e:\n            logging.exception(\"Fatal error in main loop: %s. Reconnecting in 10s.\", e, extra=log_extra)\n            if client:\n                try:\n                    client.close()\n                except:\n                    pass\n            time.sleep(10)\n\n# === EINSATZPUNKT (Execution) ===\nif __name__ == '__main__':\n    # 1. Konfiguration laden\n    config_data = load_config(CONFIG_PATH)\n    # 2. und damit die globalen Variablen zuweisen\n    global_config = config_data.get(\"GLOBAL\", {})\n    \n    RSPAMD_CONTAINER = global_config.get(\"RSPAMD_CONTAINER\")\n    SPAM_THRESHOLD = global_config.get(\"SPAM_THRESHOLD\")\n    SPAM_FOLDER = global_config.get(\"SPAM_FOLDER\")\n    IDLE_TIMEOUT = global_config.get(\"IDLE_TIMEOUT\")\n    IDLE_CHECK_INTERVAL = global_config.get(\"IDLE_CHECK_INTERVAL\")\n    LOGFILE = global_config.get(\"LOGFILE\")\n    flag_str = global_config.get(\"PROCESSED_FLAG\", \"RspamdScanned\")\n    PROCESSED_FLAG = flag_str.encode('ascii') \n    ACCOUNTS = config_data.get(\"ACCOUNTS\", &#91;])\n\n    # 3. Logging neu konfigurieren (Jetzt, da LOGFILE bekannt ist)\n    logging.basicConfig(stream=sys.stdout, level=logging.INFO, format='%(asctime)s %(levelname)s &#91;%(user)s] %(message)s', force=True)\n\n    if not ACCOUNTS:\n        logging.critical(\"FATAL: Keine Konten in der Konfigurationsdatei gefunden.\", e, extra={\"user\": \"System\"})\n        sys.exit(1)\n\n\n    # 4. Rspamd URL berechnen\n    try:\n        RSPAMD_URL = \"http:\/\/\" + RSPAMD_CONTAINER + \":11333\/checkv2\"\n    except Exception as e:\n        logging.critical(\"Konnte Rspamd IP nicht ermitteln: %s\", e, extra={\"user\": \"System\"})\n        sys.exit(1)\n        \n    logging.info(\"Starting multi-account IMAP IDLE scanner. Total accounts: %d\", \n                 len(ACCOUNTS), \n                 extra={\"user\": \"System\"}) \n                 \n    # 5. Starte je einen Thread pro Konto\n    with concurrent.futures.ThreadPoolExecutor(max_workers=len(ACCOUNTS)) as executor:\n        executor.map(handle_account, ACCOUNTS)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Einbinden in die Mailcow Umgebung \u00fcber einen zus\u00e4tzlichen Service in der docker-compose.override.yml<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn es noch keine docker-compose.override.yml Datei im Verzeichnis \/opt\/mailcow-dockerized gibt, dann muss diese angelegt werden und mit diesem Inhalt gef\u00fcllt werden:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>services:\n    imap-scanner:\n      image: custom\/imap-scanner:latest \n      build:\n        context: data\/custom\/imap-scanner\/\n        dockerfile: Dockerfile\n      # Neustart bei Fehlern\n      restart: always\n      # Zugriff auf das Mailcow-Netzwerk\n      networks:\n        mailcow-network:\n          # Kein fester Hostname n\u00f6tig\n          aliases:\n            - imap-scanner\n      volumes:\n        # Skript und Konfiguration mounten\n        - .\/data\/custom\/imap-scanner\/imap_rspamd_docker.py:\/app\/imap_rspamd_docker.py:ro\n        - .\/data\/custom\/imap-scanner\/imap_rspamd_config.json:\/etc\/imap_rspamd_config.json:ro\n      # Optional: Feste Ressourcenbegrenzung\n      mem_limit: 128m\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn es schon eine docker-compose.override.yml Datei gibt, dann wird der obige Teil dort unterhalb des Tags &#8222;services:&#8220; eingef\u00fcgt, nat\u00fcrlich ohne das einleitende &#8222;services:&#8220; von oben. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Starten:<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Vor dem ersten start muss der Container gebaut werden mit &#8222;<strong>docker compose build imap-scanner<\/strong>&#8222;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Der Container wird nun bei einem normalen Start der Mailcow mitgestartet. Wenn die Mailcow schon l\u00e4uft kann man ihn mit einem docker compose up -d nachstarten lassen. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mit einem &#8222;<strong>docker logs -f mailcowdockerized-imap-scanner-1<\/strong>&#8220; kann man sich die Logs ausgeben lassen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Meine Mailcow ist ein wunderbares St\u00fcck Software und filtert f\u00fcr alle darauf eingerichteten Konten sehr sch\u00f6n die SPAM heraus. Jetzt habe ich noch einige weitere IMAP Konten von diversen Vereinen, die keinen so guten Spamfilter haben. Da kam mir der Gedanke ob ich nicht die Filterfunktion des Rspamd meiner Mailcow benutzen kann um damit jede\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/\">Read More: Mailcow&#8217;s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu\u2026 &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":307,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[1],"tags":[8,20,18,9,19],"class_list":["post-301","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-allgemein","tag-docker","tag-imap","tag-mailcow","tag-python","tag-spam"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Meine Mailcow ist ein wunderbares St\u00fcck Software und filtert f\u00fcr alle darauf eingerichteten Konten sehr sch\u00f6n die SPAM heraus. Jetzt habe ich noch einige weitere IMAP Konten von diversen Vereinen, die keinen so guten Spamfilter haben. Da kam mir der Gedanke ob ich nicht die Filterfunktion des Rspamd meiner Mailcow benutzen kann um damit jede\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"norbert\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Schmueller - Der Kram, der vielleicht auch wem anderes hilft.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Mailcow\u2019s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern - Schmueller\" \/>\n\t\t<meta property=\"og:description\" content=\"Meine Mailcow ist ein wunderbares St\u00fcck Software und filtert f\u00fcr alle darauf eingerichteten Konten sehr sch\u00f6n die SPAM heraus. Jetzt habe ich noch einige weitere IMAP Konten von diversen Vereinen, die keinen so guten Spamfilter haben. Da kam mir der Gedanke ob ich nicht die Filterfunktion des Rspamd meiner Mailcow benutzen kann um damit jede\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/02\/faultier-1.webp\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/02\/faultier-1.webp\" \/>\n\t\t<meta property=\"og:image:width\" content=\"512\" \/>\n\t\t<meta property=\"og:image:height\" content=\"512\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2025-11-21T15:38:40+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-02-05T10:55:10+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Mailcow\u2019s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern - Schmueller\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Meine Mailcow ist ein wunderbares St\u00fcck Software und filtert f\u00fcr alle darauf eingerichteten Konten sehr sch\u00f6n die SPAM heraus. Jetzt habe ich noch einige weitere IMAP Konten von diversen Vereinen, die keinen so guten Spamfilter haben. Da kam mir der Gedanke ob ich nicht die Filterfunktion des Rspamd meiner Mailcow benutzen kann um damit jede\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/02\/faultier-1.webp\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#blogposting\",\"name\":\"Mailcow\\u2019s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern - Schmueller\",\"headline\":\"Mailcow&#8217;s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern\",\"author\":{\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/author\\\/norbert\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.schmueller.de\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/Mailcow-frisst-Spam.webp\",\"width\":1536,\"height\":640},\"datePublished\":\"2025-11-21T16:38:40+01:00\",\"dateModified\":\"2026-02-05T11:55:10+01:00\",\"inLanguage\":\"de-DE\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#webpage\"},\"articleSection\":\"Allgemein, Docker, IMAP, Mailcow, Python, Spam\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/category\\\/allgemein\\\/#listItem\",\"name\":\"Allgemein\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/category\\\/allgemein\\\/#listItem\",\"position\":2,\"name\":\"Allgemein\",\"item\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/category\\\/allgemein\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#listItem\",\"name\":\"Mailcow&#8217;s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#listItem\",\"position\":3,\"name\":\"Mailcow&#8217;s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/category\\\/allgemein\\\/#listItem\",\"name\":\"Allgemein\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/#organization\",\"name\":\"Schmueller\",\"description\":\"Der Kram, der vielleicht auch wem anderes hilft.\",\"url\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.schmueller.de\\\/wp-content\\\/uploads\\\/2025\\\/02\\\/faultier.webp\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#organizationLogo\",\"width\":512,\"height\":512},\"image\":{\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#organizationLogo\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/author\\\/norbert\\\/#author\",\"url\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/author\\\/norbert\\\/\",\"name\":\"norbert\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#authorImage\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/13bf7e9fd45b6ee7782bee9e0eda976268b9bbe975fdf2d946e4d0b7f5d2a809?s=96&d=mm&r=g\",\"width\":96,\"height\":96,\"caption\":\"norbert\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#webpage\",\"url\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/\",\"name\":\"Mailcow\\u2019s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern - Schmueller\",\"description\":\"Meine Mailcow ist ein wunderbares St\\u00fcck Software und filtert f\\u00fcr alle darauf eingerichteten Konten sehr sch\\u00f6n die SPAM heraus. Jetzt habe ich noch einige weitere IMAP Konten von diversen Vereinen, die keinen so guten Spamfilter haben. Da kam mir der Gedanke ob ich nicht die Filterfunktion des Rspamd meiner Mailcow benutzen kann um damit jede\",\"inLanguage\":\"de-DE\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/author\\\/norbert\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/author\\\/norbert\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.schmueller.de\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/Mailcow-frisst-Spam.webp\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#mainImage\",\"width\":1536,\"height\":640},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/2025\\\/11\\\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\\\/#mainImage\"},\"datePublished\":\"2025-11-21T16:38:40+01:00\",\"dateModified\":\"2026-02-05T11:55:10+01:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/#website\",\"url\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/\",\"name\":\"Schmueller\",\"description\":\"Der Kram, der vielleicht auch wem anderes hilft.\",\"inLanguage\":\"de-DE\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.schmueller.de\\\/ZDDTpknFI0r7\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Mailcow\u2019s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern - Schmueller","description":"Meine Mailcow ist ein wunderbares St\u00fcck Software und filtert f\u00fcr alle darauf eingerichteten Konten sehr sch\u00f6n die SPAM heraus. Jetzt habe ich noch einige weitere IMAP Konten von diversen Vereinen, die keinen so guten Spamfilter haben. Da kam mir der Gedanke ob ich nicht die Filterfunktion des Rspamd meiner Mailcow benutzen kann um damit jede","canonical_url":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#blogposting","name":"Mailcow\u2019s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern - Schmueller","headline":"Mailcow&#8217;s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern","author":{"@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/author\/norbert\/#author"},"publisher":{"@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/11\/Mailcow-frisst-Spam.webp","width":1536,"height":640},"datePublished":"2025-11-21T16:38:40+01:00","dateModified":"2026-02-05T11:55:10+01:00","inLanguage":"de-DE","mainEntityOfPage":{"@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#webpage"},"isPartOf":{"@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#webpage"},"articleSection":"Allgemein, Docker, IMAP, Mailcow, Python, Spam"},{"@type":"BreadcrumbList","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7#listItem","position":1,"name":"Home","item":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7","nextItem":{"@type":"ListItem","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/category\/allgemein\/#listItem","name":"Allgemein"}},{"@type":"ListItem","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/category\/allgemein\/#listItem","position":2,"name":"Allgemein","item":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/category\/allgemein\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#listItem","name":"Mailcow&#8217;s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#listItem","position":3,"name":"Mailcow&#8217;s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern","previousItem":{"@type":"ListItem","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/category\/allgemein\/#listItem","name":"Allgemein"}}]},{"@type":"Organization","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/#organization","name":"Schmueller","description":"Der Kram, der vielleicht auch wem anderes hilft.","url":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/","logo":{"@type":"ImageObject","url":"https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/02\/faultier.webp","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#organizationLogo","width":512,"height":512},"image":{"@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#organizationLogo"}},{"@type":"Person","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/author\/norbert\/#author","url":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/author\/norbert\/","name":"norbert","image":{"@type":"ImageObject","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/13bf7e9fd45b6ee7782bee9e0eda976268b9bbe975fdf2d946e4d0b7f5d2a809?s=96&d=mm&r=g","width":96,"height":96,"caption":"norbert"}},{"@type":"WebPage","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#webpage","url":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/","name":"Mailcow\u2019s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern - Schmueller","description":"Meine Mailcow ist ein wunderbares St\u00fcck Software und filtert f\u00fcr alle darauf eingerichteten Konten sehr sch\u00f6n die SPAM heraus. Jetzt habe ich noch einige weitere IMAP Konten von diversen Vereinen, die keinen so guten Spamfilter haben. Da kam mir der Gedanke ob ich nicht die Filterfunktion des Rspamd meiner Mailcow benutzen kann um damit jede","inLanguage":"de-DE","isPartOf":{"@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/#website"},"breadcrumb":{"@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#breadcrumblist"},"author":{"@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/author\/norbert\/#author"},"creator":{"@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/author\/norbert\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/11\/Mailcow-frisst-Spam.webp","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#mainImage","width":1536,"height":640},"primaryImageOfPage":{"@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/#mainImage"},"datePublished":"2025-11-21T16:38:40+01:00","dateModified":"2026-02-05T11:55:10+01:00"},{"@type":"WebSite","@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/#website","url":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/","name":"Schmueller","description":"Der Kram, der vielleicht auch wem anderes hilft.","inLanguage":"de-DE","publisher":{"@id":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/#organization"}}]},"og:locale":"de_DE","og:site_name":"Schmueller - Der Kram, der vielleicht auch wem anderes hilft.","og:type":"article","og:title":"Mailcow\u2019s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern - Schmueller","og:description":"Meine Mailcow ist ein wunderbares St\u00fcck Software und filtert f\u00fcr alle darauf eingerichteten Konten sehr sch\u00f6n die SPAM heraus. Jetzt habe ich noch einige weitere IMAP Konten von diversen Vereinen, die keinen so guten Spamfilter haben. Da kam mir der Gedanke ob ich nicht die Filterfunktion des Rspamd meiner Mailcow benutzen kann um damit jede","og:url":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/","og:image":"https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/02\/faultier-1.webp","og:image:secure_url":"https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/02\/faultier-1.webp","og:image:width":512,"og:image:height":512,"article:published_time":"2025-11-21T15:38:40+00:00","article:modified_time":"2026-02-05T10:55:10+00:00","twitter:card":"summary_large_image","twitter:title":"Mailcow\u2019s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern - Schmueller","twitter:description":"Meine Mailcow ist ein wunderbares St\u00fcck Software und filtert f\u00fcr alle darauf eingerichteten Konten sehr sch\u00f6n die SPAM heraus. Jetzt habe ich noch einige weitere IMAP Konten von diversen Vereinen, die keinen so guten Spamfilter haben. Da kam mir der Gedanke ob ich nicht die Filterfunktion des Rspamd meiner Mailcow benutzen kann um damit jede","twitter:image":"https:\/\/www.schmueller.de\/wp-content\/uploads\/2025\/02\/faultier-1.webp"},"aioseo_meta_data":{"post_id":"301","title":null,"description":null,"keywords":null,"keyphrases":{"focus":[],"additional":[]},"focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_image_url":null,"twitter_title":null,"twitter_description":null,"schema_type":"default","schema_type_options":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null,"created":"2026-09-15 21:40:56","updated":"2026-09-15 21:45:47"},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/category\/allgemein\/\" title=\"Allgemein\">Allgemein<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tMailcow\u2019s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7"},{"label":"Allgemein","link":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/category\/allgemein\/"},{"label":"Mailcow&#8217;s Rspamd nutzen um in beliebigen IMAP-Mailkonten die Spam zu filtern","link":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/2025\/11\/mailcow-rspamd-nutzen-um-spamfilterung-fuer-beliebige-imap-mailkonten-durchzufuehren\/"}],"_links":{"self":[{"href":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/wp-json\/wp\/v2\/posts\/301","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/wp-json\/wp\/v2\/comments?post=301"}],"version-history":[{"count":3,"href":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/wp-json\/wp\/v2\/posts\/301\/revisions"}],"predecessor-version":[{"id":322,"href":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/wp-json\/wp\/v2\/posts\/301\/revisions\/322"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/wp-json\/wp\/v2\/media\/307"}],"wp:attachment":[{"href":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/wp-json\/wp\/v2\/media?parent=301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/wp-json\/wp\/v2\/categories?post=301"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.schmueller.de\/ZDDTpknFI0r7\/wp-json\/wp\/v2\/tags?post=301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}