Thunderbird und Exchange-Kalender: Umstieg von TbSync auf DavMail   Vor kurzem aktualisiert!


Mozilla Thunderbird

Wer im Linux-Umfeld arbeitet und seine Exchange- oder Microsoft-365-Termine mit Mozilla Thunderbird synchronisieren muss, stößt unweigerlich auf ein altbekanntes Problem: Thunderbird spricht von Haus aus (noch) kein natives Exchange-Protokoll für Kalender (ab Version 145 soll es eine native Exchange/EWS Unterstützung in Thunderbird geben). Über Jahre hinweg gab es dafür eine gute Lösung: das Add-on TbSync in Kombination mit dem Provider für Exchange ActiveSync (EAS). Doch ein kleiner Fehler im Detail hat diese Lösung für mich jetzt unbrauchbar gemacht.

Wie TbSync das Problem bisher löste

Die Vorgehensweise von TbSync war einfach und simpel: Das Add-on klinkte sich tief in die Kontenverwaltung von Thunderbird ein und simulierte gegenüber dem Exchange-Server ein mobiles Endgerät. Es nutzt dafür das Exchange ActiveSync (EAS)-Protokoll – also exakt die Schnittstelle, die Microsoft für Smartphones und Tablets entwickelt hat, um Mails, Kontakte und Termine batterieschonend zu übertragen.

Innerhalb von Thunderbird agierte TbSync als eigene Abstraktionsschicht. Nach der Eingabe der Zugangsdaten synchronisierte das Plugin die Exchange-Daten in eine eigene lokale Zwischendatenbank und spiegelte sie von dort aus in das Thunderbird-eigene Kalendermodul (Lightning). Man hatte eine komfortable Benutzeroberfläche direkt in den Thunderbird-Einstellungen, konnte Konten per Klick aktivieren und Ressourcen einzeln an- oder abwählen. Da EAS darauf ausgelegt ist, Datenmengen zu minimieren, lief dieser Abgleich meist extrem flink.

Das verschwundene „Ort“-Feld

Das Fundament dieser mobilen Synchronisation zeigt jedoch jetzt Probleme bei den Inhalten von Terminen. Nach einem der letzten Updates – sei es durch restriktive Richtlinien auf Serverseite bei Exchange oder durch Anpassungen in den jüngsten Thunderbird-Versionen – trat bei mir ein fataler Fehler im Arbeitsalltag auf: Das Feld „Ort“ (Location) wurde bei der Synchronisation nicht mehr übertragen bzw. angezeigt.

Das Problem liegt in der Natur des ActiveSync-Protokolls begründet. Da Microsoft EAS primär für Smartphones optimiert, werden komplexe Datenstrukturen stark vereinfacht. In modernen Exchange-Umgebungen sind Räume und Standorte jedoch längst keine einfachen Textzeilen mehr, sondern komplexe Objekte (mit Raumkapazitäten, Ausstattungsmerkmalen und Verzeichnis-Verknüpfungen). Wenn Exchange bei einem Update die Art und Weise ändert, wie diese Raumobjekte im EAS-Payload kodiert werden, bricht das Mapping von Drittanbieter-Plugins wie TbSync zusammen. Das Add-on versteht die neue Struktur nicht, findet den gewohnten Textstring nicht mehr und lässt das Feld beim Import in Thunderbird einfach leer. Für den Nutzer bedeutet das: verpasste Meetings oder ständiges Suchen im Webmailer.

Der Paradigmenwechsel: EWS und DavMail als offenes Gateway

Die Lösung erfordert einen Wechsel des Protokolls, weg vom mobilen ActiveSync und hin zu EWS (Exchange Web Services). EWS ist das vollständige, mächtige Desktop-Protokoll von Microsoft, das alle Kalendermetadaten ungefiltert und exakt überträgt. Da Thunderbird EWS-Kalender aktuell noch nicht nativ beherrscht, verschieben wir die Logik vom Mailclient weg hin zum Betriebssystem.

Hier kommt DavMail ins Spiel. Anstatt ein Plugin in Thunderbird zu installieren, schalten wir DavMail als winzigen, lokalen Gateway-Dienst im Hintergrund dazwischen. DavMail verbindet sich über das robuste EWS-Protokoll mit dem Exchange-Server, holt die Termine ab und übersetzt sie auf dem eigenen Rechner on-the-fly in offene, universelle Web-Standards – namentlich CalDAV für Kalender und CardDAV für Kontakte. Thunderbird muss dadurch überhaupt kein Microsoft-Protokoll mehr beherrschen, sondern kommuniziert einfach über standardisierte Netzwerkschnittstellen mit localhost.

Schritt-für-Schritt: Einrichtung auf modernen Linux-Systemen

Diese Anleitung ist universell für moderne Linux-Distributionen (wie Ubuntu, Debian oder Fedora) ausgelegt, die systemd zur Diensteverwaltung nutzen.

1. Java-Laufzeitumgebung installieren

Da DavMail in Java geschrieben ist, installieren wir zunächst eine schlanke, headless (oberflächenlose) Java-Laufzeitumgebung über die Paketverwaltung:

# Für Debian/Ubuntu-basierte Systeme:
sudo apt update && sudo apt install openjdk-21-jre-headless unzip

# Für Fedora/RHEL-basierte Systeme:
sudo dnf install java-21-openjdk-headless unzip

2. DavMail herunterladen und platzieren

Wir laden das plattformunabhängige Binärpaket herunter und entpacken es im Systemverzeichnis /opt:

wget https://sourceforge.net/projects/davmail/files/davmail/6.2.2/davmail-6.2.2-3546.zip/download -O davmail.zip
sudo unzip davmail.zip -d /opt/davmail
rm davmail.zip

3. Die Konfiguration festlegen

Wir erstellen eine zentrale Konfigurationsdatei unter /etc/davmail/davmail.properties:

sudo mkdir -p /etc/davmail
sudo nano /etc/davmail/davmail.properties

Hier fügen wir die Kernkonfiguration ein. Wichtig ist die Bindung an 127.0.0.1, damit der Dienst nur lokal lauscht:

davmail.url=https://<dein-exchange-server.de>/EWS/Exchange.asmx
davmail.mode=EWS
davmail.caldavPort=1080
davmail.bindAddress=127.0.0.1
davmail.server=true
davmail.disableGuiNotifications=true
davmail.enableCaldav=true
# Ungenutzte Protokolle zur Sicherheit deaktivieren
davmail.enableImap=false
davmail.enablePop=false
davmail.enableSmtp=false
davmail.enableLdap=false

4. Den systemd-Hintergrunddienst einrichten

Damit das Gateway bei jedem Systemstart automatisch im Hintergrund geladen wird, erstellen wir eine Service-Unit:

sudo nano /etc/systemd/system/davmail.service

Inhalt der Datei:

[Unit]
Description=DavMail Exchange Gateway
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/java -jar /opt/davmail/davmail.jar /etc/davmail/davmail.properties
Restart=on-failure
User=nobody

[Install]
WantedBy=multi-user.target

Mit den folgenden Befehlen aktivieren und starten wir den Dienst:

sudo systemctl daemon-reload
sudo systemctl enable --now davmail.service

Integration in Thunderbird

Der große Unterschied zum alten TbSync-Ansatz: In Thunderbird fügen wir nun keine neuen „Konten“ mehr hinzu, sondern binden die Kalender ganz klassisch über das Netzwerk als CalDAV-Kalender ein.

  • Hauptkalender: http://127.0.0.1:1080/users/deine.email@domain.de/calendar
  • Eigene Unterkalender: http://127.0.0.1:1080/users/deine.email@domain.de/calendar/ProjektName/
  • Freigaben von Kollegen: http://127.0.0.1:1080/users/kollege@domain.de/calendar/

Als Benutzername wird die normale Exchange-E-Mail-Adresse eingetragen. Sobald Thunderbird die Verbindung aufbaut, kommt die Passwortabfrage auf – hier greift das ganz normale Domänenpasswort.

Fehler behoben und Gewinn an Stabilität

Die Umstellung von einem internen Thunderbird-Plugin (TbSync) auf ein lokales Betriebssystem-Gateway (DavMail) wirkt im ersten Moment nach mehr Einrichtungsaufwand. Der Gewinn an Stabilität ist jedoch enorm. Da EWS die Kalenderdaten nativ und vollständig überträgt, gehört der Bug mit den verschwundenen Ortsangaben sofort der Vergangenheit an. Zudem entkoppelt man sich von den ständigen API-Änderungen der Thunderbird-Add-on-Schnittstelle. Ein großer Schritt hin zu einem verlässlichen Linux-Desktop im Firmenumfeld.


Fallstrick bei Headless-Diensten: Wenn das SSL-Zertifikat den Sync lautlos blockiert

Wer Gateways wie DavMail als systemweiten Hintergrunddienst (z. B. unter dem unprivilegierten Benutzer nobody) betreibt, läuft bei der Erneuerung von Server-Zertifikaten schnell in eine fiese Falle. Nach einem routinemäßigen Zertifikatswechsel auf Serverseite schlägt die Synchronisation plötzlich fehl, und der Mail-Client meldet stur einen Fehler (503 Service Unavailable).

Ein Blick in das System-Journal (journalctl) offenbart dann meist folgende Blockade:

Server provided an untrusted certificate,
you can choose to accept or deny access.
Accept certificate (y/n)?
... WARN [CaldavConnection] davmail - Connect exception: javax.net.ssl.SSLHandshakeException (certificate_unknown) User rejected certificate

Das Problem: Der „kopflose“ Prompt

Da das Gateway im Hintergrund ohne interaktives Terminal (headless) läuft, wird die Frage Accept certificate (y/n)? ins Leere gedruckt. Niemand kann mit y antworten, Java bricht den SSL-Handshake ab und die Verbindung stirbt.

Der Quick-Fix und seine Tücken (Fingerprinting)

Man könnte nun versucht sein, den Fingerabdruck (SHA-Fingerprint) des neuen Server-Zertifikats direkt in der Konfigurationsdatei (z. B. über davmail.server.certificate.hash=...) hart zu hinterlegen. Das löst zwar das akute Problem, ist aber eine Wartungsbaufalle: Sobald die Organisation das Zertifikat im nächsten Jahr routinemäßig erneuert, bricht der Dienst erneut ab.

Die elegante und dauerhafte Lösung: Vertrauen in die Zertifikatskette

Statt dem spezifischen Endnutzer-Zertifikat des Mailservers einzeln zu vertrauen, importiert man die übergeordnete Zwischenzertifizierungsstelle (Intermediate CA) in den lokalen Truststore des Betriebssystems. Da diese CAs meist eine Gültigkeit von 10 bis 15 Jahren besitzen, ist danach für lange Zeit Ruhe.

Unter Ubuntu/Debian lässt sich das Zwischenzertifikat elegant systemweit hinterlegen, woraus sich auch die Java-Umgebung des Hintergrunddienstes automatisch bedient:

  1. Zwischenzertifikat vom Server abrufen: Mit OpenSSL lässt sich die Zertifikatskette des Servers (mail.beispiel-organisation.de) auslesen und das Intermediate-Zertifikat (hier als zweites Glied der Kette) isolieren: openssl s_client -connect mail.beispiel-organisation.de:443 -showcerts </dev/null | awk '/BEGIN CERTIFICATE/,/END CERTIFICATE/ { if (/BEGIN CERTIFICATE/) f="/tmp/inter_cert_" ++i ".crt"; print > f }'
  2. Zertifikat im OS-Truststore hinterlegen: Das isolierte Zwischenzertifikat (in der Regel inter_cert_2.crt) wird in das lokale Verzeichnis für vertrauenswürdige Zertifikate kopiert. Das anschließende Update-Skript aktualisiert sowohl die Linux-Zertifikate als auch den Java-Keystore (cacerts) in einem Rutsch: sudo cp /tmp/inter_cert_2.crt /usr/local/share/ca-certificates/beispiel-intermediate-ca.crt sudo update-ca-certificates
  3. Dienst neu starten: Nach einem Neustart des Hintergrunddienstes akzeptiert die Java-Umgebung den SSL-Handshake vollautomatisch – auch dann, wenn der Betreiber in Zukunft neue, von dieser CA signierte Server-Zertifikate einsetzt.