SSD Nodes Learn Hosting plans →
Anleitungen Matt ConnorVon Matt Connor

Mailpit auf einem VPS als Wegwerf-Posteingang einrichten

Mit Mailpit fangen Sie Testmails auf einer Wegwerf-Domain ab, lesen sie im Webinterface und verhindern, dass Ihre Staging-App echte Kunden anschreibt.

Was ein Wegwerf-E-Mail-Posteingang ist

Ein Wegwerf-E-Mail-Posteingang ist ein kleiner SMTP-Server (Simple Mail Transfer Protocol), der E-Mails für jede Adresse annimmt, aber keine davon zustellt. Ihre Staging-Anwendung sendet E-Mails dorthin statt an einen echten Mailanbieter, und jede Nachricht bleibt dort. Sie lesen die eingegangenen Nachrichten in einer Weboberfläche. Eine falsche Empfängerliste oder eine fehlerhafte Vorlage verursacht dadurch keine Kosten, weil die E-Mail den Posteingang nicht verlässt.

In diesem Leitfaden richten Sie einen solchen Posteingang auf einem einzelnen VPS mit Docker Compose ein. Mailpit dient als Catch-all-Ziel. Der SMTP-Listener ist so gebunden, dass nur Ihre Anwendung ihn erreichen kann. Die Weboberfläche läuft hinter nginx mit Transport Layer Security (TLS) und einem Passwort. Ein Aufbewahrungslimit verhindert, dass der Posteingang den Datenträger füllt. Falls Compose für Sie neu ist, beschreibt die Compose-Grundlagen für einen VPS die in diesem Leitfaden vorausgesetzte Dateistruktur.

Das Ergebnis ist ein Testwerkzeug und kein Mailserver. Es bietet keine Konten, keine Zustellung und keine Spamfilterung. Echte Postfächer für reale Personen erfordern einen vollständigen Mailserver wie Mailcow und sind eine deutlich umfangreichere Aufgabe.

Mailpit vs Inbucket vs MailHog: Welchen Sink Sie verwenden sollten

Drei Tools übernehmen diese Aufgabe. Sie unterscheiden sich beim Wartungsstatus, bei den Ports, auf denen sie Verbindungen annehmen, und bei den Möglichkeiten, Nachrichten nach der Annahme zu verarbeiten. Die folgenden Versionen wurden im Oktober 2026 geprüft.

MailHog (mailhog/mailhog) nimmt SMTP-Verbindungen auf Port 1025 an und stellt seine Oberfläche auf Port 8025 bereit. Es funktioniert weiterhin. Im Standard-Branch wurde seit August 2022 kein Commit mehr erstellt, und der Tracker enthält mehr als 200 offene Issues. Damit würden Sie ungepatchte Abhängigkeiten in Ihrem Testpfad einsetzen. Beginnen Sie keine neuen Arbeiten damit.

Inbucket (inbucket/inbucket) nimmt SMTP-Verbindungen auf Port 2500, Verbindungen für die Weboberfläche auf Port 9000 und POP3-Verbindungen (Post Office Protocol Version 3) auf Port 1100 an. Version 3.2.0 wurde am 10. Oktober 2026 veröffentlicht. Das Tool speichert Nachrichten als Dateien unter /storage und löscht sie selbstständig: Das Image setzt INBUCKET_STORAGE_RETENTIONPERIOD=72h und INBUCKET_STORAGE_MAILBOXMSGCAP=300. Wählen Sie es, wenn ein Test E-Mails mit einer POP3-Clientbibliothek statt über einen HTTP-Aufruf abrufen muss.

Mailpit (axllent/mailpit) verwendet dieselben Ports wie MailHog, 1025 und 8025. Dadurch ersetzt es MailHog, ohne dass Sie die Anwendungskonfiguration ändern müssen. Version 1.31.5 wurde am 11. Oktober 2026 veröffentlicht. Die Version-1.30-Reihe endete im August mit 1.30.7. Mailpit enthält alle Funktionen, die dieser Leitfaden benötigt, direkt im Binary: eine Passwortdatei für die Weboberfläche und die API (Application Programming Interface), eine maximale Nachrichtenanzahl, eine maximale Nachrichtenalter und einen Empfängerfilter. Im weiteren Verlauf dieses Leitfadens wird Mailpit verwendet.

Funktionsweise des Catch-all und warum DNS nicht beteiligt ist

Ihre Anwendung ermittelt hier nicht, wohin die Nachricht zugestellt werden soll. Sie übergibt einen Host und einen Port, öffnet eine TCP-Verbindung und kündigt RCPT TO:<anyone@example.test> an. Mailpit akzeptiert diesen Empfänger unabhängig von seinem Inhalt, speichert die Nachricht und leitet nichts weiter. Die Domain wird nie aufgelöst. Daher funktioniert example.test, obwohl .test ein reservierter Name ist, der nirgendwo im Domain Name System (DNS) existiert.

Das ist der gesamte Mechanismus. Deshalb ist das Postfach standardmäßig sicher. Es ist kein MX-(Mail-Exchange-)Record beteiligt, es wird keine Zustellung versucht, und keine Nachricht kann eine reale Person erreichen.

Richten Sie Ihre Staging-Anwendung auf den Sink

Setzen Sie den SMTP-Host der Anwendung auf mailpit, wenn die Anwendung als Container im selben Compose-Projekt läuft, oder auf 127.0.0.1, wenn sie auf dem Host läuft. Setzen Sie den Port auf 1025, deaktivieren Sie TLS und lassen Sie Benutzername und Passwort leer. Mailpit akzeptiert anonyme E-Mails.

Einige Frameworks verweigern den Versand ohne Zugangsdaten. Mit MP_SMTP_AUTH_ACCEPT_ANY=1 akzeptiert Mailpit jeden Benutzernamen und jedes Passwort. MP_SMTP_AUTH_ALLOW_INSECURE=1 erlaubt die Mechanismen PLAIN und LOGIN über eine unverschlüsselte Verbindung. Diese beiden Einstellungen sind hier nur sicher, weil der Listener nicht aus dem Internet erreichbar ist. Die folgende Bereitstellung stellt dies sicher.

MP_SMTP_ALLOWED_RECIPIENTS sollten Sie bereits am ersten Tag setzen. Die Einstellung erwartet einen regulären Ausdruck und weist jeden Empfänger zurück, der nicht darauf passt. Richten Sie sie auf Ihre Testdomain. Wenn eine Staging-Datenbank noch eine echte Kundenadresse enthält, erscheint dadurch ein sichtbarer Fehler im Anwendungslog, statt dass eine Nachricht unbemerkt im Sink landet.

Die Docker-Compose-Datei

Erstellen Sie zuerst das Verzeichnis und eine Passwortdatei für die Weboberfläche. htpasswd -B schreibt einen bcrypt-Hash. Mailpit akzeptiert ebenfalls bcrypt und Klartext.

mkdir -p ~/mailpit/data
cd ~/mailpit
sudo apt update && sudo apt install -y apache2-utils
htpasswd -B -c data/ui-auth qa

Schreiben Sie compose.yaml:

services:
  mailpit:
    image: axllent/mailpit:v1.31
    container_name: mailpit
    restart: unless-stopped
    ports:
      - "127.0.0.1:8025:8025"
      - "127.0.0.1:1025:1025"
    volumes:
      - ./data:/data
    environment:
      MP_DATABASE: /data/mailpit.db
      MP_MAX_MESSAGES: 2000
      MP_MAX_AGE: 14d
      MP_UI_AUTH_FILE: /data/ui-auth
      MP_SMTP_AUTH_ACCEPT_ANY: 1
      MP_SMTP_AUTH_ALLOW_INSECURE: 1
      MP_SMTP_ALLOWED_RECIPIENTS: '@example\.test$$'

Das doppelte Dollarzeichen ist kein Tippfehler. Compose interpretiert ein einzelnes $ als Beginn einer zu ersetzenden Variable. Mit $$ übergeben Sie daher ein einzelnes Dollarzeichen unverändert an den Container. Der reguläre Ausdruck erreicht Mailpit als @example\.test$.

Starten Sie den Container und prüfen Sie den Health-Status:

docker compose up -d
docker compose ps

In der Spalte STATUS sollte Up ... (healthy) stehen. Das Image enthält einen eigenen Healthcheck, der alle 15 Sekunden /mailpit readyz ausführt. Ein Container, der dauerhaft bei starting bleibt oder zu unhealthy wechselt, stellt auf Port 8025 innerhalb des Containers normalerweise keinen Dienst bereit. Der Check übernimmt Einstellungen aus MP_ Umgebungsvariablen, aber nicht aus Kommandozeilenoptionen. Deshalb setzt diese Anleitung alle Einstellungen unter environment:. Wenn Sie die Optionen stattdessen als Flags übergeben, kann der Check unhealthy melden, obwohl Mailpit normal arbeitet. Lesen Sie docker compose logs mailpit, bevor Sie weitere Änderungen vornehmen.

Beide veröffentlichten Ports enthalten eine Adressangabe. Diese Adresse steuert den Zugriff. Innerhalb des Containers lauscht Mailpit auf 0.0.0.0. Das ist unproblematisch, weil der Container einen eigenen Netzwerk-Namespace besitzt. Die linke Seite der Zuordnung legt fest, wer den Dienst von außen erreicht. Schreiben Sie 8025:8025, bindet Docker jede Adresse auf dem Host, einschließlich der öffentlichen Adresse.

Wenn Ihre Staging-Anwendung in derselben Datei als Dienst definiert ist, löschen Sie die Zuordnung 1025 vollständig. Verweisen Sie in der Anwendung stattdessen auf den Hostnamen mailpit an Port 1025. Container in einem gemeinsamen Compose-Netzwerk erreichen sich direkt. Der SMTP-Port wird dadurch überhaupt nicht auf dem Host veröffentlicht. So lösen Compose-Netzwerke Servicenamen auf behandelt diese Namensauflösung.

Eine Nachricht senden und prüfen, ob sie angekommen ist

python3 - <<'EOF'
import smtplib
from email.message import EmailMessage

m = EmailMessage()
m["From"] = "staging@example.test"
m["To"] = "anyone@example.test"
m["Subject"] = "Mailpit smoke test"
m.set_content("If this appears in the web interface, the sink works.")
with smtplib.SMTP("127.0.0.1", 1025) as s:
    s.send_message(m)
EOF

Das Skript gibt bei Erfolg nichts aus. Prüfen Sie über die API, ob die Nachricht gespeichert wurde:

curl -s -u qa:yourpassword http://127.0.0.1:8025/api/v1/messages

Der Befehl gibt JSON mit den gespeicherten Nachrichten zurück. Wenn Sie das Flag -u weglassen, wird dieselbe Anfrage abgewiesen, weil MP_UI_AUTH_FILE sowohl die API als auch die Weboberfläche schützt. Jeder Test, der den Posteingang liest, muss diese Zugangsdaten ebenfalls mitsenden.

Ein ConnectionRefusedError aus dem Python-Skript bedeutet, dass auf 127.0.0.1:1025 kein Prozess Verbindungen annimmt. Das ist das erwartete Ergebnis, wenn Sie die SMTP-Zuordnung entfernt haben. Die Prüfung muss dann aus einem Container im selben Compose-Netzwerk ausgeführt werden.

Weboberfläche mit einem Passwort über nginx veröffentlichen

Die Oberfläche antwortet derzeit nur auf der Loopback-Adresse. nginx übernimmt die TLS-Terminierung und fordert ein Passwort an, bevor eine Anfrage die Oberfläche erreicht.

sudo htpasswd -B -c /etc/nginx/mailpit.htpasswd qa
server {
    listen 443 ssl;
    server_name mail-test.example.com;

    ssl_certificate     /etc/letsencrypt/live/mail-test.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mail-test.example.com/privkey.pem;

    auth_basic           "mailpit";
    auth_basic_user_file /etc/nginx/mailpit.htpasswd;

    location / {
        proxy_pass http://127.0.0.1:8025;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Laden Sie die Konfiguration nach einer Syntaxprüfung mit sudo nginx -t && sudo systemctl reload nginx neu. Was die einzelnen Direktiven in einem Reverse-Proxy-Block bewirken ist lesenswert, wenn dies Ihr erster Proxy ist.

Verwenden Sie in der nginx-Datei und in data/ui-auth denselben Benutzernamen und dasselbe Passwort. nginx leitet den Authorization-Header des Browsers an das Backend weiter, sodass übereinstimmende Zugangsdaten beide Prüfungen mit einer einzigen Abfrage erfüllen. Bei unterschiedlichen Zugangsdaten speichert der Browser einen Satz, den die zweite Prüfung zurückweist.

Die Header Upgrade und Connection sind nicht nur Dekoration. Mailpit überträgt neue Nachrichten über einen WebSocket an eine geöffnete Seite. Ein Proxy, der HTTP/1.1 ohne diese Header verwendet, kann die Verbindung nicht aufrüsten. Die Seite wird dann zwar korrekt geladen, ändert sich aber nicht mehr: Neue Nachrichten kommen an, die API zeigt sie an, und die Liste bleibt unverändert, bis Sie die Seite neu laden.

Behalten Sie beide Sperren bei. Das nginx-Passwort schützt die öffentliche Adresse. MP_UI_AUTH_FILE schützt außerdem Port 8025 selbst. Das ist wichtig, weil jeder von Ihrer Staging-Anwendung erzeugte Passwort-Zurücksetzungslink so lange in dieser Oberfläche lesbar bleibt, wie die Aufbewahrungsfrist ihn vorhält.

Einen Sink niemals als Open Relay betreiben

Ein Open Relay ist ein SMTP-Server, der Nachrichten von beliebigen Absendern annimmt und an beliebige Ziele weiterleitet. Spammer suchen kontinuierlich nach solchen Servern. Wird einer unter Ihrer Adresse gefunden, führt das zu Abuse-Meldungen und zur Sperrung des Kontos.

Mailpit ist standardmäßig kein Open Relay, weil es zunächst keine Nachrichten weiterleitet. Es verfügt über zwei Funktionen für den ausgehenden Versand. Beide bleiben deaktiviert, bis Sie sie konfigurieren. MP_SMTP_RELAY_CONFIG verweist auf eine Relay-Konfigurationsdatei und aktiviert die Release-Aktion in der Oberfläche. Damit können Sie eine ausgewählte Nachricht über diesen Server senden. Für die automatische Weiterleitung ist zusätzlich MP_SMTP_RELAY_ALL (Standardwert false) oder MP_SMTP_RELAY_MATCHING erforderlich. Die mit MP_SMTP_FORWARD_CONFIG oder den Variablen MP_SMTP_FORWARD_* konfigurierte Weiterleitung kopiert jede eingehende Nachricht an festgelegte Zieladressen. Wenn Sie alle diese Optionen nicht setzen, ist das eine bewusste Entscheidung.

Diese Eigenschaft kann auf zwei Arten verloren gehen. Aktivieren Sie MP_SMTP_RELAY_ALL, wird jede eingehende Nachricht an ihre ursprünglichen Empfänger weitergeleitet und MP_SMTP_ALLOWED_RECIPIENTS ignoriert. Wird anschließend der SMTP-Port im Internet veröffentlicht, haben Sie ein funktionierendes Open Relay eingerichtet. MP_SMTP_RELAY_MATCHING bewirkt dasselbe für jeden Empfänger, auf den das Muster zutrifft. Wenn Sie den Port ohne Relay-Funktion veröffentlichen, können Fremde zwar keine Nachrichten über Ihren Server versenden. Sie können jedoch Ihren Speicher füllen und Inhalte in die Oberfläche einbringen, der Ihr Team vertraut. Bei aktivierter Weiterleitung landen diese Nachrichten außerdem in jedem Postfach, das die Kopien empfängt.

Die Falle auf einem Docker-Host ist die Firewall. Beim Veröffentlichen eines Ports schreibt Docker eigene Regeln in die Tabelle nat. Dort wird der für den Container bestimmte Datenverkehr verarbeitet, bevor ufw (uncomplicated firewall) greifen kann. sudo ufw deny 1025/tcp meldet Erfolg, ändert aber nichts. Warum Docker Ports direkt an ufw vorbei veröffentlicht erläutert die Reihenfolge der Ketten.

Die Lösung liegt in der Adresse des Mappings, nicht in einer Firewall-Regel. Prüfen Sie, woran tatsächlich gebunden wird:

sudo ss -ltnp | grep -E ':(1025|8025)'

Eine korrekte Ausgabe zeigt 127.0.0.1:1025 und 127.0.0.1:8025. Eine Zeile mit 0.0.0.0:1025 bedeutet, dass das Mapping seine Adresse verloren hat und der Sink im Internet lauscht. Von einem anderen Rechner aus sollte nc -vz mail-test.example.com 1025 einen Timeout oder eine Ablehnung zurückgeben.

Wenn sich die Anwendung auf einem anderen Server befindet, öffnen Sie nicht Port 1025, um beide Systeme zu verbinden. Verbinden Sie beide Rechner über ein privates Netzwerk oder einen VPN-Tunnel. Binden Sie das Mapping an die Adresse dieser Schnittstelle.

Nur bei echtem eingehendem E-Mail-Verkehr MX-Records veröffentlichen

Ein MX-Record (Mail Exchanger) teilt anderen Mailservern mit, welcher Host E-Mails für eine Domain annimmt. Wenn kein MX-Record vorhanden ist, wird der Empfang dadurch nicht automatisch verhindert: Bei einer Domain ohne MX-Record greifen sendende Server gemäß RFC 5321 Abschnitt 5.1 auf den A- oder AAAA-Record der Domain zurück. Der Hostname, der für die Weboberfläche auf diesen Server zeigt, verfügt über einen solchen Record. Eingehende E-Mails aus dem Internet werden dadurch verhindert, dass auf dem Server kein Dienst auf Port 25 lauscht. Das Postfach enthält dann nur E-Mails, die Ihre eigenen Anwendungen übermittelt haben. Genau dafür ist ein Testpostfach vorgesehen.

Der Empfang echter E-Mails erfordert einen DNS-Record, der sendende Server zu diesem Server führt (einen MX-Record oder den A- bzw. AAAA-Record, auf den sie ersatzweise zurückgreifen), Mailpit, das auf Port 25 lauscht (MP_SMTP_BIND_ADDR=0.0.0.0:25), und einen geöffneten Port. Ab diesem Zeitpunkt betreiben Sie einen öffentlichen Catch-all für jede Adresse der Domain. Machen Sie sich die daraus folgenden Konsequenzen klar.

  • Innerhalb weniger Tage nach dem Erscheinen des Records beginnt Spam, weil Harvester DNS-Einträge auslesen. Anschließend probieren Dictionary-Angriffe gängige Namen durch und speichern für jeden Versuch eine Nachricht.
  • Anhänge von unbekannten Absendern landen auf Ihrer Festplatte und bleiben dort. Es gibt keine Filterung. Ein Archiv von einem unbekannten Absender liegt daher neben Ihren eigenen Test-E-Mails.
  • Jeder, der die Domain kennt, kann sich bei Drittanbieterdiensten mit einer Adresse dieser Domain registrieren. Die Bestätigungs-E-Mail wird an Ihren Server zugestellt. Wenn die Passwortsperre jemals umgangen wird, gehören diese Konten der Person, die das Postfach liest.
  • Aufbewahrungsgrenzen sind dann keine reine Aufräumarbeit mehr, sondern werden für den Betrieb entscheidend, weil Sie das Volumen nicht mehr selbst kontrollieren.

Wenn Sie für einen Zustellbarkeitstest echte eingehende E-Mails benötigen, verwenden Sie dafür eine eigene Subdomain, halten Sie MP_MAX_AGE kurz und behandeln Sie alle darin enthaltenen Inhalte als öffentlich. Wenn Sie Postfächer benötigen, auf die sich Menschen verlassen, betreiben Sie stattdessen einen echten Mailserver mit Filterung und Backups.

Aufbewahrung: Wie ein unbegrenzter Catch-all die Festplatte füllt

Mailpit behält standardmäßig 500 Nachrichten und löscht regelmäßig die ältesten Nachrichten, die darüber hinausgehen. MP_MAX_MESSAGES: 0 deaktiviert diese Begrenzung. Wenn MP_MAX_AGE nicht gesetzt ist, wird nie automatisch etwas gelöscht. So füllt ein Catch-all unbemerkt die Festplatte. MP_MAX_AGE fügt eine zeitliche Begrenzung hinzu. Diese kann zusammen mit der Nachrichtenbegrenzung oder an ihrer Stelle verwendet werden und wird in Stunden oder Tagen angegeben, beispielsweise als 36h oder 14d.

MP_DATABASE legt fest, ob diese Daten einen Neustart überstehen. Ohne diese Einstellung schreibt Mailpit in eine temporäre Datei, die beim Beenden des Prozesses gelöscht wird. Dadurch ist der Posteingang nach jedem Neustart leer. Mit dieser Einstellung bleiben die Nachrichten über Neustarts hinweg erhalten, und die Datei wächst weiter.

Anhänge verbrauchen den Speicherplatz. Ein nächtlicher Job, der einen 2 MB großen PDF-Bericht an 300 Testadressen sendet, erzeugt 600 MB pro Nacht. Eine reine Begrenzung der Nachrichtenanzahl reagiert darauf nicht rechtzeitig. Berücksichtigen Sie dieses Wachstum bei der Kapazitätsplanung für das Volume. Ein benachbarter, speicherintensiver Dienst wie PhotoPrism oder Immich kann bereits den größten Teil der kleinen VPS-Festplatte belegen.

du -h ~/mailpit/data/mailpit.db
df -h /

Leeren Sie den Speicher zwischen CI-Läufen, statt darauf zu warten, dass eine Begrenzung greift:

curl -s -u qa:yourpassword -X DELETE http://127.0.0.1:8025/api/v1/messages

Inbucket behandelt dasselbe Problem mit INBUCKET_STORAGE_RETENTIONPERIOD (72h im Image) und INBUCKET_STORAGE_MAILBOXMSGCAP (300). Unabhängig davon, welchen Dienst Sie verwenden, sollten Sie die Begrenzung festlegen, bevor die erste Testsuite darauf verweist.

Postfach aus der Testsuite lesen

GET /api/v1/messages listet den gespeicherten Inhalt auf, GET /api/v1/message/{ID} gibt eine Nachricht mit ihren Bestandteilen und Headern zurück, GET /api/v1/search filtert, und DELETE /api/v1/messages leert den Speicher. Die interaktive Dokumentation für die ausgeführte Version ist unter http://127.0.0.1:8025/api/v1/ verfügbar.

Ein sinnvoller Test sendet eine Nachricht, fragt wiederholt ab, bis sie erscheint, prüft den Betreff und den darin enthaltenen Link und löscht anschließend alles. Verwenden Sie eine kurze Wiederholungsschleife mit erneuten Abfragen statt einer einzelnen Anfrage, weil eine Anwendung, die E-Mails in einem Hintergrund-Worker einreiht, aus dem Sendeaufruf zurückkehrt, bevor Mailpit die Nachricht erhalten hat. Dasselbe Muster findet sich auch bei Self-hosting-Tools zum Testen und Mocken von APIs. Diese sind normalerweise die andere Hälfte einer Staging-Umgebung, die niemals auf die Produktionsumgebung zugreift.

FAQ

Ist ein selbst gehostetes Postfach für Wegwerf-E-Mails ein offenes Relay?

Nicht, solange das Relaying deaktiviert bleibt. Mailpit sendet standardmäßig nichts weiter: MP_SMTP_RELAY_CONFIG aktiviert nur die manuelle Freigabe ausgewählter Nachrichten, und für automatisches Relaying ist zusätzlich MP_SMTP_RELAY_ALL oder MP_SMTP_RELAY_MATCHING erforderlich. Lassen Sie diese Variablen nicht gesetzt. Dann kann ein Fremder, der Port 1025 erreicht, keine E-Mails über Ihren Server senden. Er kann jedoch Ihren Speicher füllen. Binden Sie den SMTP-Port daher an eine Adresse, die nur Ihre Anwendung erreichen kann. Wenn Sie ihn in Compose als 1025:1025 veröffentlichen, wird er an jede Hostadresse gebunden. sudo ufw deny 1025/tcp schließt ihn nicht, weil zuerst die eigenen nat-Regeln von Docker greifen.

Benötige ich einen MX-Record für meine Testdomain?

Nur wenn E-Mails aus dem Internet ankommen sollen. Das Weglassen eines MX-Records ist allein jedoch keine Sperre. Ohne MX-Record verwenden sendende Server den A- oder AAAA-Record der Domain. Tatsächlich hält nur ein Dienst, der nicht auf Port 25 lauscht, Internet-E-Mails fern. Das Postfach enthält dann ausschließlich Nachrichten, die Ihre eigenen Anwendungen über SMTP einreichen. Wenn Sie DNS auf den Server zeigen lassen und Port 25 öffnen, betreiben Sie einen öffentlichen Catch-all: Innerhalb weniger Tage treffen Spam, Dictionary-Angriffe mit einer gespeicherten Nachricht pro Versuch und Anhänge von Fremden ungefiltert auf Ihrer Festplatte ein.

Warum wird die Nachrichtenliste erst aktualisiert, wenn ich die Seite neu lade?

Mailpit überträgt neue Nachrichten über einen WebSocket an eine geöffnete Seite. Ein nginx-location-Block, in dem proxy_http_version 1.1 sowie die Header Upgrade und Connection fehlen, kann diese Verbindung nicht aufrüsten. Die Seite wird daher normal geladen und friert anschließend ein. E-Mails kommen weiterhin an, und die API liefert sie weiterhin aus. Deshalb wirkt das Postfach veraltet und nicht defekt. Fügen Sie diese Zeilen hinzu, laden Sie nginx neu und laden Sie anschließend die Seite neu.

Wie verhindere ich, dass das Postfach die Festplatte füllt?

Lassen Sie MP_MAX_MESSAGES auf einen realen Wert gesetzt und fügen Sie MP_MAX_AGE hinzu. Das Standardlimit beträgt 500 Nachrichten. Wenn Sie es auf 0 setzen, wird die löschungsbasierte Begrenzung nach Anzahl deaktiviert. Wenn MP_MAX_AGE nicht gesetzt ist, wird daher nichts bereinigt. So wächst ein Catch-all mit Anhängen unbemerkt weiter. MP_MAX_AGE akzeptiert Stunden oder Tage, beispielsweise 36h oder 14d. Leeren Sie den Speicher beim CI-Teardown mit curl -u qa:yourpassword -X DELETE http://127.0.0.1:8025/api/v1/messages, da die API dieselben Zugangsdaten wie die Weboberfläche verlangt. Inbucket erledigt dieselbe Aufgabe mit INBUCKET_STORAGE_RETENTIONPERIOD (72h) und INBUCKET_STORAGE_MAILBOXMSGCAP (300).

Sollte ich Mailpit, Inbucket oder MailHog verwenden?

Für neue Projekte Mailpit, Stand Oktober 2026. MailHog funktioniert weiterhin, aber in seinem Standard-Branch gab es seit August 2022 keinen Commit mehr. Daher enthält es ungepatchte Abhängigkeiten. Inbucket wird aktiv gepflegt (3.2.0, Oktober 2026) und ist die bessere Wahl, wenn ein Test POP3 benötigt. Der POP3-Server von Mailpit startet erst, wenn Sie Zugangsdaten angeben, entweder in einer Passwortdatei oder in der Variable MP_POP3_AUTH. Mailpit verwendet dieselben Ports wie MailHog, 1025 und 8025. Für den Wechsel von MailHog muss daher nur der Image-Name in Ihrer Compose-Datei geändert werden.