Mailcow auf VPS: E-Mails, die Gmail annimmt
Prüfen Sie Port 25 vor der Installation: Eine Sperre hält E-Mails bis zum Bounce in der Warteschlange. Mit passendem DNS vermeiden Sie Gmail-Fehler 550 5.7.25 wegen PTR.
Was Sie erstellen
Sie erstellen einen vollständigen Mailserver auf einem Server, den Sie selbst besitzen: SMTP zum Senden und Empfangen, IMAP für die Synchronisierung von Smartphone und Laptop, einen Webmail-Client und einen Spamfilter, der jede Nachricht in beide Richtungen bewertet. mailcow-dockerized bündelt Postfix, Dovecot, Rspamd, SOGo webmail, MariaDB, Redis und einen ACME-Client in einem Docker-Compose-Stack. Die Software selbst ist daher nicht der schwierige Teil. Der Server läuft innerhalb einer halben Stunde.
Schwierig ist alles, was damit zusammenhängt. Bei E-Mail misstraut der übrige Teil des Internets einem neuen Server aktiv. Der Unterschied zwischen „es funktioniert“ und „Gmail verschluckt jede Nachricht stillschweigend“ hängt hauptsächlich von vier DNS-Einträgen und einer Einstellung für die IP-Reputation ab, die Sie möglicherweise nicht vollständig kontrollieren können. Lesen Sie die folgenden Voraussetzungen, bevor Sie etwas mieten. Wenn Sie danach entscheiden, dass sich der Aufbau der Reputation nicht lohnt, ist das eine berechtigte Entscheidung. Unsere Übersicht darüber, was sich im Jahr 2026 tatsächlich für das Self-Hosting lohnt ordnet E-Mail aus genau diesen Gründen unter „nur, wenn Sie es ernst meinen“ ein.
Die Voraussetzungen SIND das Projekt
Wenn nur eine dieser Voraussetzungen fehlt, versenden Sie E-Mails, die nie ankommen. Grob nach der Häufigkeit geordnet, scheitern die meisten Installationen an Folgendem:
Der ausgehende Port 25 muss geöffnet sein. Ihr Server stellt E-Mails über TCP-Port 25 an Gmail und Microsoft zu. Viele VPS- und Cloud-Anbieter blockieren ausgehende Verbindungen auf Port 25 standardmäßig, um Spam zu bekämpfen. Die Sperre bleibt oft unbemerkt: Beim Booten treten keine Fehler auf, alles scheint ordnungsgemäß zu funktionieren, und die E-Mails bleiben in der Warteschlange zurückgestellt, bis Postfix nach Ablauf der maximalen Wartedauer einen Bounce erzeugt (mailcow setzt die maximale Lebensdauer der Warteschlange auf fünf Tage). Testen Sie dies, bevor Sie etwas installieren. Wenn der Port blockiert ist, hilft nur ein Support-Ticket mit der Bitte, ihn freizugeben. Einige Anbieter tun dies bei älteren Konten, andere grundsätzlich nicht.
Eine saubere IP-Adresse mit brauchbarer Reputation. Wiederverwendete VPS-IP-Adressen stehen aufgrund von Spam des vorherigen Mieters häufig bereits auf Blocklisten. Prüfen Sie Ihre Adresse vor der Entscheidung beispielsweise mit der Spamhaus-Abfrage oder mxtoolbox. Eine gelistete IP-Adresse führt zu Ablehnungen, die Sie nicht durch Konfigurationsänderungen umgehen können.
Kontrolle über DNS sowie ein korrekt gesetzter PTR-Eintrag. Sie müssen Einträge in der Zone Ihrer Domain anlegen. Außerdem benötigen Sie Reverse DNS (PTR) für die IP-Adresse des Servers, das auf den Mail-Hostnamen zurückzeigt. Der PTR-Eintrag wird fast nie in Ihrem DNS-Panel gesetzt. Er wird von dem Anbieter verwaltet, dem die IP-Adresse gehört, und daher im Control Panel Ihres VPS-Anbieters oder per Support-Ticket konfiguriert.
6 GiB RAM und 2 vCPU sind eine komfortable Untergrenze. Die mailcow-eigene Mindestanforderung für eine private Installation beträgt 6 GiB RAM plus 1 GiB Swap. Sobald einige Benutzer darauf angewiesen sind, werden 8 GiB empfohlen. Bei weniger als etwa 2.5 GiB bietet generate_config.sh an, den ClamAV-Virenscanner zu deaktivieren, damit der Kernel nicht beginnt, Container zu beenden. Die dokumentierte Mindestgröße der Festplatte für mailcow beträgt 20 GiB, bevor E-Mails gespeichert werden. Stellen Sie daher zum Start mehr Speicher bereit und lassen Sie Platz für wachsende Mailboxen.
Ein DNS-Name, keine bloße IP-Adresse. Wählen Sie einen Hostnamen wie mail.example.com. Dieser eine Name wird zu Ihrem MAILCOW_HOSTNAME, zum Betreff Ihres TLS-Zertifikats, zum Ziel Ihres PTR-Eintrags und zum SMTP-Banner. Verwenden Sie überall denselben Namen.
Schritt 1: Prüfen, ob der ausgehende Port 25 geöffnet ist
Führen Sie diesen Schritt zuerst aus. Wenn er fehlschlägt, sind alle weiteren Schritte vergeblich. Versuchen Sie auf dem neuen VPS, eine SMTP-Verbindung zu einem echten Mailserver herzustellen:
sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 gmail-smtp-in.l.google.com 25Bei einer funktionierenden Verbindung wird das Ergebnis sofort angezeigt:
Connection to gmail-smtp-in.l.google.com (142.250.x.x) 25 port [tcp/smtp] succeeded!Ein gesperrter Port wartet die vollen fünf Sekunden und schlägt anschließend fehl:
nc: connect to gmail-smtp-in.l.google.com port 25 (tcp) timed out: Operation now in progressAuf einem neuen VPS ohne eigene Regeln für die ausgehende Firewall weist dieses Timeout auf eine Sperre durch den Provider hin. Es handelt sich um einen netzwerkseitigen Filter beim Provider, nicht um Ihre lokale Firewall. Keine lokale Änderung kann das beheben. Erstellen Sie ein Ticket mit folgendem Text: „Please enable outbound TCP port 25 for my VPS at <IP>; I am running a legitimate mail server.“ Installieren Sie mailcow erst, wenn dieser Test „succeeded“ zurückgibt. Beachten Sie, dass eingehender Port 25, also Verbindungen anderer Server zu Ihrem Server, ein separater Pfad ist und normalerweise geöffnet bleibt. Provider drosseln in der Regel die ausgehende Seite.
Schritt 2: DNS-Einträge jetzt setzen
DNS-Änderungen benötigen Zeit für die Verteilung. Veröffentlichen Sie daher vor der Installation alles, was möglich ist. Nehmen Sie an, Ihre Domain ist example.com, Ihr Mail-Host ist mail.example.com und die IP-Adresse ist 10.0.0.10. Erstellen Sie in Ihrer Zone:
mail.example.com. A 10.0.0.10
mail.example.com. AAAA 2001:db8::10 ; only if you have IPv6
example.com. MX 10 mail.example.com.
example.com. TXT "v=spf1 mx -all"
_dmarc.example.com. TXT "v=DMARC1; p=none; rua=mailto:postmaster@example.com"Der SPF-Eintrag bedeutet: „Nur mein MX darf für diese Domain senden, alle anderen werden abgewiesen.“ Setzen Sie DMARC zunächst auf p=none, damit Sie die Reports überwachen können, ohne Ihre eigenen E-Mails abzuweisen. Verschärfen Sie die Richtlinie auf p=quarantine und anschließend auf p=reject, sobald die Ausrichtung bestätigt ist. Zwei Einträge fehlen absichtlich noch: DKIM, das mailcow in Schritt 6 für Sie erzeugt, und PTR, den Sie jetzt im Panel Ihres Providers setzen.
Setzen Sie den PTR-Eintrag (Reverse DNS) für 10.0.0.10 auf mail.example.com, also auf den exakten Wert MAILCOW_HOSTNAME. Dies ist der einzelne Eintrag, den die meisten Benutzer vergessen. Große Provider lehnen E-Mails ohne passenden PTR-Eintrag ab. Wenn Ihr Panel kein Feld für rDNS enthält, eröffnen Sie ein Support-Ticket.
Schritt 3: Docker installieren
mailcow benötigt Docker Engine 24.0 oder neuer und Docker Compose 2.0 oder neuer. Das Compose-Plugin (docker compose) ist der einfachste Weg. mailcow unterstützt jedoch auch die eigenständige docker-compose-Binärdatei. Verwenden Sie das offizielle Convenience-Skript von Docker statt des Ubuntu-Pakets docker.io. Dieses enthält überhaupt kein Compose-Plugin:
curl -fsSL https://get.docker.com | sudo sh
sudo docker compose versionDie Ausgabe sollte eine Docker Compose version-Zeile mit v2.x oder v5.x enthalten. Compose v5 wurde 2025 veröffentlicht, ist funktional identisch mit v2, und beide Versionen erfüllen die Anforderungen von mailcow. Wenn docker compose version den Wert docker: 'compose' is not a docker command ausgibt, ist Docker Engine installiert, aber das Compose-Plugin fehlt. Installieren Sie das Plugin aus dem Docker-Repository, führen Sie das Skript oben erneut aus oder folgen Sie unserem Grundlagenleitfaden zu Docker Compose. Dieser richtet beide Komponenten über das eigene apt-Repository von Docker ein.
Schritt 4: mailcow klonen und die Konfiguration erzeugen
cd /opt
sudo git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
umask
sudo ./generate_config.shDie Prüfung, dass umask 0022 ausgibt, folgt den mailcow-eigenen Installationsschritten. Diese setzen umask 0022 vor dem Klonen. mailcow prüft diesen Wert nicht. Eine frische Ubuntu-24.04-root-Shell liefert bereits 0022. Das Skript fragt anschließend nach dem einzigen wichtigen Wert: dem vollständig qualifizierten Hostnamen. Geben Sie mail.example.com ein. Der Wert muss exakt mit Ihrem A-Record und PTR-Record übereinstimmen. Das Skript schreibt mailcow.conf. Dies ist die einzige Umgebungsdatei, die der gesamte Stack einliest. Öffnen Sie die Datei, wenn Sie die Webports (HTTP_PORT, HTTPS_PORT) ändern oder ClamAV auf einem kleinen System deaktivieren müssen:
MAILCOW_HOSTNAME=mail.example.com
HTTP_PORT=80
HTTPS_PORT=443
SKIP_CLAMD=n # set to y to drop the virus scanner on a <2.5 GiB boxSKIP_FTS=y ist der zweite wichtige Schalter auf einem System mit wenig RAM. Die Volltextsuche ist laut mailcow-Dokumentation der zweite große Speicherverbraucher. Wenn Sie sie überspringen, verzichten Sie lediglich auf die Suche im Nachrichtentext des Webmailers.
Belassen Sie HTTP_PORT=80 und HTTPS_PORT=443 unverändert, sofern sie nicht bereits von einem anderen Dienst auf dem Host verwendet werden. Der integrierte ACME-Client von mailcow verwendet standardmäßig die HTTP-01-Challenge. Dafür muss Port 80 aus dem Internet erreichbar sein, damit das Zertifikat abgerufen werden kann. (mailcow 2026-03 und spätere Versionen können mit ACME_DNS_CHALLENGE=y stattdessen eine DNS-01-Challenge verwenden. Dafür ist Port 80 nicht erforderlich, aber der API-Zugriff auf Ihren DNS-Host.) Deshalb wird im einfachen Aufbau keine separate nginx-plus-Certbot-Konfiguration auf demselben System betrieben. mailcow stellt seine TLS-Zertifikate intern aus und erneuert sie. Ein zweiter Dienst, der Port 80 oder 443 belegt, verhindert das. mailcow dokumentiert auch die Alternative: Binden Sie die Web-Listener mit HTTP_BIND=127.0.0.1 HTTP_PORT=8080 HTTPS_BIND=127.0.0.1 HTTPS_PORT=8443 lokal, setzen Sie einen Reverse Proxy auf Port 80 und 443 ein und verweisen Sie mailcow auf die Zertifikate, wenn ein lokaler Certbot deren Verwaltung übernehmen soll. Fügen Sie außerdem einen Erneuerungs-Hook hinzu. Das bedeutet mehr Komponenten auf einem Mailserver. Dieselbe Abwägung gilt daher für jeden anderen Dienst, der eine öffentlich erreichbare Weboberfläche benötigt: Ein Aufbau wie Halcyon, das eine Jellyfin-Bibliothek als Videothek der 90er-Jahre gestaltet, die ihren eigenen Reverse Proxy auf Port 443 erwartet, gehört auf einen anderen Host, sofern Sie mailcow nicht hinter diesen Proxy verschieben. Die Ausnahme ist ein Dienst, der überhaupt keinen öffentlichen Webport benötigt: ein selbst gehostetes RustDesk-Relay lauscht ausschließlich in seinem eigenen Bereich von 21115 bis 21119. Es kann daher denselben Host nutzen, sofern noch ausreichend Bandbreite verfügbar ist.
Schritt 5, den Stack starten und anmelden
sudo docker compose pull
sudo docker compose up -d
sudo docker compose psDer Pull-Vorgang lädt ungefähr zwei Dutzend Images herunter. Planen Sie dafür einige Minuten ein. Wenn docker compose ps für jeden Container running (oder healthy) anzeigt, öffnen Sie https://mail.example.com/admin in einem Browser. Der standardmäßige Administrator-Login verwendet den Benutzernamen admin und das Passwort moohoo. Ändern Sie dieses Passwort sofort in der Administrationsoberfläche unter System → Configuration und anschließend unter Access → Administrators. Wenn der Browser NET::ERR_CERT_AUTHORITY_INVALID meldet, wurde das ACME-Zertifikat noch nicht ausgestellt. Lesen Sie den Abschnitt zum ACME-Fehler weiter unten, bevor Sie von einem Defekt ausgehen. Ein selbst signiertes Platzhalterzertifikat ist während der ersten ein bis zwei Minuten normal.
Schritt 6, eine Domain und ein Postfach hinzufügen und DKIM veröffentlichen
Öffnen Sie in der Administrationsoberfläche E-Mail → Configuration. Klicken Sie im Tab Domains auf Add domain und geben Sie example.com ein. Klicken Sie anschließend unter Mailboxes auf Add mailbox, um you@example.com mit einem Passwort anzulegen. Damit ist bereits ein funktionierendes Postfach vorhanden, das über IMAP erreichbar ist.
Nun folgt der DKIM-Schlüssel. Öffnen Sie System → Configuration und anschließend Options → ARC/DKIM keys. mailcow hat möglicherweise bereits beim Hinzufügen der Domain einen Schlüssel erzeugt. Falls nicht, erzeugen Sie ihn dort, wählen Sie die Domain aus, übernehmen Sie den Selector dkim, wählen Sie 2048-bit und klicken Sie auf Add. Kopieren Sie den angezeigten langen TXT-Wert und veröffentlichen Sie ihn als:
dkim._domainkey.example.com. TXT "v=DKIM1;k=rsa;t=s;s=email;p=MIIBIjANBgkqh...long-key...QAB"Auf der Domains-Seite von mailcow gibt es die Schaltfläche DNS. Sie listet alle erwarteten Records auf und zeigt für jeden den Status des tatsächlich veröffentlichten Records mit einem grünen Häkchen oder einem roten Kreuz an. Verwenden Sie diese Liste als Checkliste und stellen Sie vor dem Test der Zustellbarkeit sicher, dass jede Zeile grün ist. Eine rote DKIM-Zeile nach der Veröffentlichung bedeutet meist, dass der Schlüssel falsch auf mehrere TXT-Abschnitte verteilt wurde. Ein 2048-Bit-Schlüssel ist länger als das Limit von 255 Zeichen für einen einzelnen TXT-String. Fügen Sie ihn daher als einen logischen Wert ein und lassen Sie ihn von Ihrem DNS-Host in Abschnitte aufteilen.
Schritt 7: Zustellbarkeit testen und 10/10 erreichen
Rufen Sie mail-tester.com auf, kopieren Sie die dort angezeigte zufällige Adresse und senden Sie von Ihrem neuen Postfach eine Nachricht dorthin. Melden Sie sich dazu bei SOGo-Webmail unter https://mail.example.com/SOGo an und senden Sie die Nachricht von dort. Klicken Sie anschließend auf „Then check your score“.
Streben Sie 10/10 an. Häufige Abzüge und ihre Ursachen:
- SPF not aligned, Ihr
MX/SPF-Eintrag fehlt oder die absendende IP-Adresse ist nicht abgedeckt. Prüfen Sie den SPF-TXT-Eintrag erneut. - DKIM signature does not verify, der
dkim._domainkey-TXT-Eintrag fehlt, wird noch verteilt oder ist beschädigt. Dies ist der häufigste Fehler. - No PTR / PTR mismatch, der Reverse-DNS-Eintrag wird nicht zu
mail.example.comaufgelöst. Korrigieren Sie ihn beim Provider. - Listed on a blocklist, die IP-Adresse hat eine frühere schlechte Reputation. Beantragen Sie die Entfernung von der Blocklist oder fordern Sie eine sauberere IP-Adresse an.
Senden Sie erst dann echte E-Mails an Gmail oder Outlook, wenn hier 10/10 angezeigt wird. Eine niedrige Bewertung zusammen mit einer neuen IP-Adresse kann dazu führen, dass Ihre Domain bereits am ersten Tag als problematisch eingestuft wird.
Schritt 8: Einen echten E-Mail-Client verbinden
Konfigurieren Sie Thunderbird, Apple Mail oder Ihr Smartphone mit diesen Einstellungen für den Server. Der Server-Hostname lautet für alle Clients mail.example.com:
- IMAP: Port 993, SSL/TLS (oder Port 143 mit STARTTLS)
- SMTP-Submission: Port 465, SSL/TLS (oder Port 587 mit STARTTLS)
- Benutzername: die vollständige Adresse,
you@example.com - Passwort: das festgelegte Mailbox-Passwort
Senden Sie Client-E-Mails niemals über Port 25. Dieser Port ist ausschließlich für die Kommunikation zwischen Mailservern vorgesehen. mailcow bietet dort keine authentifizierte Submission an, und ein darauf konfigurierter Client wird abgewiesen. Wenn ein Client Relay access denied meldet, versucht er, über Port 25 oder ohne Authentifizierung zu senden. Stellen Sie ihn auf Port 465 oder 587 um und verwenden Sie die Zugangsdaten Ihrer Mailbox.
Schritt 9: Sichern Sie, was tatsächlich wichtig ist
mailcow wird mit einem Backup-Skript ausgeliefert, das von jedem zustandsbehafteten Volume einen Snapshot erstellt. Führen Sie es auf einem externen Datenträger oder einem eingebundenen Remote-Ziel aus:
sudo MAILCOW_BACKUP_LOCATION=/opt/mailcow-backups \
./helper-scripts/backup_and_restore.sh backup allall erfasst sechs Bestandteile. Wenn einer davon verloren geht, gehen Daten verloren: vmail (die eigentlichen Postfächer), crypt (die Schlüssel zum Entschlüsseln von vmail; ohne diese ist vmail unbrauchbar), mysql (die MariaDB-Datenbank mit Domains, Benutzern, Aliasen und Einstellungen), redis (Zustand von Warteschlange und Cache), rspamd (erlernte Spam- und Ham-Klassifizierungen) und postfix (die Mail-Warteschlange). Das Skript läuft in einem Hilfscontainer und schreibt komprimierte Archive. Dadurch bleiben die Backups konsistent, auch wenn der Stack aktiv ist. Automatisieren Sie den Vorgang mit einem nächtlichen Cronjob und ergänzen Sie --delete-days 14, um alte Sicherungssätze zu löschen. Ein Cronjob, der nicht mehr funktioniert, schlägt lautlos fehl. Leiten Sie den Exit-Status des Skripts deshalb an eine Stelle weiter, an der Sie ihn tatsächlich bemerken. Ein selbst gehosteter ntfy-Server nimmt einen einzeiligen curl-Aufruf aus demselben Cron-Eintrag entgegen und meldet den Fehler in der Nacht seines Auftretens auf Ihrem Telefon. Die Wiederherstellung erfolgt mit demselben Skript und restore. Damit werden die Snapshots aufgelistet und Sie können auswählen, was wiederhergestellt werden soll. Ein Backup, das Sie noch nie testweise wiederhergestellt haben, ist eine Hoffnung, aber kein Backup. Führen Sie mindestens einen Probelauf auf einer nicht produktiven VPS aus.
Schritt 10: Nach einem Zeitplan aktualisieren
mailcow wird über sein eigenes Script aktualisiert. Es ruft neuen Code ab, migriert mailcow.conf, lädt Images vorab herunter und startet die Container in der richtigen Reihenfolge neu:
cd /opt/mailcow-dockerized
sudo ./update.sh --check # reports whether an update exists, changes nothing
sudo ./update.sh # applies itErstellen Sie zuerst ein Backup (Schritt 9), da sich eine Schema-Migration nur schwer rückgängig machen lässt. Updates werden häufig veröffentlicht und enthalten Sicherheitskorrekturen für aus dem Internet erreichbare Daemons. Lassen Sie einen Mailserver daher nicht monatelang ohne Updates. Wenn ein Update einen Container in einen fehlerhaften Zustand versetzt, nennt sudo docker compose logs --tail=50 <service>-mailcow den Daemon, der nicht wieder gestartet werden konnte.
Hinweis zur Absicherung
mailcow betreibt einen eigenen netfilter-Dienst (netfilter-mailcow), der IP-Adressen sperrt, die wiederholt auf die Mail- und Webmail-Ports zugreifen. Die Mail-Seite ist damit standardmäßig geschützt. SSH auf dem Host selbst ist davon nicht abgedeckt. Der Dienst ist weiterhin aus dem Internet erreichbar und weiterhin Brute-Force-Angriffen ausgesetzt. Kombinieren Sie diesen Aufbau mit Fail2ban zur Überwachung des SSH-Authentifizierungsprotokolls und einer Anmeldung ausschließlich per Schlüssel. Schützen Sie die mailcow-Administrationsoberfläche mit einem starken Passwort. Idealerweise ist sie nicht aus dem öffentlichen Internet erreichbar oder nur über ein VPN zugänglich.
Fehlerbilder mit den exakten Zeichenfolgen
Mailwarteschlangen bleiben bestehen und stellen nichts zu. Führen Sie sudo docker compose exec postfix-mailcow postqueue -p aus oder lesen Sie die Mailwarteschlange in der Administrationsoberfläche. Die Einträge bleiben bis zu fünf Tage auf „deferred“, bevor Postfix sie mit einer Unzustellbarkeitsmeldung zurückweist. Dabei erscheint:
status=deferred (connect to gmail-smtp-in.l.google.com[142.250.x.x]:25: Connection timed out)In nahezu allen Fällen blockiert Ihr Provider den ausgehenden Port 25 (Schritt 1). Eine ausgehende Regel in der Firewall des eigenen Hosts verursacht denselben Timeout. Schließen Sie diese Ursache daher zuerst aus. Wenn der Host korrekt konfiguriert ist, lässt sich das Problem nicht durch eine Konfigurationsänderung beheben. Eröffnen Sie dann ein Ticket. Es handelt sich weder um ein DNS- noch um ein TLS-Problem. Der entscheidende Hinweis ist das Wort timed out gegenüber einem entfernten MX auf Port 25.
Gmail markiert alle Nachrichten als Spam oder weist sie zurück. Öffnen Sie die Nachricht in Gmail, wählen Sie „Show original“ und lesen Sie die Authentifizierungsergebnisse. dkim=fail oder dkim=none bedeutet, dass der dkim._domainkey-TXT-Eintrag fehlt, beschädigt oder noch nicht propagiert ist. Veröffentlichen Sie exakt den Inhalt erneut, den die ARC/DKIM-Seite anzeigt, und warten Sie die TTL ab. spf=fail bedeutet, dass die SPF/MX-Einträge Ihre IP-Adresse nicht abdecken. Das Alignment ist entscheidend. Eine einzige fehlgeschlagene Prüfung reicht aus, damit die Nachricht als Spam eingestuft wird.
Große Provider weisen die Verbindung bereits beim Aufbau zurück. In Unzustellbarkeitsmeldungen oder Postfix-Logs erscheint die PTR-Zurückweisung von Gmail:
550-5.7.25 [10.0.0.10] The IP address sending this message does not have a PTR
550-5.7.25 record setup, or the corresponding forward DNS entry does not match
550 5.7.25 the sending IP. As a policy, Gmail does not accept messages from IPs
550 5.7.25 with missing PTR records.Der Code 550 5.7.25 bedeutet, dass der Reverse-DNS-Eintrag fehlt oder nicht übereinstimmt. Setzen Sie beim Provider den PTR-Eintrag für Ihre IP-Adresse auf mail.example.com (Schritt 2). Forward-DNS (A) und Reverse-DNS (PTR) müssen übereinstimmen. Beide müssen denselben Hostnamen angeben, mit dem sich mailcow bei anderen Servern meldet.
Der Browser zeigt dauerhaft eine Zertifikatswarnung an. Der Container acme-mailcow konnte kein gültiges Zertifikat abrufen. Prüfen Sie sein Log:
sudo docker compose logs acme-mailcow | tail -n 40Eine Zeile wie Cannot validate any hostnames, skipping Let's Encrypt for 1 hour. oder ein fehlgeschlagener Challenge-Vorgang bedeutet, dass Port 80 aus dem Internet nicht erreichbar ist oder der A-Eintrag nicht auf diesen Server zeigt. Wenn Sie einen AAAA-Eintrag veröffentlicht haben, prüfen Sie auch diesen. mailcow validiert zuerst anhand des AAAA-Eintrags und überspringt die A-Prüfung, sobald ein AAAA-Eintrag vorhanden ist. Ein falscher AAAA-Eintrag oder ein IPv6-Pfad, über den Port 80 nicht erreichbar ist, führt daher auch bei einem korrekten A-Eintrag zu einer fehlgeschlagenen Validierung. Stellen Sie sicher, dass mail.example.com auf diesen Host aufgelöst wird. Öffnen Sie Port 80 und 443 in jeder Firewall des Hosts und stellen Sie sicher, dass kein anderer Dienst an diese Ports gebunden ist. Starten Sie den Client nach der Behebung der Ursache mit sudo docker compose restart acme-mailcow neu, statt die Back-off-Zeit von einer Stunde abzuwarten.
FAQ
Lohnt sich Self-Hosting von E-Mail tatsächlich?
Wenn Sie die Kontrolle über Ihre Daten, unbegrenzt viele Aliase und vollständige Kontrolle wünschen, lautet die Antwort: ja. mailcow bietet Ihnen für den Preis eines VPS einen professionellen Stack. Die Zustellbarkeit bleibt jedoch eine dauerhafte Aufgabe: Die Reputation der IP-Adresse, die DNS-Ausrichtung und die Überwachung von Blocklists erfordern fortlaufende Pflege. Für eine geschäftskritische Adresse, bei der ein einziger Tag im Spam-Ordner eines Empfängers Kosten verursacht, ist ein verwalteter Anbieter die pragmatische Wahl. Betreiben Sie E-Mail selbst, wenn Ihnen Kontrolle wichtiger ist als Komfort und Sie den Dienst tatsächlich pflegen. Wenn es Ihnen eigentlich darum geht, Ihre Daten von den Servern anderer Anbieter fernzuhalten, und nicht speziell um E-Mail, beginnen Sie mit einem Dienst, bei dem niemand mitentscheiden kann: Eine Fotobibliothek hat überhaupt kein Zustellbarkeitsproblem, und unser Vergleich von PhotoPrism und Immich behandelt die erforderliche RAM-Menge und die Backup-Befehle für diese Installation auf einem vergleichbaren VPS.
Wie stelle ich fest, ob der ausgehende Port 25 blockiert ist?
Führen Sie nc -vz -w 5 gmail-smtp-in.l.google.com 25 auf dem Server aus. "succeeded!" bedeutet, dass der Port geöffnet ist. Ein timed out nach der Wartezeit bedeutet, dass der Port blockiert ist. Wenn auf dem System keine eigenen Regeln für die ausgehende Firewall vorhanden sind, liegt die Ursache bei Ihrem Provider. Dies ist der häufigste Grund dafür, dass ein selbst gehosteter Server E-Mails empfangen, aber niemals senden kann. Bei einer Blockierung durch den Provider kann nur der Provider den Port öffnen. Lokale Einstellungen ändern daran nichts.
Warum landen meine E-Mails weiterhin im Spam-Ordner von Gmail?
Fast immer ist eine unterbrochene Authentifizierungskette die Ursache. Verwenden Sie in Gmail "Show original" und suchen Sie nach spf=pass, dkim=pass und dmarc=pass. Ein dkim=fail weist auf einen fehlenden oder fehlerhaften dkim._domainkey-TXT-Eintrag hin. Auch eine nicht übereinstimmende PTR-Zuordnung oder eine neue IP-Adresse ohne Versandhistorie verschlechtert die Zustellbarkeit. Erreichen Sie zunächst bei mail-tester.com eine Bewertung von 10/10. Anschließend gewöhnen Sie die IP-Adresse langsam an das Versandvolumen. Beginnen Sie mit wenigen Nachrichten pro Tag und steigern Sie die Menge schrittweise, statt bereits am ersten Tag große Mengen zu versenden.
Welche Daten muss ich genau sichern?
Führen Sie backup_and_restore.sh backup all aus und bewahren Sie den vollständigen Datensatz außerhalb des Servers auf. Der Befehl erfasst vmail (die Postfächer), crypt (die Schlüssel zum Entschlüsseln der Postfächer), die MariaDB-Datenbank (Domains, Benutzer, Aliase und Einstellungen), Redis, die angelernten Daten von Rspamd und die Postfix-Warteschlange. Das crypt-Volume wird häufig übersehen. Ohne dieses Volume ist das vmail-Backup nicht lesbar, weil es nur Chiffretext enthält. Testen Sie mindestens einmal eine Wiederherstellung auf einem temporären System.
Kann ich mailcow auf einem VPS mit 2 GB ausführen?
Nicht zuverlässig. generate_config.sh bietet an, ClamAV unterhalb von etwa 2.5 GiB zu deaktivieren. Auch bei deaktiviertem ClamAV konkurrieren Rspamd, Dovecot, MariaDB und die übrigen Komponenten des Stacks um den Arbeitsspeicher. Unter einer realistischen Last kommt es daher zu Swap-Nutzung und OOM-Kills. Planen Sie 6 GiB plus 1 GiB Swap als Untergrenze für eine stabile Installation mit einem Benutzer ein. Wechseln Sie auf 8 GiB, sobald mehr als einige wenige Personen auf den Dienst angewiesen sind.