Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung E-Mail / Mailserver 15.06.2026 · 9 min Lesezeit

Kompletten Mailserver nativ aufsetzen: Postfix, Dovecot und Rspamd ohne Docker

Vollständiger SMTP/IMAP-Mailserver mit modernem Spamfilter direkt auf Ubuntu oder Debian: Postfix, Dovecot und Rspamd als native systemd-Dienste, virtuelle Postfächer in MySQL, DKIM und Sieve-Spamsortierung, ohne Docker.

Geprüft am 29.09.2026

WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Mehr dazu

Rack-Server im Rechenzentrum mit einem Stapel unbeschrifteter Briefumschläge auf dem Gehäuse, Sinnbild für einen selbst betriebenen Mailserver

Statt Docker-Stacks wie Mailcow (Konfiguration tief in Volumes) installiert diese Anleitung installiert Postfix, Dovecot und Rspamd stattdessen als native systemd-Dienste mit allen Konfigurationsdateien unter /etc/: volle Kontrolle, direktes Troubleshooting, minimaler Overhead.

Voraussetzungen

  1. Ubuntu 22.04/24.04 LTS oder Debian 12 (Bookworm), frisch installiert. Die Konfiguration nutzt Dovecot-2.3-Syntax; Debian 13 und Ubuntu 26.04 liefern Dovecot 2.4 mit geänderten Einstellungsnamen, dort passen die Dovecot-Abschnitte nicht unverändert. Debian 11 unterstützt das Rspamd-Repository nicht mehr.
  2. Server oder VPS mit statischer IPv4; Reverse-DNS/PTR auf mail.example.org
  3. Eigene Domain mit DNS-Zugriff (MX, TXT, CNAME)
  4. Mindestens 1 GB RAM (empfohlen 2 GB+) für Rspamd, Redis, Dovecot und Postfix
  5. Port 25 vom Hoster nicht gesperrt (bei vielen günstigen VPS Standard, vorher prüfen)
  6. Root- oder sudo-Zugang per SSH, Linux-Grundkenntnisse
  7. Gültige E-Mail-Adresse für Let's-Encrypt-Benachrichtigungen
  8. MySQL oder MariaDB installiert und gesichert (virtuelle Mailbox-Datenbank)

Schritt 1: Pakete installieren

Pakete installieren. Rspamd kommt nicht aus Ubuntu-Universe (oft veraltet), sondern aus dem offiziellen Rspamd-APT-Repository:

sudo apt update && sudo apt install -y \
  postfix postfix-mysql \
  dovecot-core dovecot-imapd dovecot-lmtpd dovecot-mysql dovecot-sieve dovecot-managesieved \
  redis-server certbot

# Rspamd offizielles Repository einbinden (Ubuntu 22.04/24.04, Debian 12)
sudo mkdir -p /etc/apt/keyrings
wget -O- https://rspamd.com/apt-stable/gpg.key | gpg --dearmor | \
  sudo tee /etc/apt/keyrings/rspamd.gpg > /dev/null

echo "deb [signed-by=/etc/apt/keyrings/rspamd.gpg] http://rspamd.com/apt-stable/ $(lsb_release -cs) main" | \
  sudo tee /etc/apt/sources.list.d/rspamd.list

sudo apt update && sudo apt install -y rspamd

Bei der Postfix-Installation Typ „Internet-Site“ wählen und den vollständigen Hostnamen (mail.example.org) eintragen.

Verifizieren: postfix --version, dovecot --version und rspamd --version geben die installierten Versionen aus. Rspamd sollte mindestens Version 3.x zeigen.

Schritt 2: TLS-Zertifikat und vmail-Benutzer anlegen

TLS-Zertifikat per Certbot von Let's Encrypt; Port 80 muss für die Challenge erreichbar sein:

sudo certbot certonly --standalone -d mail.example.org

Systembenutzer für virtuelle Mailboxen; alle Mails liegen unter /var/mail/vhosts/ und gehören ihm:

sudo groupadd -g 5000 vmail
sudo useradd -g vmail -u 5000 vmail -d /var/mail
sudo mkdir -p /var/mail/vhosts/example.org
sudo chown -R vmail:vmail /var/mail

Post-Renewal-Hook, damit Postfix und Dovecot nach der Zertifikatserneuerung neu laden und nicht mit dem alten Zertifikat weiterlaufen:

sudo tee /etc/letsencrypt/renewal-hooks/post/reload-mail.sh <<'EOF'
#!/bin/bash
systemctl reload postfix dovecot
EOF
sudo chmod +x /etc/letsencrypt/renewal-hooks/post/reload-mail.sh

Verifizieren: ls /etc/letsencrypt/live/mail.example.org/ zeigt fullchain.pem und privkey.pem.

Schritt 3: Postfix konfigurieren

Zentrale Konfiguration: /etc/postfix/main.cf; example.org durchgängig durch Ihre Domain ersetzen:

# /etc/postfix/main.cf – Kernkonfiguration
myhostname = mail.example.org
mydomain = example.org
myorigin = $mydomain
inet_interfaces = all
mydestination =

# Virtuelle Mailboxen per MySQL
virtual_mailbox_domains = mysql:/etc/postfix/mysql-mailbox-domains.cf
virtual_mailbox_maps    = mysql:/etc/postfix/mysql-mailbox-maps.cf
virtual_alias_maps      = mysql:/etc/postfix/mysql-alias-maps.cf
virtual_transport       = lmtp:unix:private/dovecot-lmtp

# TLS
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.org/fullchain.pem
smtpd_tls_key_file  = /etc/letsencrypt/live/mail.example.org/privkey.pem
smtpd_tls_security_level = may
smtp_tls_security_level  = may

# SASL-Authentifizierung via Dovecot
smtpd_sasl_type             = dovecot
smtpd_sasl_path             = private/auth
smtpd_sasl_auth_enable      = yes
smtpd_sasl_security_options = noanonymous
recipient_delimiter         = +

# Rspamd als Milter einbinden
smtpd_milters        = inet:localhost:11332
non_smtpd_milters    = $smtpd_milters
milter_default_action = accept
milter_protocol      = 6

Wichtig: mydestination bleibt leer oder enthält nur localhost. Virtuelle Domains dort stellt Postfix lokal zu statt über die MySQL-Maps.

Für Port 587 ergänzen Sie in /etc/postfix/master.cf diese Sektion (submission steht oft auskommentiert bereit). Port 465 aktivieren Sie analog über den Block smtps, zusätzlich mit -o smtpd_tls_wrappermode=yes:

# /etc/postfix/master.cf – Submission Port 587
submission inet n - y - - smtpd
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject

Verifizieren: sudo postfix check darf keine Fehler ausgeben.

Schritt 4: MySQL-Lookup-Maps anlegen

Postfix fragt Domains, Benutzer und Aliase aus MySQL ab. Datenbank, Lesebenutzer und drei Tabellen in sudo mysql anlegen:

CREATE DATABASE mailserver;
CREATE USER 'mailuser'@'127.0.0.1' IDENTIFIED BY 'sicheres_passwort';
GRANT SELECT ON mailserver.* TO 'mailuser'@'127.0.0.1';
USE mailserver;
CREATE TABLE virtual_domains (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL UNIQUE);
CREATE TABLE virtual_users (id INT AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, maildir VARCHAR(255) NOT NULL);
CREATE TABLE virtual_aliases (id INT AUTO_INCREMENT PRIMARY KEY, source VARCHAR(255) NOT NULL, destination VARCHAR(255) NOT NULL);
INSERT INTO virtual_domains (name) VALUES ('example.org');

Die drei Lookup-Dateien für Postfix:

# /etc/postfix/mysql-mailbox-domains.cf
user     = mailuser
password = sicheres_passwort
hosts    = 127.0.0.1
dbname   = mailserver
query    = SELECT 1 FROM virtual_domains WHERE name='%s'
# /etc/postfix/mysql-mailbox-maps.cf
user     = mailuser
password = sicheres_passwort
hosts    = 127.0.0.1
dbname   = mailserver
query    = SELECT maildir FROM virtual_users WHERE email='%s'
# /etc/postfix/mysql-alias-maps.cf
user     = mailuser
password = sicheres_passwort
hosts    = 127.0.0.1
dbname   = mailserver
query    = SELECT destination FROM virtual_aliases WHERE source='%s'
sudo chmod 640 /etc/postfix/mysql-*.cf
sudo chown root:postfix /etc/postfix/mysql-*.cf

Verifizieren: Sobald ein Domain-Eintrag in der Datenbank vorhanden ist, liefert postmap -q example.org mysql:/etc/postfix/mysql-mailbox-domains.cf den Wert 1 zurück.

Schritt 5: Dovecot konfigurieren

Dovecot nimmt Nachrichten per LMTP von Postfix an, speichert sie als Maildir und liefert sie per IMAPS aus:

# /etc/dovecot/conf.d/10-mail.conf
mail_location        = maildir:/var/mail/vhosts/%d/%n/
mail_privileged_group = mail
# /etc/dovecot/conf.d/10-ssl.conf
ssl      = required
ssl_cert = </etc/letsencrypt/live/mail.example.org/fullchain.pem
ssl_key  = </etc/letsencrypt/live/mail.example.org/privkey.pem

/etc/dovecot/conf.d/10-master.conf definiert die Unix-Sockets für Postfix; falsche Berechtigungen verhindern die Zustellung:

# /etc/dovecot/conf.d/10-master.conf – LMTP- und Auth-Socket
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode  = 0600
    user  = postfix
    group = postfix
  }
}

service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode  = 0660
    user  = postfix
    group = postfix
  }
}

# Unverschlüsseltes IMAP auf Port 143 deaktivieren
service imap-login {
  inet_listener imap {
    port = 0
  }
}

SQL-Authentifizierung: In /etc/dovecot/conf.d/10-auth.conf !include auth-system.conf.ext auskommentieren, !include auth-sql.conf.ext aktivieren und auth_mechanisms = plain login setzen. Zugangsdaten und Abfragen in /etc/dovecot/dovecot-sql.conf.ext:

# /etc/dovecot/dovecot-sql.conf.ext
driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=mailuser password=sicheres_passwort
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email AS user, password FROM virtual_users WHERE email='%u'
user_query = SELECT 5000 AS uid, 5000 AS gid, '/var/mail/vhosts/%d/%n' AS home FROM virtual_users WHERE email='%u'

Postfach anlegen: Hash mit doveadm pw -s SHA512-CRYPT erzeugen und eintragen, z. B. INSERT INTO virtual_users (email, password, maildir) VALUES ('max@example.org', '{SHA512-CRYPT}$6$…', 'example.org/max/');. Dazu sudo chmod 640 /etc/dovecot/dovecot-sql.conf.ext.

Verifizieren: sudo doveconf -n zeigt die aktive Konfiguration ohne Fehlermeldung, und sudo doveadm auth test max@example.org meldet nach Eingabe des Passworts auth succeeded.

Schritt 6: Rspamd und Redis konfigurieren

Rspamd-Konfigurationen gehören ausschließlich nach /etc/rspamd/local.d/ oder /etc/rspamd/override.d/; Dateien direkt in /etc/rspamd/ überschreibt jedes Paket-Update.

Milter-Konfiguration für die Übergabe von Postfix an Rspamd:

# /etc/rspamd/local.d/worker-proxy.inc
milter  = yes;
timeout = 120s;
upstream "local" {
  default   = yes;
  self_scan = yes;
}
# /etc/rspamd/local.d/redis.conf
servers = "127.0.0.1:6379";
# /etc/rspamd/local.d/actions.conf
reject     = 15;
add_header = 6;
greylist   = 4;

Redis auf localhost binden und Speicher begrenzen:

# /etc/redis/redis.conf – relevante Zeilen anpassen
bind 127.0.0.1
maxmemory 500mb
maxmemory-policy volatile-ttl

Passwort-Hash für das Web-UI (Port 11334) erzeugen:

rspamadm pw

Hash in /etc/rspamd/local.d/worker-controller.inc eintragen:

# /etc/rspamd/local.d/worker-controller.inc
password = "$2$<generierter-hash>";

Verifizieren: sudo rspamadm configtest muss mit syntax OK abschließen.

Schritt 7: DKIM-Schlüssel generieren und DNS-Records setzen

Rspamd signiert ausgehende Mails mit DKIM. Der private Schlüssel unter /var/lib/rspamd/dkim/ muss dem Rspamd-Benutzer gehören:

sudo mkdir -p /var/lib/rspamd/dkim
sudo rspamadm dkim_keygen -s mail -d example.org \
  -k /var/lib/rspamd/dkim/example.org.mail.key
sudo chown _rspamd /var/lib/rspamd/dkim/example.org.mail.key
sudo chmod 400 /var/lib/rspamd/dkim/example.org.mail.key

Öffentlichen Schlüssel als TXT-Record unter mail._domainkey.example.org veröffentlichen, dann DKIM-Signing aktivieren:

# /etc/rspamd/local.d/dkim_signing.conf
domain {
  example.org {
    path     = "/var/lib/rspamd/dkim/example.org.mail.key";
    selector = "mail";
  }
}

Je Maildomain vier DNS-Records:

Record-TypNameWert (Beispiel)
MXexample.org10 mail.example.org
TXT (SPF)example.orgv=spf1 mx ~all
TXT (DKIM)mail._domainkey.example.orgv=DKIM1; k=rsa; p=<öffentlicher Schlüssel>
TXT (DMARC)_dmarc.example.orgv=DMARC1; p=none; rua=mailto:dmarc@example.org

DMARC startet bewusst mit p=none; erst wenn die Reports zeigen, dass alle legitimen Absender SPF und DKIM bestehen, auf quarantine und später reject wechseln.

Verifizieren: dig TXT mail._domainkey.example.org gibt den DKIM-Schlüssel zurück. dig TXT example.org zeigt den SPF-Record.

Schritt 8: Dovecot Sieve-Spamfilter einrichten

Rspamd setzt auf Spam den Header X-Spam: Yes; ein globales Sieve-Skript sortiert diese Mails in den Junk-Ordner. Skript anlegen und kompilieren:

sudo mkdir -p /var/mail/vhosts/sieve
sudo tee /var/mail/vhosts/sieve/global.sieve <<'EOF'
require ["fileinto", "mailbox"];
if header :is "X-Spam" "Yes" {
    fileinto :create "Junk";
}
EOF
sudo sievec /var/mail/vhosts/sieve/global.sieve
sudo chown -R vmail:vmail /var/mail/vhosts/sieve

Als sieve_before einbinden (läuft vor Benutzerskripten) und das Sieve-Plugin für LMTP aktivieren; sieve_global_path ist veraltet:

# /etc/dovecot/conf.d/90-sieve.conf (im Block plugin { … })
sieve_before = /var/mail/vhosts/sieve/global.sieve
# /etc/dovecot/conf.d/20-lmtp.conf
protocol lmtp {
  mail_plugins = $mail_plugins sieve
}

Verifizieren: sudo doveconf -n | grep -E 'sieve_before|mail_plugins' zeigt beide Einträge, und neben dem Skript liegt die kompilierte Datei global.svbin.

Schritt 9: Alle Dienste starten und aktivieren

Alle vier systemd-Units für Start und Reboot aktivieren:

sudo systemctl enable --now redis-server rspamd postfix dovecot

Verifizieren: sudo systemctl status postfix dovecot rspamd redis-server sollte alle vier Dienste als active (running) zeigen. Mit ss -tlnp | grep -E '25|587|993|11332|6379' lässt sich prüfen, ob alle Ports lauschen.

Ports und Konfigurationsdateien im Überblick

DienstPortProtokollZweckKonfigurationsdatei
Postfix SMTP25TCPEingehende Mail von anderen MTAs/etc/postfix/master.cf
Postfix Submission587TCP+STARTTLSAuthentifizierte Client-Einlieferung/etc/postfix/master.cf
Postfix SMTPS465TCP+SSL/TLSAlternativer Client-Einlieferungsport (optional, Block smtps)/etc/postfix/master.cf
Dovecot IMAPS993TCP+SSL/TLSIMAP für Mail-Clients/etc/dovecot/conf.d/10-master.conf
Dovecot LMTPUnix-SocketIPCZustellung Postfix → Dovecot/etc/dovecot/conf.d/10-master.conf
Rspamd Milter11332TCPPostfix-Milter-Anbindung/etc/rspamd/local.d/worker-proxy.inc
Rspamd Web-UI11334TCPAdministrations-Webinterface/etc/rspamd/local.d/worker-controller.inc
Redis6379TCPRspamd-Statistik-Backend/etc/redis/redis.conf

Troubleshooting / Typische Fehler

Häufige Fallstricke:

  1. Postfix übergibt keine Mails an Dovecot: LMTP-Socket /var/spool/postfix/private/dovecot-lmtp braucht mode=0600, user=postfix, group=postfix. Mit ls -la /var/spool/postfix/private/ prüfen, ggf. dovecot neu starten.
  2. Mails werden bei Rspamd-Ausfall abgelehnt: milter_default_action = accept in main.cf fehlt; ohne sie lehnt Postfix jede Mail ab, solange der Milter nicht erreichbar ist.
  3. Redis von außen erreichbar: kritisches Sicherheitsrisiko. /etc/redis/redis.conf braucht bind 127.0.0.1; prüfen mit ss -tlnp | grep 6379.
  4. Rspamd-Konfiguration nach Update weg: lag direkt in /etc/rspamd/ statt local.d//override.d/ (Schritt 6).
  5. Virtuelle Domain in mydestination: nur localhost und Hostname eintragen (Schritt 3).
  6. DKIM-Schlüssel nicht lesbar: sudo chown _rspamd /var/lib/rspamd/dkim/example.org.mail.key.
  7. Ausgehende Mails landen im Spam: SPF, DKIM und DMARC vor dem Produktivstart eintragen; prüfen mit dig TXT mail._domainkey.example.org und dig TXT _dmarc.example.org.
  8. Bayes trifft nichts: Rspamd ist untrainiert. Mindestens 200 Spam- und 200 Ham-Nachrichten mit rspamc learn_spam /path/to/spam.eml und rspamc learn_ham /path/to/ham.eml einlernen.
  9. TLS-Zertifikat nach Renewal abgelaufen: Post-Renewal-Hook aus Schritt 2 fehlt; einrichten und mit certbot renew --dry-run testen.

Häufige Fragen

Warum Rspamd statt SpamAssassin?

Rspamd ist ereignisgesteuert und bei hohem Aufkommen deutlich schneller als SpamAssassin. DKIM-Signing, Web-UI (Port 11334), Redis-gestütztes Bayes, Greylisting und Ratelimiting stecken in einem Daemon; SpamAssassin braucht für DKIM separate Werkzeuge.

Kann Postfix ohne Konflikte mit anderen Diensten auf demselben Server laufen?

Ja, alle drei laufen als eigenständige systemd-Services. Vorher Portkonflikte auf 25, 587 und 993 prüfen und ein vorhandenes sendmail entfernen: sudo apt remove sendmail.

Was ist der Unterschied zwischen local.d/ und override.d/ in Rspamd?

local.d/ wird mit der Standardkonfiguration zusammengeführt, override.d/ ersetzt sie vollständig. Meist ist local.d/ richtig.

Wie lernt Rspamd automatisch Spam und Ham?

Über das zusätzlich einzurichtende Dovecot-IMAPSieve-Plugin: Verschieben in Junk lernt Spam, Herausschieben Ham. Alternativ manuell per rspamc learn_spam /pfad/zur/mail.eml.

Wie sichere ich das Rspamd-Web-UI ab?

Port 11334 per Firewall (ufw oder nftables) nur lokal oder per VPN freigeben, Passwort-Hash per rspamadm pw in worker-controller.inc (Schritt 6). Empfehlenswert ist ein Nginx Reverse-Proxy mit HTTPS und HTTP-Basic-Auth davor.

Wie prüfe ich, ob Rspamd Mails korrekt filtert?

rspamc symbols < testmail.eml zeigt alle ausgelösten Regeln; die Web-UI zeigt Statistiken, Scores und Logs. rspamadm configwizard ist ein interaktiver Assistent für Redis, DKIM und Bayes.

Fazit

Diagnose läuft direkt über journalctl -u postfix und rspamadm configtest. Kritisch: DNS-Records vor dem Produktivstart, Rspamd nur über local.d/, Redis auf localhost, Bayes vor echtem Mailverkehr trainieren.

Weiterführende Anleitungen und Quellen

  1. Mailcow komplett aufsetzen – eigener Mailserver mit Docker – der Docker-basierte Weg als Vergleich
  2. OpenDKIM mit Postfix einrichten: DKIM-Signatur korrekt konfigurieren – alternative DKIM-Lösung ohne Rspamd
  3. DMARC-Reports verstehen und auswerten: von p=none sicher zu p=reject – nächster Schritt nach dem Mailserver-Setup
  4. Reverse DNS (PTR) und IPv6 für Mailserver korrekt einrichten – Pflicht für gute Zustellbarkeit
  5. VPS absichern und härten: UFW, SSH-Keys und Fail2Ban – sichere Grundlage für jeden selbstgehosteten Server
  6. Rspamd: offizielle Dokumentation, Quick Start
  7. Dovecot 2.3: LMTP-Zustellung mit Postfix