<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Email – Serverküche</title><link>https://serverkueche.de/tags/email/</link><description>Email – Neueste Beiträge von Serverküche</description><generator>Hugo</generator><language>de-DE</language><managingEditor>feedback@serverkueche.de (Serverküche)</managingEditor><webMaster>feedback@serverkueche.de (Serverküche)</webMaster><copyright>2026 Serverküche</copyright><lastBuildDate>Thu, 13 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://serverkueche.de/tags/email/index.xml" rel="self" type="application/rss+xml"/><item><title>E-Mail-Zustellbarkeit: SPF, DKIM, DMARC und PTR richtig setzen</title><link>https://serverkueche.de/tutorials/mailserver-zustellbarkeit/</link><pubDate>Thu, 13 Aug 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/mailserver-zustellbarkeit/</guid><description>Damit deine selbstgehosteten Mails im Posteingang landen statt im Spam: Reverse DNS, SPF, DKIM und DMARC Schritt für Schritt erklärt, eingerichtet und getestet.</description><content:encoded><![CDATA[<p>Dein Mailserver läuft, Postfächer sind angelegt – und trotzdem landen deine Mails beim Empfänger im
Spam oder werden gleich ganz abgewiesen. Willkommen beim eigentlich schweren Teil des
Selbst-Hostens: der <strong>Zustellbarkeit</strong>. Sie hängt nicht an deiner Server-Software, sondern an vier
DNS-Bausteinen, die anderen Servern beweisen, dass deine Mails echt sind. Dieses Tutorial richtet
sie ein und testet sie.</p>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende erkennen große Mailanbieter (Gmail, Outlook, GMX &amp; Co.) deine Mails als <strong>authentisch</strong> und
liefern sie in den Posteingang statt in den Spam. Dafür sorgen vier Mechanismen, die zusammenspielen:</p>
<ul>
<li><strong>Reverse DNS (PTR):</strong> beweist, dass deine Server-IP zu deinem Mail-Hostnamen gehört – die
Grundvoraussetzung, ohne die viele Server gar nicht erst annehmen.</li>
<li><strong>SPF:</strong> legt fest, <strong>welche Server</strong> im Namen deiner Domain senden dürfen.</li>
<li><strong>DKIM:</strong> <strong>signiert</strong> jede ausgehende Mail kryptografisch, sodass Manipulation und Fälschung
auffliegen.</li>
<li><strong>DMARC:</strong> sagt den Empfängern, <strong>was zu tun ist</strong>, wenn SPF oder DKIM fehlschlagen – und
schickt dir Berichte.</li>
</ul>
<p>Der Nutzen ist doppelt: Deine eigenen Mails kommen zuverlässig an – <strong>und</strong> niemand kann in deinem
Namen fälschen. Ohne diese Records kann jeder Angreifer Mails mit deiner Absenderdomain verschicken
(„Spoofing&quot;) und damit Phishing in deinem Namen betreiben. SPF, DKIM und DMARC machen genau das
unmöglich: Sie verwandeln deine Domain von einem offen missbrauchbaren Absender in einen
nachweisbar echten. Gerade wenn Kund:innen oder Kolleg:innen Mails von dir erwarten, ist dieser
Schutz mindestens so wichtig wie die Zustellbarkeit selbst.</p>
<p>Diese vier Records sind unabhängig von deiner Server-Software. Ob du <a href="/tutorials/mailserver-mailcow-aufsetzen/">Mailcow</a>
oder <a href="/tutorials/stalwart-mailserver/">Stalwart</a> betreibst, ist egal – die Zustellbarkeit
konfigurierst du im <strong>DNS</strong> und beim <strong>Provider</strong>.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-sky-300 bg-sky-50 dark:border-sky-800 dark:bg-sky-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">ℹ️</span>Kein „einmal setzen und fertig“
  </p>
  <div class="prose-kitchen text-sm">Zustellbarkeit ist ein Prozess, kein Zustand. Selbst mit perfekten Records braucht eine frische
Server-IP Zeit, um sich eine gute <strong>Reputation</strong> aufzubauen. Rechne mit ein paar Tagen, bis alles
rundläuft, und beobachte die DMARC-Berichte weiter.</div>
</div>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>
<p>Ein <strong>laufender Mailserver</strong> unter deiner Domain (z. B. aus dem
<a href="/tutorials/mailserver-mailcow-aufsetzen/">Mailcow-</a> oder <a href="/tutorials/stalwart-mailserver/">Stalwart-Tutorial</a>).</p>
</li>
<li>
<p>Voller <strong>Zugriff auf die DNS-Zone</strong> deiner Domain (siehe <a href="/tutorials/domain-mit-server-verbinden/">Domain mit dem Server verbinden</a>).</p>
</li>
<li>
<p><strong>Zugriff auf das Provider-Panel</strong>, um den <strong>Reverse-DNS-Eintrag</strong> der Server-IP zu setzen (bei
netcup im SCP).</p>
</li>
<li>
<p>Das Werkzeug <code>dig</code> zum Prüfen der Records:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt install -y bind9-dnsutils</span></span></code></pre></div>
</div>
</li>
</ul>
<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-reverse-dns-ptr-setzen--das-fundament">Schritt 1: Reverse DNS (PTR) setzen – das Fundament</h3>
<p>Der wichtigste und am häufigsten vergessene Eintrag. Während ein normaler DNS-Eintrag einen Namen
in eine IP auflöst, macht der <strong>PTR-Eintrag</strong> das Gegenteil: Er löst deine <strong>Server-IP</strong> zurück in
einen Namen auf. Empfänger prüfen, ob dieser Name zu deinem Mail-Hostnamen passt. Fehlt der PTR
oder zeigt er auf einen generischen Provider-Namen, gilt dein Server als verdächtig.</p>
<p>Den PTR-Eintrag setzt du <strong>nicht</strong> in deiner DNS-Zone, sondern beim <strong>Provider</strong>, dem die IP gehört.
Bei netcup gehst du dazu ins <strong>Server Control Panel (SCP)</strong> → <em>Netzwerk / Reverse DNS</em> und trägst
für deine IP den Wert <code>mail.DEINE_DOMAIN</code> ein. Nach der Propagierung prüfst du:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dig +short -x DEINE_SERVER_IP</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">mail.deine-domain.de.</span></span></code></pre></div>
</div>
<p>Kommt hier <code>mail.DEINE_DOMAIN</code> zurück, stimmt der PTR. Zeigt er noch auf etwas wie
<code>vXXXXXXXXX.example-provider.net</code>, ist er noch nicht gesetzt oder nicht propagiert.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Achtung
  </p>
  <div class="prose-kitchen text-sm">Der PTR-Hostname (<code>mail.DEINE_DOMAIN</code>) <strong>muss</strong> vorwärts wieder auf dieselbe IP auflösen
(A-Record). Diese Übereinstimmung – „Forward-confirmed reverse DNS&quot; (FCrDNS) – ist für viele
Empfänger Pflicht. Prüfe beides: <code>dig +short mail.DEINE_DOMAIN</code> muss <code>DEINE_SERVER_IP</code> ergeben.</div>
</div>
<h3 id="schritt-2-spf--wer-darf-in-deinem-namen-senden">Schritt 2: SPF – wer darf in deinem Namen senden?</h3>
<p>Der <strong>SPF-Record</strong> ist ein TXT-Eintrag in deiner DNS-Zone. Er listet die IPs bzw. Hostnamen, die
Mails für deine Domain versenden dürfen. Für einen einzelnen Mailserver genügt:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">DEINE_DOMAIN.   TXT   &#34;v=spf1 a:mail.DEINE_DOMAIN -all&#34;</span></span></code></pre></div>
</div>
<p>Zerlegt:</p>
<ul>
<li><code>v=spf1</code> – die SPF-Version.</li>
<li><code>a:mail.DEINE_DOMAIN</code> – der Server hinter diesem A-Record darf senden. Alternativ direkt die IP
mit <code>ip4:DEINE_SERVER_IP</code> (und <code>ip6:…</code> bei IPv6).</li>
<li><code>-all</code> – <strong>alle anderen</strong> Server sind nicht autorisiert („hard fail&quot;). Das ist die strenge,
empfohlene Variante. Ein <code>~all</code> („soft fail&quot;) ist nachsichtiger, aber weniger wirksam.</li>
</ul>
<p>Prüfen – und zwar mit Filter:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dig +short TXT DEINE_DOMAIN <span class="p">|</span> grep spf1</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&#34;v=spf1 a:mail.deine-domain.de -all&#34;</span></span></code></pre></div>
</div>
<p>Das <code>grep</code> ist kein Luxus: <code>dig +short TXT</code> gibt <strong>alle</strong> TXT-Einträge deiner Zone aus, und dort
sammeln sich mit der Zeit Verifikations-Token von Google, Microsoft &amp; Co. an. Real nachgemessen –
<code>google.com</code> antwortet mit 16 TXT-Einträgen, <code>microsoft.com</code> mit 61. Ohne Filter suchst du deinen
SPF-Record von Hand heraus. Kommt gar nichts zurück, existiert kein SPF-Record. Kommen <strong>zwei</strong>
Zeilen zurück, hast du zwei SPF-Records – und das ist ein Fehler, siehe „Wenn es nicht funktioniert&quot;.</p>
<p>Versendest du <strong>zusätzlich</strong> über Dritte – etwa einen Newsletter-Dienst oder das Transaktionsmail-
Gateway einer App – gehören deren Server ebenfalls autorisiert. Das machst du über <code>include:</code>, und
zwar in <strong>einem einzigen</strong> Record:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">DEINE_DOMAIN.   TXT   &#34;v=spf1 a:mail.DEINE_DOMAIN include:_spf.dienstleister.de -all&#34;</span></span></code></pre></div>
</div>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Tipp
  </p>
  <div class="prose-kitchen text-sm">Es darf pro Domain <strong>nur einen</strong> SPF-Record geben, und SPF erlaubt insgesamt maximal <strong>10
DNS-Lookups</strong>. Sammle alle Sender in <strong>demselben</strong> Record und spare dir überflüssige <code>include:</code>,
sonst wird SPF ungültig oder läuft in einen <code>permerror</code>.</div>
</div>
<h3 id="schritt-3-dkim--jede-mail-kryptografisch-signieren">Schritt 3: DKIM – jede Mail kryptografisch signieren</h3>
<p><strong>DKIM</strong> signiert jede ausgehende Mail mit einem privaten Schlüssel; den passenden <strong>öffentlichen</strong>
Schlüssel legst du als DNS-Record ab. Empfänger prüfen damit, dass die Mail wirklich von dir kommt
und unterwegs nicht verändert wurde.</p>
<p>So läuft es ab: Beim Versand berechnet dein Server aus wichtigen Kopfzeilen und dem Nachrichtentext
eine Signatur und hängt sie als <code>DKIM-Signature</code>-Header an. Der Empfänger holt sich deinen
öffentlichen Schlüssel aus dem DNS und prüft die Signatur. Passt sie, ist bewiesen: Die Mail stammt
von einem Server mit deinem privaten Schlüssel <strong>und</strong> wurde nicht verändert. Nimm <strong>2048-Bit</strong>-Schlüssel
– 1024 Bit gelten als zu schwach, und die meisten DNS-Anbieter kommen mit der Schlüssellänge
inzwischen problemlos zurecht.</p>
<p>Den Schlüssel <strong>erzeugt dein Mailserver</strong> – du musst nur den DNS-Record veröffentlichen:</p>
<ul>
<li>In <strong>Mailcow</strong>: <em>Konfiguration → ARC/DKIM-Schlüssel</em>, Domain auswählen, Schlüssel erzeugen (2048
Bit). Mailcow zeigt dir den fertigen DNS-Record an.</li>
<li>In <strong>Stalwart</strong>: Die Schlüssel entstehen im Einrichtungs-Assistenten; den Record findest du in der
Konsole unter der jeweiligen Domain.</li>
</ul>
<p>Der Record hat einen <strong>Selector</strong> (einen frei gewählten Namen, z. B. <code>dkim</code> oder <code>default</code>) und
sieht so aus:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">dkim._domainkey.DEINE_DOMAIN.   TXT   &#34;v=DKIM1; k=rsa; p=MIIBIjANBgkq...LANGER_PUBLIC_KEY...AQAB&#34;</span></span></code></pre></div>
</div>
<p>Übernimm den Wert <strong>exakt</strong> so, wie dein Mailserver ihn ausgibt. Prüfen:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dig +short TXT dkim._domainkey.DEINE_DOMAIN</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&#34;v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA…ERSTER_TEIL&#34; &#34;ZWEITER_TEIL…AQAB&#34;</span></span></code></pre></div>
</div>
<p>Wundere dich nicht über die <strong>zwei</strong> Blöcke in Anführungszeichen: Eine einzelne Zeichenkette in
einem TXT-Eintrag darf höchstens 255 Bytes tragen, ein 2048-Bit-Schlüssel ist länger. Er steht im
DNS deshalb zwangsläufig als zwei aneinandergehängte Zeichenketten, und <code>dig</code> zeigt genau das. Das
ist <strong>kein</strong> abgeschnittener Schlüssel – Empfänger setzen die Teile beim Prüfen wieder zusammen.
Die meisten DNS-Panels übernehmen die Aufteilung automatisch; verlangt deines den Wert am Stück,
trägst du ihn ohne Anführungszeichen und ohne Zeilenumbrüche ein.</p>
<p>Kommt der <code>v=DKIM1; …</code>-Wert zurück, ist der öffentliche Schlüssel veröffentlicht.</p>
<h3 id="schritt-4-dmarc--regeln-und-berichte">Schritt 4: DMARC – Regeln und Berichte</h3>
<p><strong>DMARC</strong> verbindet SPF und DKIM: Es sagt Empfängern, wie sie mit Mails umgehen sollen, die die
Prüfung <strong>nicht</strong> bestehen, und lässt dir <strong>Berichte</strong> über die Nutzung deiner Domain schicken. Ein
guter Einstiegs-Record:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">_dmarc.DEINE_DOMAIN.   TXT   &#34;v=DMARC1; p=quarantine; rua=mailto:dmarc@DEINE_DOMAIN; adkim=s; aspf=s&#34;</span></span></code></pre></div>
</div>
<p>Zerlegt:</p>
<ul>
<li><code>p=quarantine</code> – nicht bestandene Mails sollen in den Spam wandern. Zum <strong>Start</strong> empfiehlt sich
<code>p=none</code> (nur beobachten, nichts aussortieren), damit du erst die Berichte auswertest, bevor du
scharf schaltest. Später gehst du auf <code>quarantine</code> und schließlich <code>p=reject</code>.</li>
<li><code>rua=mailto:dmarc@DEINE_DOMAIN</code> – an diese Adresse kommen die <strong>aggregierten Berichte</strong> (lege das
Postfach vorher an).</li>
<li><code>adkim=s</code> / <code>aspf=s</code> – strenge Ausrichtung (der signierende bzw. sendende Absender muss exakt zur
Domain passen). Der Standard laut Spezifikation ist <code>r</code> (relaxed) – dann genügt dieselbe
Organisationsdomain, <code>mail.DEINE_DOMAIN</code> und <code>DEINE_DOMAIN</code> gelten also als ausgerichtet. Für
einen einzelnen Mailserver, der alles unter derselben Domain versendet, ist <code>s</code> die schärfere und
passende Wahl; sobald Dienste auf Subdomains mitsenden, setzt du auf <code>r</code> zurück.</li>
</ul>
<p>Prüfen:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dig +short TXT _dmarc.DEINE_DOMAIN</span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">&#34;v=DMARC1; p=quarantine; rua=mailto:dmarc@deine-domain.de; adkim=s; aspf=s&#34;</span></span></code></pre></div>
</div>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-sky-300 bg-sky-50 dark:border-sky-800 dark:bg-sky-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">ℹ️</span>Stand der Spezifikation: RFC 9989 (Mai 2026)
  </p>
  <div class="prose-kitchen text-sm"><p>DMARC ist seit <strong>Mai 2026</strong> ein offizieller IETF-Standard: <strong>RFC 9989</strong> (Protokoll) samt RFC 9990
(aggregierte Berichte) und RFC 9991 (Fehlerberichte) ersetzt das alte, nur informative RFC 7489
(und RFC 9091). Für dich ändert sich fast nichts – <code>v=DMARC1</code> bleibt unverändert, bestehende
Records bleiben gültig. Drei Punkte lohnen den Blick:</p>
<ul>
<li><strong><code>pct=</code> ist ersatzlos gestrichen.</strong> Der Tag, mit dem man die Policy früher nur auf einen
Prozentsatz der Mails anwenden ließ, existiert nicht mehr. Steht er noch in deinem Record, nimm
ihn heraus.</li>
<li><strong><code>np=</code> ist neu</strong> und für Selbsthoster praktisch: Er setzt die Policy für <strong>nicht existierende</strong>
Subdomains. <code>np=reject</code> lässt Empfänger jede Mail von einer Subdomain, die es in deinem DNS gar
nicht gibt, sofort abweisen – ein beliebter Spoofing-Weg, den du damit ohne Nebenwirkung
zumachst. (<code>sp=</code> bleibt für die existierenden Subdomains zuständig.)</li>
<li><strong>Die Public Suffix List ist raus.</strong> Die Organisationsdomain wird jetzt über einen „DNS Tree
Walk&quot; direkt im DNS ermittelt, nicht mehr über eine extern gepflegte Liste.</li>
</ul></div>
</div>
<h3 id="schritt-5-alles-zusammen-testen">Schritt 5: Alles zusammen testen</h3>
<p>Jetzt der Realitätscheck. Drei Werkzeuge – vom Gesamtbild bis zum Einzel-Record:</p>
<ol>
<li>
<p><strong><a href="https://www.mail-tester.com">mail-tester.com</a>:</strong> Der holistische Test. Öffne die Seite, sie
zeigt dir eine Zufalls-Adresse. Schick von deinem neuen Postfach eine ganz normale Mail dorthin
und klick auf „Then check your score&quot;. Du bekommst eine Wertung von <strong>10/10</strong> aufgeschlüsselt nach
SPF, DKIM, DMARC, Reverse DNS, Inhalt und Blocklisten. Alles unter 10 zeigt dir konkret, woran es hakt.</p>
</li>
<li>
<p><strong>Einzel-Validatoren pro Record.</strong> Zum gezielten Debuggen prüfst du jeden Baustein separat online:
Du gibst deine Domain ein (bei DKIM zusätzlich den Selector, z. B. <code>dkim</code>) und bekommst Syntax,
aufgelöste Werte und Warnungen angezeigt:</p>
<ul>
<li><strong>SPF:</strong> <a href="https://mxtoolbox.com/spf.aspx">MXToolbox SPF-Check</a> – zeigt auch, ob du das
10-Lookup-Limit reißt.</li>
<li><strong>DKIM:</strong> <a href="https://mxtoolbox.com/dkim.aspx">MXToolbox DKIM-Check</a> – Domain <strong>und</strong> Selector angeben.</li>
<li><strong>DMARC:</strong> <a href="https://mxtoolbox.com/dmarc.aspx">MXToolbox DMARC-Check</a> – prüft Syntax und Policy;
der <a href="https://dmarcian.com/dmarc-inspector/">dmarcian DMARC-Inspector</a> zeigt die Policy besonders
anschaulich.</li>
</ul>
</li>
<li>
<p><strong>Gegenprobe per <code>dig</code>:</strong> Prüfe alle vier Bausteine noch einmal in einem Rutsch:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">dig +short -x DEINE_SERVER_IP                  <span class="c1"># PTR</span>
</span></span><span class="line"><span class="cl">dig +short TXT DEINE_DOMAIN <span class="p">|</span> grep spf1        <span class="c1"># SPF</span>
</span></span><span class="line"><span class="cl">dig +short TXT dkim._domainkey.DEINE_DOMAIN    <span class="c1"># DKIM</span>
</span></span><span class="line"><span class="cl">dig +short TXT _dmarc.DEINE_DOMAIN             <span class="c1"># DMARC</span></span></span></code></pre></div>
</div>
</li>
</ol>
<p>Ein besonders guter Praxistest: Schick eine Mail an ein <strong>Gmail-Konto</strong>, öffne dort die Mail, und
über „Original anzeigen&quot; siehst du direkt <code>SPF: PASS</code>, <code>DKIM: PASS</code> und <code>DMARC: PASS</code>. Erst wenn
alle drei auf PASS stehen, bist du auf der sicheren Seite.</p>
<h3 id="schritt-6-dmarc-berichte-auswerten-und-scharf-schalten">Schritt 6: DMARC-Berichte auswerten und scharf schalten</h3>
<p>An deine <code>rua</code>-Adresse trudeln nach ein bis zwei Tagen die ersten <strong>DMARC-Berichte</strong> ein – XML-Dateien
von den Empfänger-Servern, die zeigen, welche Quellen unter deiner Domain gesendet haben und ob
SPF/DKIM bestanden. Sie sind roh schwer lesbar; ein kostenloser Report-Analyzer macht sie
verständlich. Sobald du in den Berichten siehst, dass deine <strong>eigenen</strong> Mails durchgehend bestehen
und keine fremden Quellen auftauchen, erhöhst du die DMARC-Policy schrittweise von <code>p=none</code> über
<code>p=quarantine</code> bis <code>p=reject</code>.</p>
<h3 id="schritt-7-was-gmail-yahoo-und-outlookcom-konkret-verlangen">Schritt 7: Was Gmail, Yahoo und Outlook.com konkret verlangen</h3>
<p>Du musst nicht raten, was „gut genug&quot; ist – die großen Anbieter haben ihre Anforderungen
schriftlich festgehalten.</p>
<p><strong>Google und Yahoo, verbindlich seit dem 1. Februar 2024.</strong> Für <strong>jeden</strong> Absender gilt: SPF
<strong>oder</strong> DKIM eingerichtet, gültige Vorwärts- <strong>und</strong> Rückwärts-DNS-Einträge, TLS beim Transport
und eine Spam-Beschwerderate unter <strong>0,3 %</strong>. Wer <strong>5.000 Mails oder mehr pro Tag</strong> an Gmail- bzw.
Yahoo-Konten schickt, muss zusätzlich SPF <strong>und</strong> DKIM setzen, einen DMARC-Record veröffentlichen
(<code>p=none</code> genügt), die <code>From:</code>-Domain mit der SPF- oder der DKIM-Domain ausrichten und bei Werbe-
und Abo-Mails eine <strong>One-Click-Abmeldung</strong> per <code>List-Unsubscribe</code>-Header anbieten.</p>
<p><strong>Microsoft, verbindlich seit dem 5. Mai 2025.</strong> Für Outlook.com, Hotmail, Live und MSN gilt
dieselbe Schwelle von 5.000 Mails pro Tag: SPF und DKIM müssen <strong>bestehen</strong>, ein DMARC-Record mit
mindestens <code>p=none</code> muss existieren, und die Ausrichtung muss über SPF und/oder DKIM passen.
Nicht konforme Mails landeten zunächst im Junk-Ordner; inzwischen weist Microsoft sie direkt im
SMTP-Dialog ab:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">550 5.7.515 Access denied, sending domain DEINE_DOMAIN does not meet the required authentication level</span></span></code></pre></div>
</div>
<p>Ein Detail, das gern übersehen wird: Die Schwelle ist <strong>klebrig</strong>. Hat eine Domain sie einmal
überschritten, gelten die Anforderungen dauerhaft – auch wenn du später wieder deutlich weniger
versendest.</p>
<p>Als Selbsthoster wirst du die 5.000er-Marke selten reißen. Trotzdem ist genau das die Messlatte,
an der du dich orientieren solltest – und die gute Nachricht: Die Anforderungen sind exakt das, was
du in den Schritten 1 bis 4 gebaut hast. Wer PTR, SPF, DKIM und DMARC sauber gesetzt hat, erfüllt
die Regeln der drei größten Anbieter, ohne noch einmal nachlegen zu müssen.</p>
<h3 id="schritt-8-die-ip-reputation-aufwärmen">Schritt 8: Die IP-Reputation aufwärmen</h3>
<p>Perfekte DNS-Records sind die Eintrittskarte – aber große Anbieter vertrauen einer <strong>frischen
Server-IP</strong> trotzdem nicht sofort. Sie beobachten dein Sendeverhalten und bauen über Tage bis Wochen
ein Reputationsbild auf. Zwei Dinge helfen entscheidend:</p>
<ul>
<li><strong>Klein anfangen, regelmäßig senden.</strong> Ein neuer Server, der aus dem Stand hunderte Mails
verschickt, sieht aus wie eine Spam-Schleuder. Sende anfangs wenige, echte Mails und steigere
langsam. Kontinuität schlägt Menge.</li>
<li><strong>Nur an existierende Adressen senden.</strong> Jede Mail an ein nicht existierendes Postfach (ein
„bounce&quot;) verschlechtert deine Reputation. Halte deine Empfängerlisten sauber.</li>
</ul>
<p>Ein Sonderfall ist <strong>Microsoft</strong> (Outlook, Hotmail, Live): Deren Filter sind bei neuen IPs besonders
misstrauisch, selbst bei tadellosen Records. Die Authentifizierung aus Schritt 7 ist dort die
Eintrittskarte, ersetzt aber keine Reputation. Hier hilft nur Geduld – und, falls nötig, die
Anmeldung zu Microsofts Absender-Programmen (SNDS/JMRP), über die du Einblick und einen Draht zur
Reputationsbewertung bekommst.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Fortgeschritten: BIMI
  </p>
  <div class="prose-kitchen text-sm">Wenn SPF, DKIM und DMARC (mit <code>p=quarantine</code> oder <code>p=reject</code>) sauber laufen, kannst du mit <strong>BIMI</strong>
dein Firmen- bzw. Absenderlogo neben deinen Mails im Posteingang anzeigen lassen. Das ist optionaler
Feinschliff, kein Muss – aber ein hübsches Signal für Seriosität, sobald das Fundament steht.</div>
</div>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<div class="troubleshoot not-prose">
<p><strong>mail-tester zeigt „reverse DNS does not match&quot;.</strong> Der PTR-Eintrag fehlt, ist noch nicht propagiert
oder passt nicht zum A-Record. PTR im Provider-Panel auf <code>mail.DEINE_DOMAIN</code> setzen und mit <code>dig -x</code>
prüfen; sicherstellen, dass <code>mail.DEINE_DOMAIN</code> vorwärts auf dieselbe IP zeigt.</p>
<p><strong>DKIM schlägt fehl (<code>DKIM: FAIL</code> oder „no signature&quot;).</strong> Der DNS-Record ist falsch übernommen
(wirklich abgeschnittener Schlüssel, falscher Selector) oder noch nicht propagiert. Den Wert exakt
aus der Mailserver-UI kopieren, Selector im Record (<code>SELECTOR._domainkey</code>) mit dem im Server
konfigurierten abgleichen, dann <code>dig</code> gegenprüfen. Dass <code>dig</code> den Schlüssel als <strong>zwei</strong> Blöcke in
Anführungszeichen zeigt, ist dabei normal und kein Fehler – siehe Schritt 3.</p>
<p><strong>SPF „permerror&quot; oder „too many DNS lookups&quot;.</strong> Mehrere SPF-Records, oder zu viele
<code>include:</code>-Verschachtelungen (Limit: 10 DNS-Lookups). Mit <code>dig +short TXT DEINE_DOMAIN | grep spf1</code>
prüfen, ob wirklich nur <strong>eine</strong> Zeile zurückkommt, auf <strong>einen</strong> SPF-Record konsolidieren und
unnötige <code>include:</code> entfernen.</p>
<p><strong>Mails an Outlook/Hotmail landen im Spam oder werden abgewiesen.</strong> Kommt eine harte Abweisung mit
<code>550 5.7.515 Access denied, sending domain … does not meet the required authentication level</code>, ist
es kein Reputationsproblem, sondern Microsofts Authentifizierungsregel ab 5.000 Mails pro Tag –
SPF und DKIM müssen bestehen und ein ausgerichteter DMARC-Record (mindestens <code>p=none</code>) vorhanden
sein; die Schwelle klebt an der Domain, auch wenn du später weniger sendest. Landen die Mails
dagegen nur im Junk-Ordner, ist Microsoft schlicht streng mit neuen IPs: Geduld, wenig aber
regelmäßig senden, ggf. Microsofts SNDS-/JMRP-Programm nutzen.</p>
<p><strong>Deine IP steht auf einer Blockliste.</strong> Die IP war vor dir bei einem Spammer, oder ein Postfach von
dir versendet Spam. Auf den gängigen Blocklist-Checkern prüfen, bei berechtigtem Fund über das
jeweilige Delisting-Formular entfernen lassen – und die Ursache (kompromittiertes Konto) abstellen.</p>

</div>

<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<p>Zustellbarkeit ist Dauerpflege, keine Einmalaktion:</p>
<ul>
<li><strong>DMARC-Berichte beobachten.</strong> Ein regelmäßiger Blick zeigt sofort, wenn jemand deine Domain
missbraucht oder ein eigener Dienst plötzlich durchfällt.</li>
<li><strong>DKIM-Schlüssel rotieren.</strong> Alle ein bis zwei Jahre einen neuen Schlüssel erzeugen (neuer
Selector, alten noch eine Weile stehen lassen), um die Sicherheit hochzuhalten.</li>
<li><strong>Reputation im Blick behalten.</strong> Prüfe gelegentlich Blocklisten und das Sendevolumen. Ein
plötzlicher Anstieg ausgehender Mails ist fast immer das Zeichen eines gekaperten Kontos.</li>
<li><strong>Records sichern.</strong> SPF-, DKIM- und DMARC-Records gehören in deine Doku bzw. dein Backup – gehen
die DKIM-<strong>Schlüssel</strong> auf dem Server verloren, musst du ohnehin neue erzeugen und den DNS-Record
ersetzen (siehe die Backup-Abschnitte der Mailserver-Tutorials).</li>
</ul>
<p>Sind alle vier Bausteine gesetzt und getestet, hast du die halbe Miete des seriösen Mail-Selbsthostens
– den Rest macht ein sauber betriebener, nicht als Spam-Schleuder missbrauchter Server.</p>
]]></content:encoded></item><item><title>Stalwart: der schlanke Mailserver in einem Container</title><link>https://serverkueche.de/tutorials/stalwart-mailserver/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/stalwart-mailserver/</guid><description>Stalwart Mail Server mit Docker aufsetzen: SMTP, IMAP, JMAP und Spam-Filter in einem einzigen, schlanken Container – die moderne Alternative zu Mailcow.</description><content:encoded><![CDATA[<p>Ein eigener Mailserver muss nicht aus zwei Dutzend Containern bestehen. <strong>Stalwart</strong> packt den
kompletten Mailserver – SMTP, IMAP, JMAP, Spam-Filter und Speicher – in <strong>einen einzigen</strong>,
in Rust geschriebenen Container. Das macht ihn schlank, schnell und wartungsarm: die moderne,
leichtgewichtige Alternative zu Schwergewichten wie <a href="/tutorials/mailserver-mailcow-aufsetzen/">Mailcow</a>.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Mailserver bleiben anspruchsvoll – egal wie schlank
  </p>
  <div class="prose-kitchen text-sm">Stalwart ist einfacher aufzusetzen als klassische Stacks, nimmt dir aber die Kernaufgabe eines
Mailserver-Betreibers nicht ab: <strong>Zustellbarkeit</strong>. Ob deine Mails ankommen oder im Spam landen,
entscheiden SPF, DKIM, DMARC und ein sauberer Reverse-DNS-Eintrag – nicht die Software. Genau
das behandeln wir im Folge-Tutorial. Wer keine Lust auf diese Dauerpflege hat, fährt mit einem
seriösen Mail-Hoster oft besser. Das ist eine ehrliche Abwägung, keine Schwäche.</div>
</div>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende läuft <strong>Stalwart 0.16.14</strong> als <strong>einzelner Docker-Container</strong> auf deinem Server und stellt
alles bereit, was ein vollwertiger Mailserver braucht:</p>
<ul>
<li><strong>SMTP</strong> (Senden/Empfangen) auf den Ports 25, 465 und 587,</li>
<li><strong>IMAP</strong> (993) und das moderne <strong>JMAP</strong> für schnelle, effiziente Clients,</li>
<li><strong>ManageSieve</strong> (4190) für serverseitige Filterregeln,</li>
<li>einen <strong>eingebauten Spam- und Phishing-Filter</strong> (kein separater Rspamd/ClamAV nötig),</li>
<li>einen <strong>integrierten Speicher</strong> (RocksDB) – keine externe Datenbank,</li>
<li>eine <strong>moderne Weboberfläche</strong> zur Verwaltung von Domains, Konten und Einstellungen.</li>
</ul>
<p>Der große Unterschied zu Mailcow: Es ist <strong>ein</strong> Prozess, <strong>ein</strong> Container, wenige Hundert
Megabyte Image. Das senkt RAM-Bedarf, Angriffsfläche und Wartungsaufwand deutlich. Getestet mit
<strong>Docker 29</strong> auf <strong>Debian 13</strong>.</p>
<p>Warum lohnt sich der schlanke Ansatz? Ein klassischer Mailserver-Stack besteht aus einem guten
Dutzend Diensten – Postfix, Dovecot, Rspamd, ein Datenbankserver, ein Virenscanner, Redis, ein
Webserver – die alle einzeln laufen, aktualisiert und aufeinander abgestimmt werden müssen. Jeder
davon ist eine potenzielle Fehlerquelle und ein Stück Angriffsfläche. Stalwart bündelt dieselbe
Funktionalität in einer einzigen, in Rust geschriebenen Anwendung. Rust bringt zudem
Speichersicherheit von Haus aus mit – für eine Software, die ungefiltert Daten aus dem ganzen
Internet entgegennimmt, ist das ein echtes Sicherheitsargument.</p>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein <strong>eigener Server</strong> mit <strong>Debian 13</strong> und <a href="/tutorials/docker-installieren/">installiertem Docker</a>,
auf dem die Mail- und Web-Ports frei sind (kein Reverse Proxy, der 25/443 belegt).</li>
<li>Eine <strong>Domain</strong>, deren <a href="/tutorials/domain-mit-server-verbinden/">DNS du selbst steuerst</a> – für
den A-Record des Mailservers und den MX-Record.</li>
<li><strong>Port 25 ausgehend muss offen sein.</strong> Viele Provider sperren ihn gegen Spam; bei netcup
schaltest du ihn per Support-Ticket frei. Ohne offenen Port 25 kannst du keine Mails an fremde
Server zustellen.</li>
<li>Ein <strong>PTR-/Reverse-DNS-Eintrag</strong> für die Server-IP (im netcup-SCP), der auf deinen
Mail-Hostnamen zeigt.</li>
</ul>
<p>Stalwart ist genügsam – für den Einstieg reicht ein kleiner Server. Wie viel dein Setup insgesamt
braucht, schätzt dir der <a href="/serverempfehlung/">Server-Rechner</a>.</p>
<div class="not-prose my-6 overflow-hidden rounded-xl border border-paprika-200 bg-paprika-50 dark:border-paprika-800 dark:bg-paprika-900/20"
     data-track-content data-content-name="Affiliate-Box · /tutorials/stalwart-mailserver/" data-content-piece="VPS 1000 G12">
  <div class="flex items-center justify-between border-b border-paprika-200 bg-paprika-100 px-4 py-1.5 text-xs font-semibold uppercase tracking-wide text-paprika-700 dark:border-paprika-800 dark:bg-paprika-900/40 dark:text-paprika-300">
    <span>🍳 Empfehlung</span>
    <span title="Mit * markierte Links sind Affiliate-Links.">Anzeige</span>
  </div>
  <div class="flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:justify-between">
    <div>
      <p class="text-lg font-bold text-slate-900 dark:text-white">VPS 1000 G12</p>
      <p class="mt-1 text-sm text-slate-600 dark:text-slate-300">4 vCore · 8 GB RAM · 256 GB NVMe</p>
      <p class="mt-1 text-sm font-semibold text-paprika-700 dark:text-paprika-400">ab 10,36 €/Monat</p>
      <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">Stalwart ist schlank – der VPS 1000 reicht für den Einstieg gut aus.</p>
    </div>
    <a href="https://www.netcup.com/de/server/vps/vps-1000-g12-12m?ref=44083" rel="sponsored noopener" target="_blank"
   data-track-event="Affiliate|netcup: Affiliate-Box|VPS 1000 G12 · {page}"
   class="inline-flex shrink-0 items-center justify-center rounded-lg bg-paprika-600 px-5 py-2.5 font-semibold text-white transition-colors hover:bg-paprika-700">
  Zu netcup →
</a>

  </div><div class="px-4 pb-4"><p class="not-prose my-3 flex flex-wrap items-center gap-x-2 gap-y-1 rounded-lg border border-herb-500/40 bg-herb-50 px-3 py-2 text-sm text-slate-700 dark:bg-herb-900/20 dark:text-slate-200">
  <span>💶 <strong>5 € Gutschein</strong> für netcup-Neukunden:</span><code data-track-voucher="36nc17844976032"
        class="rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 dark:bg-slate-800 dark:text-herb-400">36nc17844976032</code>
  <span class="text-xs text-slate-500 dark:text-slate-400">(nur Neukunden, keine Domains)</span>
</p></div>
</div>

<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-dns-records-anlegen">Schritt 1: DNS-Records anlegen</h3>
<p>Richte zuerst die DNS-Einträge ein – sie brauchen Zeit zum Propagieren. <code>DEINE_DOMAIN</code> ist deine
Mail-Domain, <code>DEINE_SERVER_IP</code> die IPv4-Adresse des Servers:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">mail.DEINE_DOMAIN.   A     DEINE_SERVER_IP
</span></span><span class="line"><span class="cl">DEINE_DOMAIN.        MX    10 mail.DEINE_DOMAIN.</span></span></code></pre></div>
</div>
<p>Der <strong>MX-Record</strong> verweist andere Mailserver an <code>mail.DEINE_DOMAIN</code>. Dieser Hostname ist die
Identität deines Servers. SPF, DKIM und DMARC ergänzen wir im Zustellbarkeits-Tutorial – die
DKIM-Schlüssel erzeugt Stalwart im Setup selbst.</p>
<h3 id="schritt-2-die-composeyaml-schreiben">Schritt 2: Die <code>compose.yaml</code> schreiben</h3>
<p>Lege einen Ordner an und wechsle hinein:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">mkdir -p /opt/stalwart <span class="o">&amp;&amp;</span> <span class="nb">cd</span> /opt/stalwart</span></span></code></pre></div>
</div>
<p>Erstelle die Datei <code>compose.yaml</code>:</p>
<div class="sk-code">
  <span class="sk-code-head">YAML</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">services</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">stalwart</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">stalwartlabs/stalwart:v0.16.14</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l">stalwart</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l">unless-stopped</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">ports</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;25:25&#34;</span><span class="w">       </span><span class="c"># SMTP (Server-zu-Server)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;465:465&#34;</span><span class="w">     </span><span class="c"># SMTPS (Senden, implizites TLS)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;587:587&#34;</span><span class="w">     </span><span class="c"># Submission (Senden, STARTTLS)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;143:143&#34;</span><span class="w">     </span><span class="c"># IMAP</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;993:993&#34;</span><span class="w">     </span><span class="c"># IMAPS</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;4190:4190&#34;</span><span class="w">   </span><span class="c"># ManageSieve</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;8080:8080&#34;</span><span class="w">   </span><span class="c"># Weboberfläche &amp; JMAP (Ersteinrichtung)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="s2">&#34;443:443&#34;</span><span class="w">     </span><span class="c"># HTTPS (nach der Einrichtung, eigenes Zertifikat)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span>- <span class="l">stalwart_data:/opt/stalwart</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">volumes</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="l">stalwart_data:</span></span></span></code></pre></div>
</div>
<p>Das Wichtigste: <strong>ein</strong> Service, <strong>ein</strong> Volume für alle Daten. Stalwart holt sich sein
TLS-Zertifikat später selbst per Let&rsquo;s Encrypt – einen separaten Reverse Proxy brauchst du dafür
nicht. Achte darauf, dass Port <strong>443</strong> auf dem Host frei ist (Stalwart nutzt ihn auch für den
Zertifikatsabruf, siehe Schritt 4).</p>
<h3 id="schritt-3-den-container-starten-und-das-startpasswort-holen">Schritt 3: Den Container starten und das Startpasswort holen</h3>
<p>Starte Stalwart:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose up -d</span></span></code></pre></div>
</div>
<p>Beim allerersten Start läuft Stalwart im <strong>Bootstrap-Modus</strong>: Es gibt noch keine Konfiguration,
und Port 8080 ist für die Ersteinrichtung offen. Dabei erzeugt es ein <strong>einmaliges
Administrator-Passwort</strong>, das du aus den Logs abliest:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose logs <span class="p">|</span> grep -A2 <span class="s2">&#34;temporary administrator&#34;</span></span></span></code></pre></div>
</div>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">🔑 Stalwart bootstrap mode - temporary administrator account
</span></span><span class="line"><span class="cl">   password: &lt;EINMAL-PASSWORT&gt;</span></span></code></pre></div>
</div>
<p>Notiere dieses Passwort – es wird nur einmal angezeigt. (Wenn du lieber ein festes Passwort
setzt, kannst du in der <code>compose.yaml</code> unter <code>environment:</code> ein
<code>STALWART_RECOVERY_ADMIN=admin:DEIN_PASSWORT</code> hinterlegen.)</p>
<h3 id="schritt-4-anmelden-und-den-einrichtungs-assistenten-durchlaufen">Schritt 4: Anmelden und den Einrichtungs-Assistenten durchlaufen</h3>
<p>Rufe die Weboberfläche im Browser auf: <code>http://DEINE_SERVER_IP:8080/admin</code>. Du landest auf der
Anmeldung. Melde dich als Benutzer <strong><code>admin</code></strong> mit dem Einmal-Passwort aus Schritt 3 an – die
Eingabe erfolgt in zwei Schritten (erst Benutzername, dann Passwort):</p>
<p><figure class="my-6"><img src="/tutorials/stalwart-mailserver/stalwart-login_hu_6a97246da2b059b6.webp" srcset="/tutorials/stalwart-mailserver/stalwart-login_hu_f98585ce477f211.webp 480w, /tutorials/stalwart-mailserver/stalwart-login_hu_6a97246da2b059b6.webp 768w, /tutorials/stalwart-mailserver/stalwart-login_hu_f8ca7e9283e1c12d.webp 1200w, /tutorials/stalwart-mailserver/stalwart-login_hu_dc0b1cbec541fe27.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/stalwart-mailserver/stalwart-login_hu_bf8b30e5adbfa6dc.webp"
    alt="Die Anmeldemaske der Stalwart-Weboberfläche mit Feld für den Benutzernamen." title="Der Login der Stalwart-Weboberfläche."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Der Login der Stalwart-Weboberfläche.</figcaption></figure></p>
<p>Nach der Anmeldung begrüßt dich der <strong>Einrichtungs-Assistent</strong>. Im ersten Schritt legst du die
<strong>Server-Identität</strong> fest:</p>
<ul>
<li><strong>Server Hostname:</strong> <code>mail.DEINE_DOMAIN</code> – der FQDN aus deinem A-Record.</li>
<li><strong>Default Email Domain:</strong> <code>DEINE_DOMAIN</code> – deine Mail-Domain.</li>
<li><strong>Automatically Obtain TLS Certificate</strong> aktiviert lassen – Stalwart holt das Let&rsquo;s-Encrypt-Zertifikat
selbst. Dafür muss <strong>Port 443</strong> von außen erreichbar sein: Stalwart nutzt standardmäßig die
<strong>TLS-ALPN-01</strong>-Challenge über 443, Port 80 braucht es dafür nicht.</li>
<li><strong>Generate Email Signing Keys</strong> aktiviert lassen – das erzeugt gleich deine <strong>DKIM-Schlüssel</strong>.</li>
</ul>
<p><figure class="my-6"><img src="/tutorials/stalwart-mailserver/stalwart-ersteinrichtung_hu_296e4e2801320a99.webp" srcset="/tutorials/stalwart-mailserver/stalwart-ersteinrichtung_hu_6414bf32979fd589.webp 480w, /tutorials/stalwart-mailserver/stalwart-ersteinrichtung_hu_296e4e2801320a99.webp 768w, /tutorials/stalwart-mailserver/stalwart-ersteinrichtung_hu_a27e4938f244fea7.webp 1200w, /tutorials/stalwart-mailserver/stalwart-ersteinrichtung_hu_8c9c2eb13d269dce.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/stalwart-mailserver/stalwart-ersteinrichtung_hu_832316163c36a06e.webp"
    alt="Der Ersteinrichtungs-Assistent von Stalwart mit den Feldern für Server-Hostname und Standard-Domain." title="Schritt 1 des Assistenten: die Server-Identität."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Schritt 1 des Assistenten: die Server-Identität.</figcaption></figure></p>
<p>Klick dich durch die weiteren Schritte des Assistenten:</p>
<ul>
<li><strong>Speicher (Storage):</strong> Die Voreinstellung <em>RocksDB</em> ist ein eingebetteter Schlüssel-Wert-Speicher
und für Einzelserver-Setups perfekt – kein externer Datenbankserver nötig. Nur für große,
geclusterte Installationen greifst du zu PostgreSQL o. Ä.</li>
<li><strong>Verzeichnis (Directory):</strong> Das <em>interne Verzeichnis</em> verwaltet Konten und Passwörter direkt in
Stalwart. Wer bereits ein zentrales LDAP/Active Directory betreibt, kann es hier stattdessen
anbinden – für den Einstieg bleibst du beim internen Verzeichnis.</li>
<li><strong>Logging:</strong> Legt fest, wie ausführlich Stalwart protokolliert. <code>Info</code> ist im Alltag ein guter
Kompromiss; bei Problemen drehst du kurzzeitig auf <code>Debug</code>.</li>
<li><strong>DNS:</strong> Für den Anfang genügt die manuelle Verwaltung – die anzulegenden Records zeigt dir
Stalwart später unter der jeweiligen Domain an.</li>
</ul>
<p>Zum Abschluss erzeugt Stalwart dein <strong>dauerhaftes Administrator-Konto</strong> und zeigt dessen Passwort
<strong>ein einziges Mal</strong> an – schreib es dir sofort weg. Ab jetzt ist der Bootstrap-Modus beendet und
Port 8080 nicht mehr offen für die Einrichtung; die Konsole erreichst du künftig über HTTPS.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Schon ein Reverse Proxy im Einsatz?
  </p>
  <div class="prose-kitchen text-sm">Anders als klassische Mailserver kann Stalwart seine <strong>Weboberfläche</strong> problemlos hinter einem
bestehenden <a href="/tutorials/reverse-proxy-traefik/">Traefik</a> laufen – route dann einfach den HTTP-Port
<strong>8080</strong> dorthin. Die <strong>Mail-Ports</strong> (25, 465, 587, 993 …) müssen aber weiterhin direkt am Server
anliegen, denn sie sprechen kein HTTP und lassen sich nicht über einen HTTP-Proxy leiten.</div>
</div>
<h3 id="schritt-5-domain-und-erstes-postfach-anlegen">Schritt 5: Domain und erstes Postfach anlegen</h3>
<p>Nach dem Setup bist du in der <strong>Verwaltungskonsole</strong>. Über die linke Navigation erreichst du
<em>Directory → Domains</em> und <em>Directory → Accounts</em>. Lege bei Bedarf weitere Domains an und dann dein
erstes Postfach:</p>
<p><figure class="my-6"><img src="/tutorials/stalwart-mailserver/stalwart-konsole_hu_2ef5c76733e28449.webp" srcset="/tutorials/stalwart-mailserver/stalwart-konsole_hu_9fc8af4a5ccc8ba2.webp 480w, /tutorials/stalwart-mailserver/stalwart-konsole_hu_2ef5c76733e28449.webp 768w, /tutorials/stalwart-mailserver/stalwart-konsole_hu_afc30161afa073ab.webp 1200w, /tutorials/stalwart-mailserver/stalwart-konsole_hu_19cde03b3a66ce0e.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/stalwart-mailserver/stalwart-konsole_hu_bd242b0b392c7da7.webp"
    alt="Die Stalwart-Verwaltungskonsole mit der Kontenübersicht." title="Die Verwaltungskonsole: Konten verwalten."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Die Verwaltungskonsole: Konten verwalten.</figcaption></figure></p>
<p>Über <strong>Create account</strong> (bzw. <em>Konto anlegen</em>) legst du ein Postfach an – E-Mail-Adresse,
angezeigter Name und ein starkes Passwort (Passwortmanager!). Dieses Konto kann sich anschließend
per IMAP/JMAP und SMTP anmelden:</p>
<p><figure class="my-6"><img src="/tutorials/stalwart-mailserver/stalwart-konto-anlegen_hu_1a34a4be611e9c1c.webp" srcset="/tutorials/stalwart-mailserver/stalwart-konto-anlegen_hu_861e75c9986096d3.webp 480w, /tutorials/stalwart-mailserver/stalwart-konto-anlegen_hu_1a34a4be611e9c1c.webp 768w, /tutorials/stalwart-mailserver/stalwart-konto-anlegen_hu_6f6515fa35490bf6.webp 1200w, /tutorials/stalwart-mailserver/stalwart-konto-anlegen_hu_27303f9e2190956f.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/stalwart-mailserver/stalwart-konto-anlegen_hu_630cbc48b81a2a18.webp"
    alt="Das Formular zum Anlegen eines neuen Postfachs in Stalwart." title="Ein neues Postfach anlegen."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Ein neues Postfach anlegen.</figcaption></figure></p>
<h3 id="schritt-6-in-einem-mailprogramm-einrichten">Schritt 6: In einem Mailprogramm einrichten</h3>
<p>Trage das neue Konto in deinem Mailprogramm ein. Stalwart unterstützt <strong>Autodiscovery</strong>, meist
reicht also E-Mail-Adresse und Passwort. Manuell nutzt du:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">IMAP:        mail.DEINE_DOMAIN, Port 993, SSL/TLS
</span></span><span class="line"><span class="cl">SMTP:        mail.DEINE_DOMAIN, Port 587, STARTTLS
</span></span><span class="line"><span class="cl">Benutzer:    die volle E-Mail-Adresse</span></span></code></pre></div>
</div>
<p>Neben dem altbewährten IMAP spricht Stalwart auch <strong>JMAP</strong> – ein modernes, JSON-basiertes Protokoll,
das für heutige Netze entworfen wurde. JMAP überträgt nur echte Änderungen statt ganze Ordner neu
zu synchronisieren, kommt mit einer einzigen Verbindung aus und ist damit spürbar sparsamer mit
Akku und Datenvolumen – gerade auf dem Handy. Unterstützt dein Mail-Client JMAP (z. B. die
Thunderbird-Familie in neueren Versionen), profitierst du direkt davon; ansonsten bleibst du bei
IMAP, das genauso funktioniert.</p>
<p>Eine Mail von dir an dich selbst sollte sofort im Posteingang landen – das beweist, dass lokale
Zustellung, IMAP und SMTP stehen. Der Härtetest ist aber das Senden <strong>nach außen</strong> und der Empfang
<strong>von außen</strong>, und da entscheidet die Zustellbarkeit.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-sky-300 bg-sky-50 dark:border-sky-800 dark:bg-sky-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">ℹ️</span>Hinweis
  </p>
  <div class="prose-kitchen text-sm">Prüfe deine Zustellbarkeit nach dem Setup mit einem Dienst wie
<a href="https://www.mail-tester.com">mail-tester.com</a>: Er bewertet SPF, DKIM, DMARC und Reverse DNS. Wie
du auf die volle Punktzahl kommst, ist Thema des Zustellbarkeits-Tutorials.</div>
</div>
<h3 id="schritt-7-spam-filter-und-sieve-regeln">Schritt 7: Spam-Filter und Sieve-Regeln</h3>
<p>Ein großer Vorteil von Stalwart: Der <strong>Spam- und Phishing-Filter ist bereits eingebaut</strong> und aktiv
– du musst keinen separaten Rspamd-Container betreiben und pflegen. Er bewertet eingehende Mails
anhand zahlreicher Merkmale (Reputation, SPF/DKIM/DMARC-Ergebnis, Inhaltsheuristiken) und markiert
oder blockiert Verdächtiges. In der Konsole unter <em>Settings → Spam Filter</em> kannst du die
Empfindlichkeit anpassen und Absender auf Allow- oder Blocklisten setzen.</p>
<p>Für eigene Regeln beim Ein- und Ausgang unterstützt Stalwart <strong>Sieve</strong> – die standardisierte
Filtersprache. Damit sortierst du z. B. Newsletter automatisch in einen Ordner oder leitest
bestimmte Absender weiter. Sieve-Skripte verwaltest du serverseitig (über ManageSieve auf Port
4190) oder direkt in der Weboberfläche, sodass die Regeln unabhängig vom Mailprogramm greifen –
auch dann, wenn dein Rechner aus ist.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Tipp
  </p>
  <div class="prose-kitchen text-sm">Weil der Filter serverseitig arbeitet, gilt er für <strong>alle</strong> deine Geräte gleichzeitig. Eine einmal
angelegte Sieve-Regel oder eine Spam-Entscheidung wirkt am Handy genauso wie am Laptop – anders als
bei clientseitigen Filtern, die du auf jedem Gerät neu einrichten müsstest.</div>
</div>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<div class="troubleshoot not-prose">
<p><strong>Die Weboberfläche auf Port 8080 antwortet nicht.</strong> Der Container ist noch am Hochfahren oder Port
8080 ist belegt/geblockt. <code>docker compose ps</code> prüfen, <code>docker compose logs</code> lesen und
sicherstellen, dass die <a href="/tutorials/firewall-ufw-einrichten/">Firewall</a> Port 8080 (und später 443)
durchlässt.</p>
<p><strong>Ich habe das Bootstrap-Passwort verpasst.</strong> Es wird nur einmal geloggt. Setze in der
<code>compose.yaml</code> ein <code>STALWART_RECOVERY_ADMIN=admin:DEIN_PASSWORT</code> unter <code>environment:</code> und starte
mit <code>docker compose up -d</code> neu – damit hast du ein festes Recovery-Admin-Konto.</p>
<p><strong>Kein TLS-Zertifikat, die HTTPS-Adresse zeigt eine Warnung.</strong> Let&rsquo;s Encrypt erreicht deinen Server
nicht auf Port 443 (Stalwart nutzt die TLS-ALPN-01-Challenge über 443), oder der A-Record von
<code>mail.DEINE_DOMAIN</code> stimmt nicht. A-Record prüfen und Port 443 in der Firewall öffnen – Stalwart
wiederholt die Zertifikatsanforderung danach automatisch.</p>
<p><strong>Mails nach außen bleiben hängen, Logs zeigen Timeouts auf Port 25.</strong> Dein Provider sperrt
ausgehenden SMTP-Verkehr auf Port 25. Port 25 ausgehend beim Provider freischalten lassen (bei
netcup per Ticket). Ohne das ist keine Zustellung an fremde Server möglich.</p>
<p><strong>Andere Server nehmen deine Mails nicht an oder sie landen im Spam.</strong> Fehlender oder falscher
PTR-Eintrag, kein SPF/DKIM/DMARC. Das ist kein Fehler von Stalwart, sondern Sache der
DNS-/Reputations-Konfiguration – siehe das Zustellbarkeits-Tutorial.</p>

</div>

<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<p><strong>Updates.</strong> Stalwart ist ein einzelner Container – ein Update ist entsprechend einfach:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/stalwart
</span></span><span class="line"><span class="cl">docker compose pull <span class="o">&amp;&amp;</span> docker compose up -d</span></span></code></pre></div>
</div>
<p>Lies vor größeren Sprüngen die Release-Notes auf
<a href="https://github.com/stalwartlabs/stalwart/releases">GitHub</a>; bleib bei einem konkreten Versions-Tag
(wie hier <code>v0.16.14</code>) statt <code>latest</code>, damit Updates reproduzierbar bleiben.</p>
<p><strong>Backups.</strong> Alle Daten – Nachrichten, Konten, Konfiguration und die <strong>DKIM-Schlüssel</strong> – liegen im
Volume <code>stalwart_data</code>. Sichere dieses Volume regelmäßig weg vom Server, am saubersten verschlüsselt
mit <a href="/tutorials/backups-mit-restic/">restic</a>. Weil Stalwart die Daten im laufenden Betrieb
schreibt, sicherst du am konsistentesten, indem du den Container kurz stoppst
(<code>docker compose stop</code>), das Volume sicherst und wieder startest. Die DKIM-Schlüssel sind besonders
wichtig: Gehen sie verloren, brechen nach einer Wiederherstellung deine Signaturen, bis du die
DNS-Records neu setzt. Ein Backup, das du nie zurückgespielt hast, ist nur ein Hoffnungswert –
teste die Wiederherstellung einmal auf einem Testsystem.</p>
<p><strong>Reputation im Blick behalten.</strong> Prüfe gelegentlich, ob deine Server-IP auf einer Blockliste
gelandet ist, und wirf einen Blick in die Stalwart-Konsole unter <em>Observability</em>. Ein
kompromittiertes Postfach, das Spam verschickt, ruiniert die Reputation deiner ganzen Domain
schnell.</p>
]]></content:encoded></item><item><title>Eigener Mailserver mit Mailcow: Setup von Grund auf</title><link>https://serverkueche.de/tutorials/mailserver-mailcow-aufsetzen/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><author>feedback@serverkueche.de (Serverküche)</author><guid>https://serverkueche.de/tutorials/mailserver-mailcow-aufsetzen/</guid><description>Mailcow (dockerized) auf einem eigenen Server aufsetzen: Postfix, Dovecot, Rspamd und SOGo-Webmail unter deiner Domain – kompletter Mailserver-Stack mit HTTPS.</description><content:encoded><![CDATA[<p>Deine E-Mails sind das Rückgrat deiner digitalen Identität – Passwort-Resets, Rechnungen,
Verträge laufen alle darüber. Trotzdem liegen sie bei den meisten bei einem Konzern in den USA.
Mit <strong>Mailcow</strong> holst du dir den kompletten Mailserver auf den eigenen Server: Postfix, Dovecot,
Spam-Filter und Webmail, sauber verpackt in Docker. Dieses Tutorial bringt den Stack zum Laufen –
die knifflige <strong>Zustellbarkeit</strong> (SPF, DKIM, DMARC, Reverse DNS) behandeln wir danach im
<a href="/tutorials/mailserver-zustellbarkeit/" data-track-event="Navigation|Tutorial-Link|/tutorials/mailserver-zustellbarkeit/ ← /tutorials/mailserver-mailcow-aufsetzen/">Zustellbarkeits-Rezept</a>.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Einen eigenen Mailserver zu betreiben ist Arbeit – sei ehrlich zu dir
  </p>
  <div class="prose-kitchen text-sm">Ein Mailserver ist kein „einmal aufsetzen und vergessen&quot;. Du bist ab jetzt für Zustellbarkeit,
Reputation, Backups und Updates verantwortlich. Landen deine Mails im Spam oder fällt der Server
aus, betrifft das deine wichtigste Kommunikation. Wenn du das nicht regelmäßig pflegen willst,
ist ein seriöser Mail-Hoster oft die bessere Wahl – das ist keine Schwäche, sondern eine ehrliche
Abwägung. Wer die Kontrolle wirklich will, ist hier richtig.</div>
</div>
<h2 id="was-bauen-wir">Was bauen wir?</h2>
<p>Am Ende läuft ein <strong>vollständiger Mailserver-Stack</strong> auf deinem Server, erreichbar als Webmail
unter <code>https://mail.DEINE_DOMAIN</code> mit gültigem Let&rsquo;s-Encrypt-Zertifikat. Enthalten sind:</p>
<ul>
<li><strong>Postfix</strong> als SMTP-Server (Senden/Empfangen),</li>
<li><strong>Dovecot</strong> für IMAP/POP3 (Abruf durch Mail-Programme),</li>
<li><strong>Rspamd</strong> als moderner Spam- und Signaturfilter,</li>
<li><strong>SOGo</strong> als Webmail samt Kalender und Kontakten (CalDAV/CardDAV),</li>
<li>eine <strong>Admin-Oberfläche</strong> zum Anlegen von Domains, Postfächern und Aliassen.</li>
</ul>
<p>Das Ganze kommt als <strong>mailcow-dockerized</strong> – ein fertig geschnürtes Compose-Projekt aus <strong>18
Containern</strong>, das das notorisch komplizierte Mailserver-Setup handhabbar macht. Wir setzen auf
<strong>Debian 13</strong> mit <strong>Docker 29.6</strong> und <strong>Compose v5.3</strong> auf; mailcow ist ein <em>Rolling Release</em> und
wird über Monats-Tags gepflegt (du aktualisierst per <code>update.sh</code>, es gibt keine klassische
Versionsnummer). Getestet haben wir gegen den Stand <strong>2026-07b</strong> mit <strong>Postfix 3.10.12</strong>,
<strong>Dovecot 2.3.21.1</strong>, <strong>Rspamd 4.1.4</strong> und <strong>SOGo 5.12.10</strong>.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-paprika-400 bg-paprika-50 dark:border-paprika-700 dark:bg-paprika-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🔥</span>Mailcow braucht einen eigenen Server
  </p>
  <div class="prose-kitchen text-sm">Anders als die meisten Rezepte hier läuft mailcow <strong>nicht</strong> hinter dem gemeinsamen
<a href="/tutorials/reverse-proxy-traefik/">Traefik-Reverse-Proxy</a>. Es bringt seinen <strong>eigenen</strong> Webserver
mit und belegt die Ports <strong>80/443</strong> selbst, dazu die Mail-Ports <strong>25, 465, 587, 143, 993</strong> (und
mehr). Betreibe mailcow deshalb auf einem <strong>dedizierten Server</strong>, auf dem sonst nichts diese Ports
braucht – nicht auf demselben Host wie dein Traefik-Stack.</div>
</div>
<h2 id="voraussetzungen">Voraussetzungen</h2>
<ul>
<li>Ein <strong>eigener Server</strong> mit <strong>Debian 13</strong>, auf dem <a href="/tutorials/docker-installieren/">Docker installiert</a>
ist und der <strong>nur</strong> für mailcow da ist (Ports 80/443 und die Mail-Ports frei).</li>
<li><strong>Mindestens 6 GB RAM</strong> – der Spam-Filter (Rspamd) und der optionale Virenscanner (ClamAV)
brauchen Luft. Mit weniger wird es zäh oder ClamAV muss aus.</li>
<li>Eine <strong>Domain</strong>, deren <a href="/tutorials/domain-mit-server-verbinden/">DNS du selbst steuerst</a>. Ohne
passende Records (v. a. <strong>MX</strong> und <strong>Reverse DNS</strong>) nimmt kein anderer Mailserver deine Post an.</li>
<li><strong>Port 25 ausgehend muss offen sein.</strong> Viele Provider sperren ihn standardmäßig gegen Spam –
bei netcup schaltest du ihn per Support-Ticket frei. Ohne offenen Port 25 kannst du <strong>keine</strong>
Mails an andere Server zustellen.</li>
<li>Ein <strong>PTR-/Reverse-DNS-Eintrag</strong> für die Server-IP, den du im Provider-Panel setzt (bei netcup
im SCP). Er muss auf <code>mail.DEINE_DOMAIN</code> zeigen.</li>
</ul>
<p>Mailcow ist RAM-hungrig, deshalb empfehlen wir mindestens den VPS 2000. Wie viel dein konkreter
Bedarf ist, schätzt dir der <a href="/serverempfehlung/">Server-Rechner</a>.</p>
<div class="not-prose my-6 overflow-hidden rounded-xl border border-paprika-200 bg-paprika-50 dark:border-paprika-800 dark:bg-paprika-900/20"
     data-track-content data-content-name="Affiliate-Box · /tutorials/mailserver-mailcow-aufsetzen/" data-content-piece="VPS 2000 G12">
  <div class="flex items-center justify-between border-b border-paprika-200 bg-paprika-100 px-4 py-1.5 text-xs font-semibold uppercase tracking-wide text-paprika-700 dark:border-paprika-800 dark:bg-paprika-900/40 dark:text-paprika-300">
    <span>🍳 Empfehlung</span>
    <span title="Mit * markierte Links sind Affiliate-Links.">Anzeige</span>
  </div>
  <div class="flex flex-col gap-4 p-4 sm:flex-row sm:items-center sm:justify-between">
    <div>
      <p class="text-lg font-bold text-slate-900 dark:text-white">VPS 2000 G12</p>
      <p class="mt-1 text-sm text-slate-600 dark:text-slate-300">8 vCore · 16 GB RAM · 512 GB NVMe</p>
      <p class="mt-1 text-sm font-semibold text-paprika-700 dark:text-paprika-400">ab 19,24 €/Monat</p>
      <p class="mt-2 text-sm text-slate-600 dark:text-slate-400">Für mailcow inklusive Spam- und Virenfilter sollten es 8 GB RAM sein.</p>
    </div>
    <a href="https://www.netcup.com/de/server/vps/vps-2000-g12-12m?ref=44083" rel="sponsored noopener" target="_blank"
   data-track-event="Affiliate|netcup: Affiliate-Box|VPS 2000 G12 · {page}"
   class="inline-flex shrink-0 items-center justify-center rounded-lg bg-paprika-600 px-5 py-2.5 font-semibold text-white transition-colors hover:bg-paprika-700">
  Zu netcup →
</a>

  </div><div class="px-4 pb-4"><p class="not-prose my-3 flex flex-wrap items-center gap-x-2 gap-y-1 rounded-lg border border-herb-500/40 bg-herb-50 px-3 py-2 text-sm text-slate-700 dark:bg-herb-900/20 dark:text-slate-200">
  <span>💶 <strong>5 € Gutschein</strong> für netcup-Neukunden:</span><code data-track-voucher="36nc17844976032"
        class="rounded bg-white px-2 py-0.5 font-mono text-sm font-semibold text-herb-800 dark:bg-slate-800 dark:text-herb-400">36nc17844976032</code>
  <span class="text-xs text-slate-500 dark:text-slate-400">(nur Neukunden, keine Domains)</span>
</p></div>
</div>

<h2 id="schritt-für-schritt">Schritt für Schritt</h2>
<h3 id="schritt-1-dns-records-anlegen">Schritt 1: DNS-Records anlegen</h3>
<p>Bevor du irgendetwas installierst, richte die DNS-Einträge ein – sie brauchen Zeit zum
Propagieren, und mailcow holt beim Start das TLS-Zertifikat für den Hostnamen. Lege bei deinem
DNS-Anbieter (siehe <a href="/tutorials/domain-mit-server-verbinden/">Domain mit dem Server verbinden</a>)
diese Einträge an. <code>DEINE_DOMAIN</code> ist deine Mail-Domain (z. B. <code>beispiel.de</code>), <code>DEINE_SERVER_IPV4</code>
die IPv4-Adresse des Servers:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">mail.DEINE_DOMAIN.   A      DEINE_SERVER_IPV4
</span></span><span class="line"><span class="cl">mail.DEINE_DOMAIN.   AAAA   DEINE_SERVER_IPV6      (falls du IPv6 nutzt)
</span></span><span class="line"><span class="cl">DEINE_DOMAIN.        MX     10 mail.DEINE_DOMAIN.</span></span></code></pre></div>
</div>
<p>Der <strong>MX-Record</strong> sagt anderen Mailservern: „Post für <code>@DEINE_DOMAIN</code> nimmt <code>mail.DEINE_DOMAIN</code>
entgegen.&quot; Der Hostname <code>mail.DEINE_DOMAIN</code> ist der <strong>FQDN des Mailservers</strong> – nicht zu verwechseln
mit der Mail-Domain selbst. Die weiteren Records für Zustellbarkeit (SPF, DKIM, DMARC) und den
<strong>PTR-Eintrag</strong> behandeln wir im Folge-Tutorial zur Zustellbarkeit ausführlich; der PTR-Eintrag
sollte aber schon jetzt gesetzt sein, weil viele Server sonst gar nicht erst annehmen.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-herb-400 bg-herb-50 dark:border-herb-700 dark:bg-herb-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🧑‍🍳</span>Tipp
  </p>
  <div class="prose-kitchen text-sm">Setz die <strong>TTL</strong> der Records vor dem Umzug niedrig (z. B. 300 Sekunden). Dann greifen spätere
Korrekturen schnell, während du testest. Nach dem Feinschliff kannst du sie wieder erhöhen.</div>
</div>
<h3 id="schritt-2-voraussetzungen-auf-dem-server-installieren">Schritt 2: Voraussetzungen auf dem Server installieren</h3>
<p>Melde dich per SSH auf dem <a href="/tutorials/ssh-absichern/">abgesicherten Server</a> an. Mailcows
Konfigurations-Generator braucht neben Docker auch <code>git</code> und <code>jq</code> – letzteres wird gern vergessen,
und der Generator bricht sonst mit <code>Cannot find command 'jq'</code> ab. Installiere beides:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo apt update <span class="o">&amp;&amp;</span> sudo apt install -y git jq</span></span></code></pre></div>
</div>
<p>Prüfe, dass Docker und das Compose-Plugin laufen:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker --version <span class="o">&amp;&amp;</span> docker compose version</span></span></code></pre></div>
</div>
<p>Du solltest zwei Versionszeilen sehen – bei uns <code>Docker version 29.6.1</code> und <code>Docker Compose version v5.3.1</code>. Mailcow verlangt mindestens <strong>Docker 24</strong>; darunter bricht der Konfigurations-Generator ab.
Fehlt etwas, hol das <a href="/tutorials/docker-installieren/">Docker-Setup</a> nach, bevor du weitermachst.</p>
<h3 id="schritt-3-mailcow-klonen-und-konfigurieren">Schritt 3: Mailcow klonen und konfigurieren</h3>
<p>Mailcow wird als Git-Repository ausgeliefert und <strong>nicht</strong> über einen einzelnen Image-Tag
gepflegt. Klone es nach <code>/opt</code> und wechsle hinein. Wichtig ist die <code>umask 0022</code>, damit die
erzeugten Dateien die richtigen Rechte bekommen:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo su
</span></span><span class="line"><span class="cl"><span class="nb">umask</span> <span class="m">0022</span>
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> /opt
</span></span><span class="line"><span class="cl">git clone https://github.com/mailcow/mailcow-dockerized
</span></span><span class="line"><span class="cl"><span class="nb">cd</span> mailcow-dockerized</span></span></code></pre></div>
</div>
<p>Jetzt erzeugst du die zentrale Konfigurationsdatei <code>mailcow.conf</code> mit dem interaktiven Generator:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">./generate_config.sh</span></span></code></pre></div>
</div>
<p>Zuerst prüft er, ob die IP deines Servers auf der <strong>Spamhaus-Bad-ASN-Liste</strong> steht – ein sinnvoller
Frühwarner, denn aus manchen Netzen nimmt kaum ein Mailserver Post an:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Detecting if your IP is listed on Spamhaus Bad ASN List...
</span></span><span class="line"><span class="cl">Check completed! Your IP is clean</span></span></code></pre></div>
</div>
<p>Danach stellt er dir nacheinander diese Fragen:</p>
<ul>
<li><strong>Mail server hostname (FQDN):</strong> Trage hier <code>mail.DEINE_DOMAIN</code> ein – den <strong>Hostnamen</strong> des
Servers, nicht deine Mail-Domain. Der Wert muss zum A-Record aus Schritt 1 passen.</li>
<li><strong>Timezone:</strong> Meist schon korrekt vorausgefüllt (z. B. <code>Europe/Berlin</code>) – mit Enter bestätigen.</li>
<li><strong>Choose the Branch with it&rsquo;s number [1/2/3]:</strong> Wähle <strong><code>1</code></strong> für den <code>master</code>-Branch – das ist
der stabile, empfohlene Stand. <code>2</code> ist <code>nightly</code> (Testing), <code>3</code> der abgekündigte <code>legacy</code>-Branch.</li>
</ul>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-sky-300 bg-sky-50 dark:border-sky-800 dark:bg-sky-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">ℹ️</span>Die ClamAV-Frage siehst du nur auf kleinen Servern
  </p>
  <div class="prose-kitchen text-sm">Nach dem Virenscanner (<em>Do you want to disable ClamAV now?</em>) fragt der Generator <strong>nur</strong>, wenn der
Server <strong>höchstens 2,5 GiB RAM</strong> hat. Auf einer Maschine mit 6–8 GB stellt er <code>SKIP_CLAMD=n</code> still
ein, ClamAV läuft also von vornherein mit. Abschalten kannst du ihn jederzeit, indem du in der
<code>mailcow.conf</code> <code>SKIP_CLAMD=y</code> setzt und den Stack neu startest.</div>
</div>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>IPv6-Hosts: Docker wird neu gestartet
  </p>
  <div class="prose-kitchen text-sm"><p>Findet der Generator eine funktionierende <strong>IPv6-Verbindung</strong> (Default-Route plus erreichbare
Gegenstelle), muss auch Docker IPv6 sprechen – sonst könnte mailcow zu einem <strong>offenen Relay</strong>
werden. Fehlt <code>/etc/docker/daemon.json</code>, fragt er deshalb:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">/etc/docker/daemon.json not found. Create it with IPv6 settings? [Y/n]</span></span></code></pre></div>
</div>
<p>Bestätigst du mit Enter, legt er die Datei selbst an (bei Docker ≥ 28 genügt <code>{&quot;ipv6&quot;: true}</code>) und
startet Docker <strong>sofort neu</strong>. Genau deshalb gehört mailcow auf einen <strong>eigenen</strong> Server: Der
Neustart reißt jeden anderen Container auf dem Host mit. Antwortest du mit <code>n</code>, bricht der Generator
ab und du musst die Einstellung von Hand nachtragen. Willst du bewusst ohne IPv6 fahren, setzt du
später in der <code>mailcow.conf</code> <code>ENABLE_IPV6=false</code>.</p>
</div>
</div>
<p>Wirf danach einen Blick in die erzeugte <code>mailcow.conf</code>. Die wichtigsten Werte stehen oben:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">grep -E <span class="s2">&#34;^(MAILCOW_HOSTNAME|TZ|HTTP_PORT|HTTPS_PORT|SKIP_CLAMD|ENABLE_IPV6)=&#34;</span> mailcow.conf</span></span></code></pre></div>
</div>
<p>Auf unserem Testserver sah das so aus – <code>SKIP_CLAMD=n</code> heißt „ClamAV läuft mit&quot;:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">MAILCOW_HOSTNAME=mail.DEINE_DOMAIN
</span></span><span class="line"><span class="cl">HTTP_PORT=80
</span></span><span class="line"><span class="cl">HTTPS_PORT=443
</span></span><span class="line"><span class="cl">TZ=Europe/Berlin
</span></span><span class="line"><span class="cl">SKIP_CLAMD=n
</span></span><span class="line"><span class="cl">ENABLE_IPV6=true</span></span></code></pre></div>
</div>
<p>Die Datei enthält auch alle <strong>Port-Belegungen</strong>. In der Standardkonfiguration nimmt mailcow diese
Host-Ports in Beschlag:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">25    SMTP     (Server-zu-Server-Zustellung)
</span></span><span class="line"><span class="cl">465   SMTPS    (Senden mit impliziter TLS)
</span></span><span class="line"><span class="cl">587   Submission (Senden durch Mailprogramme, STARTTLS)
</span></span><span class="line"><span class="cl">143   IMAP  /  993 IMAPS   (Abruf durch Mailprogramme)
</span></span><span class="line"><span class="cl">110   POP3  /  995 POP3S
</span></span><span class="line"><span class="cl">4190  Sieve    (serverseitige Filterregeln)
</span></span><span class="line"><span class="cl">80    HTTP  /  443 HTTPS   (Webmail + Admin + ACME)</span></span></code></pre></div>
</div>
<p>Diese Ports müssen auf dem Host <strong>frei</strong> sein – darum der eigene Server. Läuft dort schon ein
Reverse Proxy auf 80/443, kollidiert mailcow damit.</p>
<h3 id="schritt-4-firewall-öffnen">Schritt 4: Firewall öffnen</h3>
<p>Deine <a href="/tutorials/firewall-ufw-einrichten/">UFW-Firewall</a> muss die Mail- und Web-Ports
durchlassen. Neben SSH gibst du frei:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">sudo ufw allow 25/tcp
</span></span><span class="line"><span class="cl">sudo ufw allow 80,443/tcp
</span></span><span class="line"><span class="cl">sudo ufw allow 465,587/tcp
</span></span><span class="line"><span class="cl">sudo ufw allow 143,993/tcp
</span></span><span class="line"><span class="cl">sudo ufw allow 110,995/tcp
</span></span><span class="line"><span class="cl">sudo ufw allow 4190/tcp</span></span></code></pre></div>
</div>
<p>Nutzt du zusätzlich die <a href="/tutorials/netcup-firewall-einrichten/">netcup-Firewall im SCP</a>, gib
dieselben Ports auch dort frei – sonst blockt die Perimeter-Firewall den Verkehr, bevor er den
Server erreicht.</p>
<h3 id="schritt-5-den-stack-starten">Schritt 5: Den Stack starten</h3>
<p>Jetzt lädst du die Images und startest den Stack. Rechne mit <strong>rund 4,5 GB</strong> auf der Platte – der
Stack besteht aus 18 Diensten, die dicksten sind SOGo, Dovecot und Postfix:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose pull
</span></span><span class="line"><span class="cl">docker compose up -d</span></span></code></pre></div>
</div>
<p>Das erste Hochfahren dauert ein paar Minuten – Datenbank, Suchindex und die einzelnen Dienste
initialisieren sich. Beobachte den Fortschritt mit:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">docker compose ps</span></span></code></pre></div>
</div>
<p>In der Spalte <code>STATUS</code> steht bei jedem Dienst <code>Up …</code>; die Container mit eigenem Healthcheck (etwa
<code>unbound-mailcow</code> und <code>clamd-mailcow</code>) melden zusätzlich <code>(healthy)</code>. Mailcow holt in dieser
Zeit im Hintergrund über seinen eingebauten ACME-Client das <strong>Let&rsquo;s-Encrypt-Zertifikat</strong> für
<code>mail.DEINE_DOMAIN</code>. Dafür müssen der A-Record und Port 80 von außen erreichbar sein – ist das
nicht der Fall, bleibt der <code>acme-mailcow</code>-Container in einer Wiederhol-Schleife und du siehst das
in seinen Logs (<code>docker compose logs acme-mailcow</code>).</p>
<h3 id="schritt-6-erste-anmeldung-an-der-admin-oberfläche">Schritt 6: Erste Anmeldung an der Admin-Oberfläche</h3>
<p>Rufe <code>https://mail.DEINE_DOMAIN</code> im Browser auf. Du landest in der mailcow-UI. Melde dich mit den
<strong>Standard-Zugangsdaten</strong> an:</p>
<div class="sk-code">
  <span class="sk-code-head">Ausgabe</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">Benutzer:  admin
</span></span><span class="line"><span class="cl">Passwort:  moohoo</span></span></code></pre></div>
</div>
<p>Zeigt die Maske „Anmeldung als Benutzer&quot;, klick unten auf <strong>„Als Admin anmelden&quot;</strong> – das
Login-Formular auf der Startseite meldet dich sonst als Postfach-Nutzer an, nicht als Administrator.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-paprika-400 bg-paprika-50 dark:border-paprika-700 dark:bg-paprika-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">🔥</span>Standard-Passwort sofort ändern
  </p>
  <div class="prose-kitchen text-sm"><code>admin</code> / <code>moohoo</code> ist öffentlich bekannt. <strong>Ändere das Admin-Passwort umgehend</strong> unter
<em>System → Konfiguration → Zugang</em>: In der Tabelle <strong>Administratoren</strong> klickst du beim Benutzer
<code>admin</code> auf <strong>Bearbeiten</strong>. Im selben Reiter aktivierst du gleich die
<strong>Zwei-Faktor-Authentisierung</strong> (TOTP oder WebAuthn). Solange das Standard-Passwort gilt, ist dein
Mailserver offen wie ein Scheunentor.</div>
</div>
<p>Nach dem Login landest du im mailcow-Dashboard mit dem Überblick über deine Dienste:</p>
<p><figure class="my-6"><img src="/tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_8f0da6babdc6df3c.webp" srcset="/tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_c51c5976f35ffd19.webp 480w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_8f0da6babdc6df3c.webp 768w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_69a66b8d89901c6c.webp 1200w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_9f643aab23ba87b1.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/mailserver-mailcow-aufsetzen/mailcow-dashboard_hu_63170d51f32e9172.webp"
    alt="Das mailcow-Dashboard nach der ersten Anmeldung mit Systemüberblick." title="Das mailcow-Dashboard direkt nach dem Login."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Das mailcow-Dashboard direkt nach dem Login.</figcaption></figure></p>
<h3 id="schritt-7-mail-domain-und-erstes-postfach-anlegen">Schritt 7: Mail-Domain und erstes Postfach anlegen</h3>
<p>In mailcow trennst du <strong>Domain</strong> (z. B. <code>beispiel.de</code>) und <strong>Postfach</strong> (z. B.
<code>kontakt@beispiel.de</code>).</p>
<p>Über <strong>E-Mail → Konfiguration</strong> in der oberen Navigationsleiste verwaltest du Domains und Postfächer
in getrennten Reitern:</p>
<p><figure class="my-6"><img src="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_5e9ebc06065a6393.webp" srcset="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_dc3762743ff93980.webp 480w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_5e9ebc06065a6393.webp 768w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_244cd7305681a01e.webp 1200w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_12565b8184e7fa05.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mail-setup_hu_db5cd71c0f0eed07.webp"
    alt="Die Mail-Setup-Oberfläche von mailcow mit den Reitern für Domains und Mailboxen." title="E-Mail → Konfiguration: Domains und Postfächer verwalten."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">E-Mail → Konfiguration: Domains und Postfächer verwalten.</figcaption></figure></p>
<ol>
<li>
<p>Klick auf dem Reiter <strong>Domains</strong> auf <strong>Domain hinzufügen</strong> und trage deine Domain <code>DEINE_DOMAIN</code>
ein. Die Standardwerte (Postfach- und Alias-Kontingente) sind für den Anfang in Ordnung.
Speichere unten mit <strong>„Domain hinzufügen und SOGo neustarten&quot;</strong> – nicht mit „Nur Domain
hinzufügen&quot;. Warum, steht gleich im Kasten darunter.</p>
<p><figure class="my-6"><img src="/tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_b9142948d5c5b473.webp" srcset="/tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_c0c8f23175efaf0d.webp 480w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_b9142948d5c5b473.webp 768w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_ec9658fb575187fb.webp 1200w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_bd604032a758297c.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/mailserver-mailcow-aufsetzen/mailcow-domain-anlegen_hu_484d07552631056b.webp"
    alt="Der Dialog zum Hinzufügen einer Mail-Domain in mailcow." title="Eine neue Mail-Domain anlegen."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Eine neue Mail-Domain anlegen.</figcaption></figure></p>
</li>
<li>
<p>Wechsle auf den Reiter <strong>Mailboxen</strong> und klick auf <strong>Mailbox hinzufügen</strong> – Benutzername, Domain,
voller Name und ein <strong>starkes</strong> Passwort (Passwortmanager!). Dieses Postfach kann sich
anschließend an der Webmail und per IMAP/SMTP anmelden.</p>
<p><figure class="my-6"><img src="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_5ab7153b52aa8cad.webp" srcset="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_812dc501bc27658c.webp 480w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_5ab7153b52aa8cad.webp 768w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_ec3e7a5b2ca375a6.webp 1200w, /tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_ebc5f517d8b20880.webp 1920w" sizes="(min-width: 768px) 768px, 100vw"
    width="768" height="432"
    data-full="/tutorials/mailserver-mailcow-aufsetzen/mailcow-mailbox-anlegen_hu_93fa943c407b3955.webp"
    alt="Der Dialog zum Anlegen eines neuen Postfachs in mailcow." title="Ein neues Postfach anlegen."
    loading="lazy" decoding="async" class="rounded-lg"><figcaption class="mt-2 text-sm text-center text-slate-500 italic">Ein neues Postfach anlegen.</figcaption></figure></p>
</li>
</ol>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-amber-400 bg-amber-50 dark:border-amber-700 dark:bg-amber-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">⚠️</span>Ohne SOGo-Neustart bleibt die Webmail zu
  </p>
  <div class="prose-kitchen text-sm">SOGo liest die Liste der Mail-Domains <strong>nur beim Start</strong> seines Containers ein. Legst du die erste
Domain mit „Nur Domain hinzufügen&quot; an, protokolliert SOGo <code>No authentication sources defined - nobody will be able to login</code>, und jeder Webmail-Login endet mit einer nackten Seite
<strong><code>Unauthorized</code></strong> – obwohl Passwort und Postfach stimmen. Deshalb der zweite Button; nachträglich
geht es über <strong>E-Mail → SOGo neustarten</strong>. Hat sich schon ein fehlgeschlagener Login in den Cache
gebrannt, hilft zusätzlich ein Neustart von memcached (siehe „Wenn es nicht funktioniert&quot;).</div>
</div>
<p>Nach dem Anlegen der Domain zeigt dir mailcow unter dem Domain-Eintrag den <strong>DKIM-Schlüssel</strong> und
die empfohlenen DNS-Records an. Die brauchst du für die Zustellbarkeit – dazu gleich mehr.</p>
<h3 id="schritt-8-webmail-testen">Schritt 8: Webmail testen</h3>
<p>Öffne <code>https://mail.DEINE_DOMAIN/SOGo/</code> (oder klick in der mailcow-UI oben rechts auf <strong>Apps →
Webmail</strong>). Bist du noch nicht angemeldet, landest du zuerst auf der mailcow-Anmeldemaske
„Anmeldung als Benutzer&quot; – dort meldest du dich mit der <strong>vollen Mail-Adresse</strong> und dem
Postfach-Passwort an und wirst direkt in den SOGo-Webmailer mit Posteingang, Kalender und Kontakten
durchgereicht. Eine Test-Mail von dir an dich selbst sollte sofort im Posteingang liegen – das
beweist, dass <strong>lokale Zustellung</strong>, IMAP und Webmail funktionieren.</p>
<p>Der eigentliche Härtetest ist aber das Senden <strong>nach außen</strong> und das Empfangen <strong>von außen</strong> – und
genau da entscheidet sich, ob deine Mails im Postfach oder im Spam-Ordner des Empfängers landen.
Das hängt an SPF, DKIM, DMARC und dem PTR-Eintrag und ist eigenständig genug für ein
<a href="/tutorials/mailserver-zustellbarkeit/" data-track-event="Navigation|Tutorial-Link|/tutorials/mailserver-zustellbarkeit/ ← /tutorials/mailserver-mailcow-aufsetzen/">eigenes Rezept</a>.</p>
<div class="not-prose my-6 rounded-lg border-l-4 p-4 border-sky-300 bg-sky-50 dark:border-sky-800 dark:bg-sky-900/20">
  <p class="mb-1 flex items-center gap-2 font-semibold text-slate-900 dark:text-white">
    <span aria-hidden="true">ℹ️</span>Hinweis
  </p>
  <div class="prose-kitchen text-sm">Willst du sofort prüfen, wie es um deine Zustellbarkeit steht, schick nach dem Setup eine Mail an
einen Test-Dienst wie <a href="https://www.mail-tester.com">mail-tester.com</a> – er bewertet SPF, DKIM,
DMARC, Reverse DNS und Blocklisten. Unter 10/10 ist noch Luft nach oben; wie du auf die volle
Punktzahl kommst, ist Thema des Zustellbarkeits-Tutorials.</div>
</div>
<h2 id="wenn-es-nicht-funktioniert">Wenn es nicht funktioniert</h2>
<div class="troubleshoot not-prose">
<p><strong><code>generate_config.sh</code> bricht mit <code>Cannot find command 'jq'</code> ab.</strong> Das Paket <code>jq</code> fehlt. <code>sudo apt install -y jq</code> und den Generator erneut starten.</p>
<p><strong>Der Generator meldet „User declined to create daemon.json&quot; und bricht ab.</strong> Auf Hosts mit aktivem
IPv6 hast du die Frage nach der IPv6-fähigen Docker-Konfiguration mit <code>n</code> beantwortet – ohne sie
läuft mailcow dort nicht, sonst droht ein offenes Relay. Lege <code>/etc/docker/daemon.json</code> mit
<code>{&quot;ipv6&quot;: true}</code> an (Docker 28 und neuer), starte Docker mit <code>sudo systemctl restart docker</code> neu und
führe <code>./generate_config.sh</code> erneut aus – oder bestätige die Frage beim zweiten Anlauf einfach mit
Enter, dann erledigt der Generator beides selbst.</p>
<p><strong>Die Webmail antwortet nur mit <code>Unauthorized</code>.</strong> SOGo kennt deine Mail-Domain nicht: Es liest die
Domainliste ausschließlich beim Start und wurde nach dem Anlegen der Domain nicht neu gestartet – in
seinen Logs steht <code>No authentication sources defined - nobody will be able to login</code>. Starte SOGo
über <strong>E-Mail → SOGo neustarten</strong> neu. Bleibt es dabei, hängt noch ein fehlgeschlagener Login im
Cache: <code>docker compose restart memcached-mailcow sogo-mailcow</code>.</p>
<p><strong>Kein Zertifikat, <code>acme-mailcow</code> startet immer wieder neu.</strong> Let&rsquo;s Encrypt erreicht deinen Server
nicht auf Port 80, oder der A-Record von <code>mail.DEINE_DOMAIN</code> stimmt nicht. Prüfe mit <code>docker compose logs acme-mailcow</code>, ob der Hostname und die IP passen, und dass Port 80 durch UFW <strong>und</strong> die
netcup-Firewall offen ist.</p>
<p><strong>Mails nach außen werden nicht zugestellt, Logs zeigen Timeouts auf Port 25.</strong> Dein Provider sperrt
ausgehenden SMTP-Verkehr auf Port 25 (üblich als Spam-Schutz). Port 25 ausgehend beim Provider
freischalten lassen (bei netcup per Support-Ticket). Ohne das kannst du keine Mails an fremde Server
senden – Empfang und lokale Zustellung funktionieren trotzdem.</p>
<p><strong>Ports 80/443 lassen sich nicht binden (<code>address already in use</code>).</strong> Auf dem Host läuft schon ein
Webserver oder Reverse Proxy (z. B. Traefik). Mailcow gehört auf einen eigenen Server. Zur Not
lassen sich <code>HTTP_PORT</code>/<code>HTTPS_PORT</code> in der <code>mailcow.conf</code> verbiegen und mailcow hinter einen Proxy
stellen – das ist aber fortgeschritten und für die Mail-Ports ohnehin keine Lösung.</p>
<p><strong>Container starten träge oder werden vom Kernel beendet (OOM).</strong> Zu wenig RAM. Auf mindestens 6–8
GB gehen oder ClamAV in der <code>mailcow.conf</code> (<code>SKIP_CLAMD=y</code>) deaktivieren – der Virenscanner ist der
größte Speicherfresser.</p>

</div>

<h2 id="wartung--backups">Wartung &amp; Backups</h2>
<p>Ein Mailserver lebt von Pflege – plane sie fest ein.</p>
<p><strong>Updates.</strong> Mailcow bringt ein eigenes Update-Skript mit. Führe es regelmäßig (etwa monatlich)
aus; es aktualisiert die Compose-Datei und alle Images auf den neuesten Stand:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/mailcow-dockerized
</span></span><span class="line"><span class="cl">sudo ./update.sh</span></span></code></pre></div>
</div>
<p>Das Skript legt vor dem Update automatisch eine Sicherung der Konfiguration an und startet den
Stack neu. Lies die angezeigten Release-Hinweise – bei größeren Sprüngen stehen dort gelegentlich
manuelle Schritte.</p>
<p><strong>Backups.</strong> Deine Mails, die Datenbank und die Krypto-Schlüssel (DKIM!) liegen in Docker-Volumes.
Mailcow bringt dafür ein fertiges Backup-Skript mit:</p>
<div class="sk-code">
  <span class="sk-code-head">Terminal</span>
  <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">cd</span> /opt/mailcow-dockerized/helper-scripts
</span></span><span class="line"><span class="cl">sudo <span class="nv">BACKUP_LOCATION</span><span class="o">=</span>/opt/mailcow-backups ./backup_and_restore.sh backup all</span></span></code></pre></div>
</div>
<p>Sichere das Zielverzeichnis anschließend <strong>weg vom Server</strong> – am saubersten verschlüsselt mit
<a href="/tutorials/backups-mit-restic/">restic</a>. Besonders wichtig sind die <strong>DKIM-Schlüssel</strong>: Gehen sie
verloren, brechen nach einer Wiederherstellung deine Signaturen, bis du die DNS-Records neu setzt.
Ein Backup, das du nie zurückgespielt hast, ist nur ein Hoffnungswert – teste die Wiederherstellung
einmal auf einem Testsystem.</p>
<p><strong>Reputation im Blick behalten.</strong> Prüfe gelegentlich, ob deine Server-IP auf einer Blockliste
gelandet ist (z. B. über einen der gängigen Blocklist-Checker) und wirf ab und zu einen Blick in
das Rspamd-Dashboard der mailcow-UI. Ein gehacktes oder falsch konfiguriertes Postfach, das Spam
verschickt, ruiniert die Reputation deiner ganzen Domain schnell.</p>
]]></content:encoded></item></channel></rss>