236 lines
8.0 KiB
Markdown
236 lines
8.0 KiB
Markdown
# Paperless-ngx für Thunderbird / Betterbird
|
|
|
|
Legt Anhänge und ganze E-Mails in einem Paperless-ngx-Archiv ab und fügt
|
|
Dokumente aus dem Archiv als Anhang oder Freigabelink in Entwürfe ein.
|
|
|
|
Schwestererweiterung zur LibreOffice-Fassung; dieselben Erkenntnisse zur
|
|
Paperless-Schnittstelle, aber vollständig eigener Code — Thunderbird kennt
|
|
WebExtensions, LibreOffice UNO.
|
|
|
|
---
|
|
|
|
## Funktionen
|
|
|
|
| Ort | Befehl | Wirkung |
|
|
|---|---|---|
|
|
| Kontextmenü am Anhang | Anhang in Paperless ablegen | ausgewählte Anhänge als Dokument |
|
|
| Kontextmenü in der Nachrichtenliste | E-Mail in Paperless ablegen | vollständige Nachricht als `.eml` |
|
|
| Schaltfläche im Nachrichtenfenster | dasselbe für die angezeigte Nachricht | |
|
|
| Schaltfläche im Verfassenfenster | Aus Paperless einfügen | als Anhang oder als Freigabelink |
|
|
|
|
Beim Ablegen stehen dieselben zwei Ziele zur Wahl wie in der
|
|
LibreOffice-Fassung: ein **neues Dokument** oder eine **neue Version eines
|
|
bestehenden**. Der zweite Fall deckt die Lücke, die Dokumentenverwaltungen
|
|
gern offenlassen:
|
|
|
|
> Die Rechnung kommt als PDF im Anhang. Später entsteht die bearbeitbare
|
|
> Fassung. Beides gehört zusammen — aber das PDF war zuerst da.
|
|
|
|
---
|
|
|
|
## Was beim Ablegen passiert
|
|
|
|
**Anhänge einzeln wählbar.** Kleine Bilder und Signaturen sind vorab
|
|
abgewählt — sie gehören zur Darstellung der Nachricht, nicht zum Inhalt.
|
|
Wer sie alle mit archiviert, hat nach einem Jahr hunderte Logos im Bestand.
|
|
Die Schwelle liegt bei 8 KB und ist einstellbar.
|
|
|
|
**Die ganze Nachricht als `.eml`.** Anhänge bleiben darin enthalten;
|
|
Paperless legt sie nicht als eigene Dokumente an, aber die Datei ist
|
|
vollständig und lässt sich jederzeit wieder in einem Mailprogramm öffnen.
|
|
|
|
**Titel aus dem Betreff.** Präfixe wie `AW:` oder `Fwd:` werden entfernt —
|
|
sie tragen im Archiv nichts bei und stören beim Sortieren.
|
|
|
|
**Klassifizierung direkt danach.** Sonst trägt ein neues Dokument nur den
|
|
Titel, und nachträglich macht man es erfahrungsgemäß nicht mehr.
|
|
|
|
---
|
|
|
|
## Einfügen in Entwürfe
|
|
|
|
**Als Anhang.** Das Original wird geladen (`?original=true`), nicht die
|
|
Archivfassung — bei ZUGFeRD bleibt damit die eingebettete XML erhalten.
|
|
Die Version ist wählbar, mit Datum und Format.
|
|
|
|
**Als Freigabelink.** Zeitlich begrenzt, ohne Anmeldung abrufbar, auf
|
|
Wunsch mit einem Tag am Dokument. Eingefügt werden Name (fett), Adresse
|
|
und Gültigkeit:
|
|
|
|
```
|
|
Einladung Generalversammlung
|
|
https://dms.example.org/share/ZYGwdw…
|
|
Link gültig bis 11.09.2026
|
|
```
|
|
|
|
Die Adresse steht sichtbar, nicht nur als Verweisziel — bei einem Link,
|
|
der ohne Anmeldung Zugriff gewährt, sollte der Empfänger sehen, wohin er
|
|
führt.
|
|
|
|
**Der Tag ist abschaltbar.** Ein leeres Tag-Feld bedeutet: keine
|
|
Kennzeichnung setzen. Wer es dauerhaft nicht will, leert das Feld in den
|
|
Einstellungen.
|
|
|
|
> **Einschränkung:** Die Compose-Schnittstelle kennt kein Einfügen an der
|
|
> Schreibmarke. Der Nachrichtentext muss vollständig gelesen und
|
|
> zurückgeschrieben werden. Der Link landet deshalb am Ende des Textes,
|
|
> nicht an der Cursorposition. Bei HTML-Nachrichten wird er vor dem
|
|
> schließenden `</body>` eingesetzt.
|
|
|
|
Wann was: Der Anhang für alles, was auch in fünf Jahren noch lesbar sein
|
|
muss, wenn der Link längst abgelaufen ist. Der Link für große Dateien und
|
|
für Empfänger, die ohnehin Zugriff auf das Archiv haben sollen.
|
|
|
|
---
|
|
|
|
## Einrichten
|
|
|
|
1. Add-ons-Verwaltung → **Paperless-ngx** → Einstellungen
|
|
2. Basisadresse eintragen, etwa `https://dms.example.org` — ohne
|
|
abschließenden Schrägstrich
|
|
3. API-Token eintragen, erzeugt im **Benutzerprofil** von Paperless
|
|
4. Speichern — dabei wird das Zugriffsrecht für genau diese Adresse
|
|
erbeten und die Verbindung sofort geprüft
|
|
|
|
Das Zugriffsrecht steht bewusst **nicht** pauschal im Manifest. Eine
|
|
Erweiterung, die von Haus aus jede Adresse erreichen darf, ist eine
|
|
unnötig große Angriffsfläche.
|
|
|
|
---
|
|
|
|
## Bauen und installieren
|
|
|
|
```bash
|
|
./build.sh
|
|
```
|
|
|
|
Zum Ausprobieren ohne Installation:
|
|
|
|
```
|
|
Extras → Entwicklerwerkzeuge → Debuggen von Add-ons
|
|
→ Temporäres Add-on laden → manifest.json wählen
|
|
```
|
|
|
|
Das ist beim Entwickeln der bessere Weg: Änderungen sind nach einem Klick
|
|
auf „Neu laden" wirksam, und die Konsole zeigt Fehler im Klartext.
|
|
|
|
Dauerhaft:
|
|
|
|
```
|
|
Add-ons-Verwaltung → Zahnrad → Add-on aus Datei installieren
|
|
→ paperless-thunderbird-1.0.0.xpi
|
|
```
|
|
|
|
---
|
|
|
|
## Bekannte Einschränkung: Zugriff über IP-Adresse
|
|
|
|
Der Zugang über `https://` und einen Rechnernamen funktioniert. Der
|
|
direkte Weg über eine LAN-Adresse wie `http://192.168.1.5:8000` schlägt
|
|
dagegen mit `NetworkError` fehl, auch wenn das Zugriffsrecht erteilt
|
|
wurde.
|
|
|
|
**Die Ursache ist nicht abschließend geklärt.** Eine Vermutung: Neuere
|
|
Gecko-Versionen schränken Anfragen aus erweiterten Kontexten in private
|
|
Adressbereiche ein. Falls das zutrifft, lässt es sich von der Erweiterung
|
|
aus nicht umgehen.
|
|
|
|
Praktisch ist das verschmerzbar — der Weg über den Reverse Proxy ist
|
|
ohnehin der bessere, weil er verschlüsselt ist. Wer es untersuchen möchte,
|
|
findet in `about:networking` und in der Netzwerkanalyse der
|
|
Add-on-Debugansicht Ansatzpunkte.
|
|
|
|
## Manifest-Version
|
|
|
|
Gebaut nach **Manifest V3** mit den Thunderbird-Besonderheiten:
|
|
|
|
- `background.scripts` als Ereignisseite, **kein** Service Worker —
|
|
Thunderbird unterstützt keine
|
|
- `compose_action` und `message_display_action` neben `action`
|
|
- `optional_host_permissions` statt fester Adressen
|
|
|
|
Sollte die eingesetzte Version noch MV2 verlangen, sind vier Änderungen
|
|
nötig: `manifest_version` auf 2, `optional_host_permissions` nach
|
|
`optional_permissions`, `host_permissions` entfällt, und
|
|
`background.type: module` bleibt wie es ist.
|
|
|
|
---
|
|
|
|
## Sprachen
|
|
|
|
Deutsch, Englisch und Französisch über die eingebaute Verwaltung
|
|
(`_locales/`). Die Sprache richtet sich nach der Oberfläche von
|
|
Thunderbird. Eine weitere Sprache ergänzt man, indem man ein Verzeichnis
|
|
mit `messages.json` anlegt — die Schlüssel stehen in
|
|
`_locales/de/messages.json`.
|
|
|
|
---
|
|
|
|
## Sicherheit
|
|
|
|
Ausführlich in [SICHERHEIT.md](SICHERHEIT.md). Die Lage ist entspannter als
|
|
bei der LibreOffice-Fassung, weil hier **keine fremden Dokumente geöffnet**
|
|
werden — der heikelste Punkt entfällt. Die wichtigsten Maßnahmen:
|
|
|
|
- Zugriffsrecht nur für die eingetragene Adresse, zur Laufzeit erbeten
|
|
- Nur die fünf tatsächlich benötigten Berechtigungen — `compose.send` war
|
|
im ersten Entwurf enthalten, ohne je benutzt zu werden, und ist entfernt
|
|
- Nur `http` und `https` als Basisadresse
|
|
- Dateinamen aus Anhängen werden bereinigt — sie stammen vom Absender
|
|
- Anhangdaten werden erst beim Hochladen geladen, nicht beim Öffnen des
|
|
Dialogs
|
|
- Freigabelinks und Dokumentnamen werden beim Einfügen HTML-maskiert
|
|
- Aufträge zwischen Dialog und Ereignisseite werden nach 30 Minuten
|
|
verworfen
|
|
|
|
---
|
|
|
|
## Aufbau
|
|
|
|
```
|
|
manifest.json
|
|
background.js Menüs, Schaltflächen, Vermittlung
|
|
lib/
|
|
client.js REST-Client (fetch, FormData)
|
|
settings.js Einstellungen, Dateinamen, Hilfsmittel
|
|
ui/
|
|
store.html/.js Ablegen: Anhänge oder ganze Nachricht
|
|
classify.html/.js Klassifizierung direkt danach
|
|
insert.html/.js Einfügen als Anhang oder Link
|
|
options.html/.js Verbindung einrichten
|
|
gemeinsam.js/.css geteilte Hilfsmittel
|
|
_locales/{de,en,fr}/
|
|
icons/
|
|
```
|
|
|
|
Die Dialoge sprechen **nicht** selbst mit Paperless, sondern lassen die
|
|
Ereignisseite arbeiten. Dort hängt die zur Laufzeit erteilte Berechtigung;
|
|
ein Dialogfenster müsste sie sonst erneut erbitten.
|
|
|
|
---
|
|
|
|
## Vor einer Veröffentlichung
|
|
|
|
| Datei | Was |
|
|
|---|---|
|
|
| `manifest.json` | `browser_specific_settings.gecko.id`, `author`, `homepage_url` |
|
|
| `LICENSE` | Rechteinhaber |
|
|
|
|
Die Kennung sollte einer Domain folgen, die dir gehört. Aktuell steht dort
|
|
`paperless@example.org`.
|
|
|
|
---
|
|
|
|
## Lizenz
|
|
|
|
MIT, siehe [LICENSE](LICENSE).
|
|
|
|
## Haftung
|
|
|
|
Die Erweiterung schreibt in ein Dokumentenarchiv. Sie wurde gegen eine
|
|
Paperless-Instanz entwickelt, aber nicht formal getestet. Die MIT-Lizenz
|
|
schließt jede Gewährleistung aus.
|
|
|
|
Vor dem ersten produktiven Einsatz: eine Testnachricht ablegen und in
|
|
Paperless nachsehen, ob Titel, Datum und Anhänge stimmen.
|