verlässliche Beschreibung für Dateistruktur des Adressbuches

  • Gibt es eine verlässliche Beschreibung für die interne Struktur der Adressbücher? Wenn ich mir die abook-x.mab Dateien bei mir so anschaue, dann ist jede Datei anders strukturiert. Im Header sind jedesmal andere Hex-Zahlen zu den einzelnen Feldern zugeordnet und der Header stimmt bei keiner Datei mit dem eigentlichen Inhalt überein. Und selbst bei den einzelnen Datensätzen innerhalb einer Datei steht jedesmal was anderes davor. Und in wirklich jeder Datei ist es anders. Und es passt nie zum Header und auch nie zu den anderen Dateien.


    Gruß Thomas

  • Moin,

    die Adressbücher haben ein ziemlich übles Format.

    Dazu (aus https://en.wikipedia.org/wiki/Mork_(file_format) )

    "...the single most braindamaged file format that I have ever seen...".

    Dort sind weitere Quellen verlinkt, die meisten befassen sich mit der Ablösung des Formats.

    Nur, bei TB ist das mit der Weiterentwicklung so eine Sache...

    Aber es gibt vielleicht Hoffnung, in Form des Addons

    Cardbook

    Ich habe es nur mal getestet und für brauchbar befunden, habe es aber aktuell nicht im Einsatz.

    Gruß, muzel

    Edited 2 times, last by muzel: typo ().

  • Ja Mork wie Murks. Den WIKI-Eintrag kenne ich. Es gibt leider keine ordentliche Beschreibung, wie aus den einzelnen verqueren "Datensätzen" etwas lesbares wird. Ich hatte gehofft, dass schon mal jemand was programmiert hat und weiß, wie der Schrott zu interpretieren ist.

    Mein Problem ist, dass ich aus MS ACCESS heraus Kontakte synchronisieren muss. Also Kontakt aus TB auslesen und auch neue Kontakte in TB anlegen und bestehende Kontakte unter umständen ändern,bzw. Infos ergänzen.

  • Also Kontakt aus TB auslesen und auch neue Kontakte in TB anlegen und bestehende Kontakte unter umständen ändern,bzw. Infos ergänzen.

    Was spricht denn dagegen, dafür Thunderbird selbst zu verwenden? Die API ist mäßig intuitiv (lies: gar nicht), aber imho immer noch deutlich angenehmer als manuell in Mork herumzupfuschen. Im Menü unter Extras|Entwickler-Werkzeuge|Fehlerkonsole gibt es ein Ausführen-Feld um mal eben kleinere Dinge zu erledigen. Die eigentlich überlegene Java-Script-Umgebung im selben Menü scheint jedoch nicht zu funktionieren.


    Beispiel: Ein Array von nsIAbDirectory-Objekten für jedes Adressbuch erhält man mit

    Code
    Components.utils.import("resource:///modules/mailServices.js");Components.utils.import("resource:///modules/iteratorUtils.jsm");toArray(fixIterator(MailServices.ab.directories))

    Als "Dokumentation" ist hier der Quelltext von Thunderbird hilfreich. Ein guter Einstieg ist die Deklaration des nsIAbDirectory-Interfaces. Einige Details sind sehr komisch und schlecht dokumentiert, z.B. müssen für Kontakt-Bilder Dateien im Profil angelegt werden, die dann als "Name" des Bildes referenziert werden. Eventuell kann dir dort der Quelltext eines bestehenden Synchronisations-Add-ons helfen. Ich kenne mich naturgemäß nur in der Codebasis von GeneralSync aus, eventuell ist MyPhoneExplorer für einen einmaligen Im- oder Export interessanter (GeneralSync stellt ein eigenes Adressbuch bereit, während MyPhoneExplorer auf bestehende Adressbücher zugreift). Beide Add-ons sind keine freie Software, insofern darf deren Code nicht direkt in eigener Software verwendet werden.

  • Der Beispielcode erzeugt Arrays mit nahezu unendlicher und undurchschaubarer Struktur.


    Das Problem ist, dass alles in VBA innerhalb von Access laufen muss.

    Ich brauche die Möglichkeit, aus VBA heraus auf TB zuzugreifen.

    Ich müsste also ein Objekt erzeugen können, über dass ich auf Eigenschaften und Methoden von TB zugreifen kann.

    Also sowas in der Art

    Code
    Dim tb As New Thunderbird.Application

    Und dann sicher noch weitere derartige Objektdeklarationen und auch Zuweisungen, damit ich an die einzelnen Adressbücher komme.

    Für den Zugriff auf Outlook ist das eine Hand voll Code. Dann habe ich eine Schleife über alle Adressbücher in der ich ich dann wiederum in einer weiteren Schleife alle Kontakte des jeweiligen Adressbuches durchlaufe. Und so, wie das in VBA läuft, funktioniert das in jeder anderen beliebigen Programmiersprache.

    Grundvoraussetzung ist lediglich, dass man die notwendigen Bibliotheken lädt.

    Bei TB habe ich bisher nichts in der Hinsicht gefunden. Weder Bibliotheken, die man laden kann, noch eine Beschreibung.

  • Ich brauche die Möglichkeit, aus VBA heraus auf TB zuzugreifen.

    Da muss ich passen, ich kenne mich mit VBA nicht aus. Ich kann mir auch nicht vorstellen, dass eine VBA-Schnittstelle für Thunderbird existiert.


    Bleibt also vermutlich wirklich nur Mork-Parsing (und vorher eine Prüfung ob Thunderbird läuft: das Profil kann nur dann sicher bearbeitet werden, wenn Thunderbird geschlossen ist). Einzige Option die ich mir noch vorstellen könnte, ist die Verwendung von Outlook-spezifischen Funktionen von Thunderbird (Extras|Importieren... erlaubt unter Windows iirc die Verwendung von MAPI, eventuell gibt es auch etwas für die Gegenrichtung). Langfristig könnte man auch über sowohl in Outlook als auch in Thunderbird eingebundene GeneralSync-Addressbücher gehen, aber bis die Outlook-Integration von GeneralSync fertig ist dauert es denke ich noch ein paar Monate.

  • Da muss ich passen, ich kenne mich mit VBA nicht aus. Ich kann mir auch nicht vorstellen, dass eine VBA-Schnittstelle für Thunderbird existiert.

    Das hat nichts mit VBA zu tun, sondern das ist eine API-Schnittstelle, die von jeder Programmierspache aus (C++, Java, ...) angesprochen werden kann, wenn die entsprechenden Bibliotheken (DLL, OCX) geladen werden.



    Gruß Thomas

  • API-Schnittstelle

    Du meinst vielleicht Microsoft COM (component object model)? Falls ja: Thunderbird nutzt intern das inhaltlich verwandte XPCOM (nicht mit Microsoft's Variante kompatibel, dafür cross-platform). Das Codebeispiel oben nutzt diese Schnittstellen, der Array enthält XPCOM-Objekte.


    Unter Windows bietet Thunderbird darüber hinaus Microsoft's "Simple MAPI" an, eine COM-Schnittstelle für E-Mails (nur Nachrichten, ohne Adressbücher oder Kalender). Mir ist keine COM-basierte Adressbuch-Schnittstelle bekannt (der Importer kann jedoch wie bereits erwähnt Adressbücher via "Extended MAPI" z.B. von Outlook beziehen).