`app:gmail:skipped` on a real mailbox (#90) showed what the ownership filter was dropping: the account owner's own mail. 202 sent from "send mail as" addresses (From: pl@pmdevelopment.de) 89 forwarded in from an address not connected here 43 Gmail drafts 14 received, with no recipient header naming anyone 4 addressed to the googlemail.com spelling of the account 6 chats resolveOwningAccount() kept a message only when its headers named the account. It now keeps one for the account unless another connected account has the better claim (a Gmailify sibling named in its headers): SENT or DRAFT the sibling the From names, else this account received resolveReceivedAccount()'s answer, else this account; with Gmailify attribution switched off, still only mail addressed to this account CHAT nobody, and recorded as before GmailAddressFilter reads googlemail.com as gmail.com. The listing never asked for Spam and Trash although its comment said it did: messages.list leaves both out without includeSpamTrash, and getProfile's messagesTotal, the import's total, counts them. How much of the 11,200 that mailbox was short of this accounts for is not known yet: its import was still running when it was counted. A finished import does not list again, so the migration clears the record of declined messages (chats aside) and every Gmail account's backfill markers. Each lists its mailbox once more, fetching only what it does not hold. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
plMail-Dokumentation
Das Handbuch. Die README sagt, was plMail ist, und bringt dich zu einer laufenden Instanz; hier steht alles, was danach kommt — jede Funktion und ihre Bedienung, die Installation auf dem, was du zur Verfügung hast, die Registrierung der Google- und Microsoft-Anwendungen, mit denen plMail spricht, und wie die Teile darunter arbeiten.
Gespiegelt ins GitHub-Wiki, das aus diesen Dateien erzeugt wird. Bearbeite sie hier; im Wiki-Browser vorgenommene Änderungen überschreibt die nächste Spiegelung.
| Wenn du … willst | Fang an bei |
|---|---|
| eine Funktion benutzen | plMail verwenden |
| es installieren oder betreiben | Installieren und betreiben |
| Gmail, Outlook oder einen CalDAV-Server anbinden | Anbieter |
| die Interna verstehen oder erweitern | Wie es funktioniert |
plMail verwenden
Eine Seite pro Bereich. Jede endet mit Verweisen nach Wie es funktioniert, wo der Mechanismus dahinter steht.
| Seite | Worum es geht |
|---|---|
| Lesen, Konversationen, Labels, Suche und ihre Operatoren, Zurückstellen, Anhänge, Verfassen, Signaturen, Emoji und eingebettete Bilder, später senden, Lesebestätigungen, Entwürfe, Senden rückgängig machen | |
| Konten und Aliase | Gmail-, Outlook- und IMAP-Konten hinzufügen, Absendeadressen, Einstellungen pro Konto |
| Zustand der Konten | Was kaputt ist und was es behebt, ein Konto neu verbinden, ohne seine Post zu verlieren, die zwei Arten, wie Push kaputtgeht |
| Vorlagen | Wiederverwendbare Nachrichten, der Ordnerbaum, der deine Konten spiegelt, Variablen für Empfänger, Absender, Signatur und Datum, Einfügen beim Verfassen |
| Filter | Bedingungsbäume, Aktionen, die Rückübersetzung in einen Satz, eine Regel auf bereits eingetroffene Mail anwenden |
| Kalender | Die vier Ansichten und das Zeitraster, Termine anlegen und bearbeiten, Wiederholungen, eine einzelne Termininstanz bearbeiten, der angedockte Bereich |
| Einladungen und Termine aus E-Mails | Zu- und Absagen, Termine aus Einladungen und aus gewöhnlichem Fließtext, Vorschläge, „Demnächst“ |
| Erinnerungen | Erinnerungen setzen, wie sie zugestellt werden, was eine frische Installation braucht, damit sie ankommen |
| Verbundene Kalender | Google-, Microsoft- und CalDAV-Kalender abonnieren, Abgleich in beide Richtungen, ICS-Import, -Export und Feed-Abonnements, doppelte Termine |
| Teilen und Buchen | Freigabelinks und was jeder preisgibt, Buchungsseiten, wie eine Buchung ankommt |
| Dateien und Integrationen | Anhängen aus und Speichern in Drive, Photos, OneDrive, Dropbox, Nextcloud, Immich und Paperless-ngx |
| Sicherheit | Dein Passwort ändern, Zwei-Faktor-Authentifizierung, Wiederherstellungscodes, gemerkte Geräte, App-Passwörter, Sitzungen |
| Andere Clients | Einen JMAP-Client verbinden, Passwörter pro App, die PWA und Browser-Benachrichtigungen |
| Darstellung | Themes, eigene Farben und Hintergrund, die Live-Vorschau, was eine Listenzeile zeigt, Schriftart und Textgröße, Dichte je Bereich, Import und Export, Sprache |
| Administration | Benutzer und Rollen, ein Konto abschalten, Integrationen freischalten, Monitoring, Warteschlangen und der Versions-Chip |
Installieren und betreiben
| Seite | Worum es geht |
|---|---|
| Docker Compose | Der unterstützte Weg, von Anfang bis Ende |
| Hinweise zu den Plattformen | Linux, Windows über WSL2, macOS und NAS-Geräte |
| Hinter einem Reverse Proxy | TLS, APP_PUBLIC_URL, TRUSTED_PROXIES — und was ohne sie kaputtgeht |
| Konfigurationsreferenz | Jede Umgebungsvariable, was sie tut und was passiert, wenn sie falsch steht |
| Sichern und Wiederherstellen | Was zu sichern ist, der Verschlüsselungsschlüssel und die Wiederherstellung auf einem neuen Host |
| Konfigurationssicherung | Einstellungen und Zugangsdaten einer Installation als eine verschlüsselte Datei zu einer anderen tragen |
| Aktualisieren | Migrationen laufen beim Start, was das bedeutet, und wie du erkennst, welcher Build läuft |
| Demo-Modus | Eine öffentliche Demo betreiben: Wegwerf-Postfächer, Mail nach Drehbuch, und was dabei abgeschaltet wird |
| Fehlersuche | Health-Checks, die Warteschlange, Protokolle und die Fehler, die tatsächlich vorgekommen sind |
Anbieter
Jede Seite nennt die genaue Konsole, die genauen Häkchen und die genauen Redirect-URIs.
| Seite | Worum es geht |
|---|---|
| Cloud-Projekt, OAuth-Client, Scopes für Mail und Kalender, Pub/Sub für Gmail-Push, Watch-Kanäle für den Kalender und Domain-Verifizierung | |
| Microsoft | App-Registrierung in Azure, Redirect-URIs, delegierte Berechtigungen, Wahl des Tenants, Graph-Abonnements |
| IMAP und SMTP | Gewöhnliche Postfächer, IDLE, und die Einstellungen, über die sich die Server uneinig sind |
| CalDAV | Discovery, App-Passwörter, und die Server, die getestet wurden |
| ICS-Feeds | Einen veröffentlichten Kalender per URL abonnieren, und warum manche Adressen abgelehnt werden |
| Single Sign-on | Anmeldung bei plMail über Authentik, Keycloak oder einen anderen OpenID-Connect-Anbieter: Einrichtung, Verknüpfung von Konten und automatisches Anlegen |
Wie es funktioniert
Tiefer als die Notizen in CONTRIBUTING, und gedacht für jemanden, der plMail prüft oder erweitert, statt es zu betreiben.
| Seite | Worum es geht |
|---|---|
| Architektur | Die Schichten, was wo liegt, und die Regeln, die das so halten |
| Mail-Ingest | Der Weg vom Anbieter in die Datenbank, Zuordnung zu Konversationen, Kategorisierung |
| Das Kalendermodell | JSCalendar in jsonb, projizierte Spalten, Termininstanzen, Wiederholungen und Ausnahmen |
| Die Sync-Engine | Der Treibervertrag, den jeder Anbieter erfüllt, Push-Kanäle, Deduplizierung |
| KI-Unterstützung | Die optionalen Modell-Funktionen: was standardmäßig aus ist und warum das Vektor-Design ohne pgvector auskommt |
| Terminerkennung | Wie aus einer Einladung und wie aus einem Satz ein Kalendereintrag wird |
| JMAP | Was umgesetzt ist, was bewusst nicht, und die Id-Räume |
| Sicherheitsmodell | Verschlüsselung im Ruhezustand, die Geheimnisdatei, Token, und was ein öffentlicher Link erreicht |
Wer einen Client schreibt, sollte zusätzlich Client development lesen — die Referenz auf Protokollebene.
Konventionen auf diesen Seiten
- Befehle stehen so, wie du sie gegen eine Compose-Installation ausführen würdest:
docker compose exec php php bin/console <command>. Lass das Präfix weg, wenn du plMail direkt betreibst. - Pfade in den Einstellungen werden als
Einstellungen → Kalender → Verbundene Kalendergeschrieben. - Ein Abschnitt „Fallstricke“ am Ende einer Seite sammelt die Fallen — den Fehler, dessen Ursache sich aus dem Symptom nicht erschließt. Sie stehen dort, weil sie passiert sind.