Gotenberg 8 behebt den 400 Bad Request beim EML-Import in Paperless-ngx. Mit zwei weiteren Einstellungen werden leere Seiten vermieden und externe Bilder korrekt gerendert.

Warum ein kleines Versions-Update in Paperless-ngx den Unterschied zwischen einer nutzlosen und einer brauchbaren E-Mail-Archivierung ausmacht.
Wer E-Mails in Paperless-ngx importiert, kennt vielleicht diese Fehlermeldung:
Error while converting email to PDF: Client error '400 Bad Request'
for url 'http://gotenberg:3000/forms/chromium/convert/html'
Plötzlich landet die E-Mail nicht im Archiv, sondern im Papierkorb – oder sie wird zwar archiviert, sieht aber so schlecht aus, dass man lieber das Original im Mail-Client behält. Genau das ist mir mit Apple-Rechnungen passiert, die ich aus eM Client als .eml exportieren und in Paperless-ngx ablegen wollte.
In diesem Beitrag zeige ich, woran es liegt, welche zwei Konfigurationsoptionen du hast und wie du das Problem Schritt für Schritt in deiner Docker-Umgebung löst.
Paperless-ngx kann E-Mails (.eml) nicht alleine in PDFs umwandeln. Dafür braucht es zwei optionale Dienste:
Viele Paperless-Installationen nutzen dabei die offizielle Docker-Compose-Vorlage. Dort ist Gotenberg lange Zeit mit dem Image gotenberg/gotenberg:7.10 konfiguriert worden. Das funktionierte – bis Paperless-ngx bei der HTML-zu-PDF-Konvertierung Margin-Werte im Format 0.1in an Gotenberg sendet. Gotenberg 7 versteht diese Einheit nicht und antwortet mit 400 Bad Request.
Der EML-Import schlägt fehl. Die Datei wird nicht archiviert, oder – je nach Einstellung – wird sie als Fehler markiert.
Die offensichtliche Lösung ist ein Upgrade auf Gotenberg 8. Ab Version 8 akzeptiert Gotenberg die Margin-Werte mit Einheit und die Konvertierung läuft durch.
Aber Achtung: Mit dem Versionswechsel ändern sich zwei Dinge, die man bewusst entscheiden sollte:
Die Standardkonfiguration in Paperless setzt:
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=file:///tmp/.*"
Die Option --chromium-allow-list=file:///tmp/.* erlaubt Chromium nur, lokale Dateien aus /tmp/ zu laden. Externe Bilder – wie das Apple-Logo oder ein YouTube-Icon – werden blockiert. Das ist aus Sicht des Datenschutzes sinnvoll, denn so werden keine Tracking-Pixel oder andere externe Ressourcen beim Konvertieren abgerufen.
Für Rechnungen ist das aber oft unpraktisch: das PDF sieht dann so aus:

Links: Vor dem Update – nur der E-Mail-Header ist sichtbar, der Rechnungskörper bleibt leer. Rechts: Nach dem Update – die Rechnung wird vollständig mit Apple- und YouTube-Logo gerendert.
Paperless nutzt standardmäßig das Layout „Text, dann HTML“. Das bedeutet: wenn die E-Mail sowohl eine Text- als auch eine HTML-Version enthält, kann die Text-Version als fast leere erste Seite erscheinen, bevor das HTML gerendert wird. Auch das verschlechtert das Ergebnis.
Je nachdem, was dir wichtiger ist, kannst du unterschiedlich konfigurieren:
| Option | Leerseite | Bilder/Logos | Tracking-Pixel |
|---|---|---|---|
| A: HTML-only + externe Bilder erlauben | behoben | geladen | möglich |
| B: HTML-only + externe Bilder blockieren | behoben | blockiert | verhindert |
Option A empfiehlt sich, wenn du Rechnungen originalgetreu archivieren willst und dir Tracking-Pixel in diesem Kontext egal sind.
Option B ist besser, wenn du externe Abrufe beim Konvertieren komplett vermeiden willst – zum Beispiel bei sensiblen Inhalten oder wenn du nicht möchtest, dass Absender erfahren, wann du eine E-Mail archiviert hast.
docker-compose.yml und die Umgebungsdatei (z. B. docker-compose.env).cp docker-compose.yml docker-compose.yml.bak
cp docker-compose.env docker-compose.env.bak
Öffne die docker-compose.yml und ändere das Gotenberg-Image:
gotenberg:
image: docker.io/gotenberg/gotenberg:8
restart: unless-stopped
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
- "--chromium-allow-list=file:///tmp/.*"
Speichern.
docker compose pull gotenberg
docker compose up -d gotenberg
Damit ist der ursprüngliche 400 Bad Request behoben. Teste den Import einer .eml-Datei.
Wenn die erste Seite leer oder nur spärlich befüllt ist, konfiguriere Paperless so, dass nur die HTML-Version gerendert wird.
Füge in deiner Umgebungsdatei (docker-compose.env) hinzu:
PAPERLESS_EMAIL_PARSE_DEFAULT_LAYOUT=3
Erlaubte Werte:
1 = Text, dann HTML (Standard)2 = HTML, dann Text3 = nur HTML4 = nur TextStarte danach den Webserver-Container neu:
docker compose up -d webserver
Wenn du möchtest, dass externe Bilder und Logos im PDF erscheinen, entferne in der docker-compose.yml die Zeile:
- "--chromium-allow-list=file:///tmp/.*"
Die Gotenberg-Konfiguration sieht dann so aus:
gotenberg:
image: docker.io/gotenberg/gotenberg:8
restart: unless-stopped
command:
- "gotenberg"
- "--chromium-disable-javascript=true"
Starte Gotenberg neu:
docker compose up -d gotenberg
Hinweis: Wenn du diese Zeile entfernst, kann Chromium während der Konvertierung externe URLs laden. JavaScript bleibt durch --chromium-disable-javascript=true weiterhin deaktiviert.
Ein scheinbar kleines Versions-Problem – gotenberg:7.10 gegen gotenberg:8 – macht den Unterschied zwischen einem fehlgeschlagenen E-Mail-Import und einer brauchbaren Archivierung. Mit zwei zusätzlichen Einstellungen lässt sich das Ergebnis deutlich verbessern:
400 Bad Request.PAPERLESS_EMAIL_PARSE_DEFAULT_LAYOUT=3 verhindert die leere Text-Seite.Wer viele Rechnungen oder Belege per E-Mail bekommt, hat damit eine solide Basis, um diese direkt in Paperless-ngx zu archivieren, ohne vorher manuell PDFs erzeugen zu müssen.
X9bI0dfkpZUv