Programmatisches Auslesen des Fax Ausgangsprotokolls in David 12.00, Windows 10, Powershell, API

  • Hallo zusammen,


    es wäre mir von grossem Nutzen, wenn ich das Fax Ausgangsprotokoll von Tobit David 12.00 mit Hilfe eines Powershellskripts auslesen könnte und hierbei

    filtern könnte, welche Faxe den Status "versendet" haben.


    Ok - es gibt zwar die API für Tobit David zum Download und es gibt auch eine Dokumentation, jedoch nur für C oder VB. Und die Dokumentation geht ausführlich auf Emails, Kontakte und Adressen, aber so gut wie gar nicht auf Faxversand - das ist sehr schade.

    Vielleicht gibt es ein paar unter Euch, die hierfür schon etwas unter Powershell gebastelt haben. Für ein paar hilfreiche Snippets wäre ich sehr dankbar. Ebenso wäre ich sehr dankbar für Tips zur Literatur - gibt es Bücher über Tobit API, die eine genau, detaillierte Beschreibung der API liefern, am Besten auch mit Beispielen.


    Eventuell würde es mir auch schon reichen, wenn ich Zugriff auf die SQL Datenbank von Tobit David hätte - eventuell ist der Faxausgang ja auch dort in Tabellen historisiert - dann könnte ich ja durch Absetzen eines SQL Commands meine Ergebnisse ziehen. Aber ich habe Null Plan, wie ich auf die SQL DB von David komme - Connection String, User usw...


    Das was ich im Netz dazu gefunden habe, bringt mich hierzu nicht wirklich weiter.


    Ich danke Euch


    Gerold

    • Offizieller Beitrag

    Hallo Gerold,


    erstmal die "schlechten" Nachrichten. Bücher gibt es meines Wissens nach nicht und david bringt zwar eine SQL Datenbank mit, die ist aber nur für den Suchindex und den Chat zuständig. Alles andere ist wie eh und je in Dateien abgespeichert (die man allerdings nicht so ohne weiteres lesen und bearbeiten kann, da keine Standardformate wie XML, EML, etc.).


    Kommen wir zu den guten Nachrichten:
    Die Doku und die Beispiele darin sind recht gut, wenn man sich einmal eingefunden hat. Ich empfehle als Startpunkt das Object Diagram (die Objekte kann man dort auch anklicken und kommt zur entsprechenden Beschreibung). Hier sieht man die Abhängigkeiten und im Prinzip muss man sich auch bei der Programmierung mit der API immer von oben nach unten "durchhangeln".

    Z.b. muss man zunächst ein Application Objekt instanziieren um davon ein Account ableiten, dann ein Archive-Objekt und davon dann MessageItems, etc.


    Zusätzlich dann die Examples in den verschiedenen Sprachen - auch wenn hier Powershell nicht zur Verfügung steht, sollte man sich aus VB und C# das meiste herleiten können (ich habe das z.B. auch schon mit PHP genutzt).


    Die Beispiele bei den einzelnen Objekten und Methoden sind dann oft nur in C/C++, da wirds dann etwas schwieriger mit dem herleiten.


    Alle Typen in David sind MessageItems. Die expliziten Typen wie MailItem, FaxItem, etc. werden vom MessageItem abgeleitet.

    D.h. mit dem MessageItem und MessageItem2 bekommst Du auch Faxe.


    Grundsätzlich bevorzuge ich das MessageItem2, weil es ca. um den Faktor 10 schneller arbeitet. Hier kann man, wie auch beim MessageItem die Fields benutzen (siehe in der Doku innerhalb Objects "Fields", "Field", und "Field2" und ganz unten unter dem Object Diagram "Field ID's).


    Für Deine Anforderung ganz speziell sollten dann noch der Eintrag "DvItemFilterBits" (innerhalb Types) interessant sein.

    Wenn ich es richtig im Kopf habe, ist eine zeitliche Selektion aber nicht oder nur bedingt möglich oder hat bei mir nicht immer geklappt, kann mich nicht mehr genau erinnern. Da muss man im Zweifelsfall über alle Einträge iterieren und das Datum vergleichen. Für sowas auf jeden Fall das MessageItem2 nutzen, wg. der Performance.


    Damit solltest Du einen guten Startpunkt haben.


    Der Hauptknackpunkt den Du jetzt noch hast, ist die Verwendung der API in Powershell.

    Ich bin einigermaßen bewandert in der Nutzung der Powershell, allerdings nicht mit externen Bibliotheken.

    Soweit mir bekannt, kann man aber alle Bibliotheken verwenden, die man auch in .NET verwenden kann, oder?


    In PHP muss man z.B. ein COM-Objekt erzeugen, foglend mal ein Beispiel.

    Und hier noch ein Link einer schnellen Suche zu dem Thema in Verbindung mit Powershell

    PowerShell: How to use a COM Object
    By using the windows PowerShell it is possible to access COM Objects. Within this article I want to show you how to create, use and remove a reference to a COM…
    coders-corner.net



    Bei weiteren Fragen einfach wieder melden. Und wenn Du Erfolg hast, schreib es gerne für die Nachwelt hier mal rein. :)


    Viele Grüße
    Jens

    • Offizieller Beitrag

    Hallo Gerold,


    habe das gerade mal getestet. Einfach nur direkt in der Powershell, kein Skript angelegt, keine Exceptionbehandlung, etc.

    Ausgespuckt werden die Betreffs der Mails im Ordner (in meinem Fall ein Unterordner meines Eingangs, mit nur 4 Einträgen).


    Der Client muss natürlich auf dem PC installiert sein wo man das macht, da sonst die API nicht zur Verfügung steht.



    Viele Grüße
    Jens

  • Hallo Jens,


    super - vielen Dank!


    Deine Tips werden mir sicherlich sehr gut helfen - zumindest für den Einstieg.

    Jetzt werde ich mal versuchen, Deine Beispielschleife bei mir zu testen bzw. versuchen, diese Schleife so abzuändern, dass ich damit die Objekte des Faxversands ermitteln kann - das wäre phantastisch :)


    Alles Gute und Gruss

    Gerold

    • Offizieller Beitrag

    Hallo Gerold,


    ich hab das Beispiel noch ein bisschen erweitert und auch in einer .ps1 Datei getestet.


    Im Beispiel siehst Du zwei Varianten wie Du an die Faxe kommen kannst - entweder mit einer Schleife über alle Einträge und Auswertung des DocumentType (in der Doku ganz unten auf "Field ID's" und dort den Link von const "Field_DocumentType" anklicken um an die Beschreibung zu gelangen) oder unter Verwendung der DvItemFilterBits in der Stringvariante - man muss das Prefix "DvItemFilter" einfach weglassen um an den richtigen String zu kommen (siehe dazu den Dokueintrag der Methode "GetArchiveEntries" im "Archive" Objekt).


    Im Codesnippet hier im Forum habe ich C# für das Codehighlighting ausgewählt, da Powershell nicht zur Verfügung steht.
    Daher nicht über die C# Angabe wundern.




    Viele Grüße
    Jens

    • Offizieller Beitrag

    Habe das letzte Beispiel gerade noch um eine zusätzliche Abfrage mit Eingrenzung über eine Zeitspannen-Angabe ergänzt.

  • Hallo Jens,


    alles klar - ich habs in Powershell hinbekommen - man muss auch noch ein zusätzliches Flagfeld beachten, damit man wirklich nur die tatsächlich versendeten Faxe rausfiltert.

    Ich stelle mein Powershell Skript bald hier rein.


    Ich kann jetzt alles auslesen - momentan reicht mir erstmal die Anzahl der versendeten Faxe. Aber es ist nur ein Indiz für Erfolg oder Misserfolg eines Massenversands.

    Cooler wäre es natürlich, wenn ich aus dem Tobit Fax Message Objekt auch die Information über das zugrundeliegende PDF, welches zum Faxversand als Image benutzt wurde, rauslesen könnte (also den Speicherort des zugrundeliegenden PDF).

    Dann könnte ich nämlich über eine programmatische Schleife über alle tagesaktuellen Messsageobjekte genau abgleichen - so in der Art: das war das von meinerSoftware erstellte PDF und das Pendant finde ich in dem MessageObjekt des Tobits Faxes oder eben (im Fehlerfalle) nicht.


    Nun weiss ich, dass man ff. machen kann - man hinterlegt (unsichtbar) im PDF die Faxnummer, versendet über Tobit Faxdrucker das Fax (der Drucker liest die versteckte Nummer aus und versendet automatisch). So ist das bei uns geregelt.

    Nun denke ich, könnte man - ausser der Faxnummer - auch noch den Pfad zur PDF als verstecktes Feld im PDF hinterlegen.

    Wäre das möglich ?

    Und wenn ja, welches Feld im MessageItem Objekt müsste hierzu gefüllt werden ?


    Wenn Du diesbezüglich Infos hast, wäre das ungemein hilfreich.


    Aber es ist auch schon jetzt sehr gut, da man sicher die Anzahl abgleichen kann. Bei Abweichungen muss man momentan dann halt manuell prüfen - und das kommt ja hoffentlich nur selten vor.


    Dank Dir schonmal

    Gerold

  • Hi Jens,


    hier mein kleines PS Skript - mit kurzen Kommentaren


    • Offizieller Beitrag

    Hallo Gerold,


    schön das es funktioniert hat und vielen Dank fürs Teilen!

    In der Funktionsleiste hier im Forum gibt es übrigens auch eine Funktion um Codesnippets zu formatieren (ziemlich weit rechts, sieht so aus: </> ) . Vielleicht kannst Du das in Deinem Post noch anpassen. Wenn Du danach auf das Wort "Quellcode" klickst, kannst Du noch Einstellungen vornehmen und hier C# als Syntaxhervorhebung auswählen (Powershell gibt es leider nicht, die C# Variante passt aber).


    Zu Deiner weiteren Anforderung:

    Zunächst mal ist die Bilddatei des Faxes kein PDF sondern eine TIF Datei. Diese liegt in dem Ordner, in dem auch das Fax liegt (wenn nicht anders verteilt im Ausgang des versendenden Benutzers). Du kannst über Rechtsklick > Eigenschaften im Client den Filename einsehen oder in der API das gleichnamige Field auslesen. Die Datei mit der Endung .001 ist die TIF Datei, kannst Du mit einem Bildbetrachter wie z.B. IrfanView öffnen.


    Eine Information über das Ursprungsdokument gibt es nicht. Es ist ja lediglich ein Drucker den man verwendet.

    Die Bilddatei ist auch immer vorhanden, egal ob der Versand funktioniert hat oder nicht.


    Daher ist mir nicht ganz genau klar was Du damit bezwecken willst.

    Oder gibt es manchmal Probleme bei der Erzeugung der Faxe, dass gar nicht erst alle zum David übertragen / dort erzeugt werden?


    Das "unsichtbare" Hinterlegen der Faxnummer erfolgt über den @@-Befehl @@Nummer. Der Befehl wird nicht unbedingt unsichtbar hinterlegt, im Gegenteil, er muss für den Faxdrucker lesbar sein. Ihr habt vermutlich nur die Schriftfarbe dem Hintergrund angepasst und es damit "unsichtbar" gemacht.


    Eine Liste der @@-Befehle findest Du in der Hilfe im David Client (F1), dort im Menü relativ weit unten "david Befehle".


    Wenn Du die Faxe mittels der API erzeugen würdest, könntest Du die UserFields benutzen um dort Informationen im Objekt zu hinterlegen. Für den Fax Drucker ist mir diesbezüglich keine Möglichkeit bekannt.


    Aber Du könntest für einen Abgleich den Betreff nutzen. Mit @@betreff kannst Du den Betreff übergeben - für den Faxversand selbst ist der nicht relevant, lediglich für den Eintrag im David Client (der Empfänger bekommt davon nichts mit). Wenn Du also z.B. den Namen des Dokumentes mit dem Befehl angibst, dann heißt der Eintrag im David so wie Dein PDF und Du kannst danach suchen. Theoretisch kannst Du auch den gesamten Pfad angeben (würde ich aber vermeiden, wenn es anders geht, einfach weil es nicht schön aussieht und ggf. ein Problem mit der Länge geben könnte).


    Viele Grüße
    Jens

  • Hallo Jens,


    die PDF's werden bei uns über die Software eines Drittanbieters erzeugt - und dann werden diese PDF's per Tobit Faxdrucker versendet. Natürlich könnte man diesen Prozess ändern - wäre aber zu kostspielig und aufwändig.


    Leichter wäre es, wenn die Software des Drittanbieters eine zusätzliche Information in "versteckter" Form mitliefern könnte, die man dann im Message Item zusätzlich auswerten kann - einen Hinweis hast Du mir ja jetzt gegeben - ich schau mal, was da geht - dank Dir !


    P.S: Formatierung habe ich hinbekommen

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!