Outlook

  • Hay mal wieder eine Frage, die mir keine Ruhe lässt.

    Ich nutze : OutlookEX.au3 UDF

    Nun stellt sich mir die frage wenn ich folgendes als beispiel habe :
    (posteingang etc. strings sind nun nicht mit hier im code drinnen der code ist sozusagen nur als schaubild gedacht.)


    Wie zum Geier kann ich prüfen lassen ob das

    Code
    oOutlook

    noch aktuell ist?

    Manchmal schließen die Nutzer outlook und starten es neu dann passiert das das

    Code
    oOutlook

    nicht mehr ansteuerbar ist, aber wie kann ich nun das erneuern lassen ?


    Gruß mojoe

  • Du kannst eine Funktion bauen, die prüft ob das Objekt noch aktuell ist und for jedem Aufruf entsprechend prüfen.

    (folgendes sind nur Annahmen):

    1. Beim start die pid von outlook auslesen und speichern

    2. in der oben angesprochenen funktion prüfen ob pid noch existiert

    2.a. wenn ja, wieder zurück

    2.b wenn nein: objekt schließen, pid neu suchen und speichern

    3. objekt (verbindung) neu aufbauen

    Edit: Ich habe leider nichts gefunden um das Objekt direkt zu prüfen aber evtl. weiß hier jemand mehr dazu.

    Edit2: Es gibt aber wohl ein Event das auftritt, wenn Outlook zu schließen beginnt, jedoch bin ich überfragt, wie man das abfangen/darauf reagiren kann: https://learn.microsoft.com/de-de/dotnet/a…iew=outlook-pia

    2 Mal editiert, zuletzt von Moombas (18. August 2023 um 12:06)

  • Ich schlage hier auch die Event-Methode vor. Sollte in etwa so aussehen:

    Code
    Global $oEvent = ObjEvent($oOutlook, "oOApp_")
    
    ; Hier sollte dann Dein Code folgen
    
    ; https://learn.microsoft.com/en-in/office/vba/api/outlook.application.quit(even)
    Func oOApp_Quit()
        MsgBox(0, "Outlook closing", "Goodbye, " & $oOutlook.GetNamespace("MAPI").CurrentUser
    EndFunc
  • @Moombas:Danke, deine Idee hört sich sehr gut an,

    war auch schon fast gefühlt am Ziel habe aber alles wieder verworfen, da ich auf der Arbeit bin und hier es so mega laut ist und ich micht nicht richtig konzentrieren konnte hab somit grad alles wieder gelöscht.

    Werde es aber zuhause nochmal versuchen.

    water: Danke, habe ich auch mal schnell versucht leider nichts dabei rumgekommen.

    Ich hole mir ja schon mit der Methode die ankommenden Mails, und das funktioniert auch solange man Outlook nicht schließt.

    Aber kannst du evtl nochmal ausführlicher erklären wie ich die Event-Methode richtig verwende.

    jetzt für diesen speziellen Fall falls ein user, Outlook per mausklick schließt, damit man dann automatisch oOutlook erneuern kann, ohne das Skript neuzustarten ?

  • Dann fängst Du ja mit Zeile 1 aus meinem Code oben die Events bereits ab. Für jedes Event muss - wenn es behandelt werden soll - eine Funktion bereitgestellt werden.
    Diese heißt in unserem Fall "oOApp_" verknüpft mit dem Namen des Events. Wenn die Eventfunktion für Quit beendet ist, dann ist $oOutlook ungültig.

    Stelle sicher (z.B. per MsgBox), dass dieser Event ausgeführt wird, wenn Du Outlook schließt.


    Wie startest Du Dein Skript jetzt (manuell, autostart ..)?

  • Noch eine option wäre, das man den outlook link ersetzt und dieser dein skript startet und dein skript dann outlook und somit sofort die pid kennt bzw sich auch beendet wenn outlook geschlossen wird.

    Startet der Nutzer dann wieder über den Link Outlook neu, startet auch dein skript neu und kennt die pid und kann wie vorher die verbindung direkt wieder aufbauen.

  • Ehm ... ich hab es nun gelöst und das sehr einfach ich wusste nicht das das funktioniert, ich habe

    Code
    start_objekt()

    in einer Funktion die ich eh in einer schleife habe.

    also habe ich folgendes vorgenommen, statt nur zu prüfen ob $oOutlook kein Obj ist
    wird erst das Gegenteil gemacht, und dann wenn es zutrifft wird $oOutlook einfach überschrieben um in der nächstenzeile wieder frisch angelegt zu werden.


    vielen Dank an euch, falls jemand sehen will was ich noch alles im Skript habe.

    3 Mal editiert, zuletzt von MojoeB (21. August 2023 um 12:08) aus folgendem Grund: edit falls jemand sehen will was ich noch gemacht habe.

  • Irgendwie macht für mich dein code kein Sinn:

    Meinem Beispiel folgend und deinen Code hier als Grundlage nehmend, wäre ich eher bei:

    5 Mal editiert, zuletzt von Moombas (21. August 2023 um 12:48)

  • 'IF IsObj($oOutlook) Then ;wenn es ein Objekt ist, mache es IMMER leer (warum?)'

    Nunja die Grund Idee war ursprünglich, das ich neu ankommende Emails über das Event unmittelbar auslösen möchte.
    Das klappt auch allerdings, wenn nun das Event aus irgendeinem Grund nicht erkannt wird, kommen die Nachrichten nicht mehr am Programm an.
    Das Objekt existiert dann noch ist aber über das Tool dann nicht mehr ansprechbar.

    Deshalb habe ich mir etwas überlegt, mit einer zweiten Methode, ungelesene Email zu checken und genau als neu ankommende zu behandeln wenn diese nicht schon über das Event erkannt wurden.

    Deshalb, habe ich alle Methoden zusammen genommen,

    jede halbe stunde wird dann das Objekt absichtlich geleert und das Event nachdem er die ungelesenen Mails durchgegangen ist wieder neu gestartet.

    Somit hab ich nun bei mehreren Tests erfolgreich Outlook abstürzen lassen um zu schauen ob er sich nachdem er die Methoden ausgeführt wieder von alleine fängt und was soll ich sagen somit funktioniert es.

    Die PC´s wo das Tool eingesetzt werden laufen zusammen mit verschieden Usern 24/7.

    Deshalb ist jede Lösung die automatisch funktioniert und erst gar keine fehleingaben durch den User zulässt zu wünschen.

  • Du baust halt jedesmal eine neue Verbindung auf, wenn du start_objekt aufrufst, dann kannst du es auch gleich richtig machen (auch die alte verbindung wieder trennen) und die if-prüfung weglassen.

    Sprich:

    AutoIt
    func start_objekt()
        _OL_Close($oOutlook)
        $oOutlook = _OL_Open()
        If @error <> 0 Then
          error_speichern($soerror,  "Outlook Error -> creating a connection to Outlook. @error = " & @error & ", @extended = " & @extended)
          infotexte()
          error_speichern($soerror,  "")
          _OL_ErrorNotify(3, @ScriptDir& '\neuerr.txt')
        EndIf
    EndFunc   ;==>start_objekt
  • hast du das mal getestet?

    Im Grunde hast du recht, aber mit _OL_Close und danach _OL_Open startet bei mir Outlook komplett neu, also auch mit Initialisierung Fentser/Vorschau etc.

    Bei meiner variante wird Outlook zwar auch gestartet, wenn es nicht an ist, aber im silent Modus, ohne die User bei der Arbeit zu stören.

    Und wenn es nicht geschlossen wurde aber trotzdem mit den Events nicht funktionieren möchte dann funktioniert es wieder nachdem das Objekt erneut gesetzt wurde.
    und da eh 24h betrieb ist macht es auch nichts, falls alle stricke reißen, 30min ohne Event ist mal vertretbar, wenn danach alle ausgebliebenen Events nachgeholt werden.

  • Hmm, evtl war meine Annahme falsch.

    Ich ging davon aus, das _OL_Close nur die Verbindung zu Outlook schließt aber nicht Outlook selber.

    Dann müsstest du diese Zeile auskommentieren.

    Wobei in der au3 es eben so steht "Closes the connection to Microsoft Outlook." andererseits sich aber bei den Parametern widerspricht "... $bForceClose - [optional] If True Outlook is closed ...".

    Daher denke ich du kannst Zeile 2 von meinem obigen Code einfach weglassen und sollte dann funktionieren wie du es wolltest.

  • _OL_Close schließt im Normalfall nur die Verbindung zu Outlook.

    Ausnahmen:

    • Outlook wurde durch erst durch _OL_Open gestartet. Dann wird Outlook beendet.
    • Der Parameter $bForceClose ist auf True gesetzt. Dann wird Outlook beendet, auch wenn es vor dem Aufruf des Skripts bereits gestartet war.
  • Bevor man sich noch weiter über mögliche Lösungsanstze den Kopf zerbricht: water : weißt du ob das Überschreiben des Obektes der Outlookverbindung negative folgen haben kann?

    Die Verbindung würde ja in der Theorie nie abgebaut werden und im worst case immer neue Verbindungen hinzukommen (deshalb hatte ich das _OL_Close() mit drinne um das zu verhindern).

    Wenn ja, müsste man vor dem _OL_Open immer sicherstellen, das Outlook bereits läuft um die Verbindung via _OL_Close schließen zu können ohne das Outlook beendet wird.
    Oder man immitiert dieses durch neusetzen der entscheidenden Variable aus der au3:

    Einmal editiert, zuletzt von Moombas (22. August 2023 um 12:09)

  • ich kanns mir nicht erklären, habe gestern aber komische Erkenntnisse gesammelt. Denke aber es kann sein das die Funktionen etwas von Office Outlook Version unterscheiden.

    -> auf der Arbeit Office 2016

    -> zu hause Office 2021& Microsoft Outlook Version 1.2023.807.100 (Production) (testversion)

    ( die folgenden dinge sind | bei dem Event neue Mail empfangen. )

    Wenn ich zum Beispiel bei Office 2016 :

    Eventstart -> While + neuemail = 1 x Ergebnis.

    Eventstart -> While+ neuemail = 1 -> erneut starten nach Bedingung : Eventstart -> = 1 x Ergebnis

    mach ich das gleiche mit den selben Funktionen nur mit Office 2021 :

    Funktion -> Eventstart -> While+ neuemail = 1 x Ergebnis. (wie es sein soll, sowie bei 2016)

    Funktion -> Eventstart -> While+ neuemail = 1 -> erneut starten nach Bedingung : Eventstart -> 1 x Ergebnis +1 x Ergebnis (obwohl mit gleichen Parametern gestartet, wird das Event auch 2mal erkannt.)

    mach ich das gleich mit Microsoft Outlook Version 1.2023.807.100 (testversion):

    Funktion -> Eventstart -> While = ab und an mal funktioniert es beim ersten start manchmal bleibt das Resultat aber einfach immer 0.

    Das sieht für mich so aus als würde Outlook 2016 immer nur 1 gesetztes Event verwenden, wohingegen 2021 augenscheinlich mehrere gleiche Events mit Hilfe von autoit befehlen setzen, lesen &zuordnen kann?

    ~_~ das verwirrt mich so naja Hauptsache es funktioniert,

    Moombas

    Ich hoffe nicht das es Auswirkungen haben wird,
    Wenn ihr möchtet, kann ich euch das gesamte Skript zeigen sobald ich fertig bin.
    muss noch die GUI dazu einbinden und noch ein paar kleine Änderungen vornehmen.

    wird aber vielleicht erst nächste Woche fertig sein.


    water

    wäre es dann deiner Meinung nach besser so wie moombas schon gesagt hat,

    erst die pid ermitteln,

    Wenn Outlook nicht existiert dann starte es per run Befehl ?

    & falls es existiert dann starte nur _ol_open ?

  • Bevor man sich noch weiter über mögliche Lösungsanstze den Kopf zerbricht: water : weißt du ob das Überschreiben des Obektes der Outlookverbindung negative folgen haben kann?

    Die Verbindung würde ja in der Theorie nie abgebaut werden und im worst case immer neue Verbindungen hinzukommen (deshalb hatte ich das _OL_Close() mit drinne um das zu verhindern).

    Wenn ja, müsste man vor dem _OL_Open immer sicherstellen, das Outlook bereits läuft um die Verbindung via _OL_Close schließen zu können ohne das Outlook beendet wird.
    Oder man immitiert dieses durch neusetzen der entscheidenden Variable aus der au3:

    Wenn Du die Objekte der Outlookverbindung überschreibst (das ist genau das, was _OL_Close macht, wenn die Outlook selbst nicht beendet wird). Beim nächsten _OL_Open wird eine neue Verbindung zu Outlook hergestellt (vorausgesetzt Outlook läuft noch) oder Outlook neu gestartet und die Verbindung hergestellt.
    Es kommen keine "neue Verbindungen hinzu" sondern es wird eine neue Verbindung hergestellt.

    Ich würde die Geschichte (vorausgesetzt, ich habe sie vollständig korrekt verstanden) so abhandeln:

    Script1 (Hilfsscript): Wird mit dem PC-Boot autogestartet und

    • läuft in einer ewigen Schleife mit Sleep von x Sekunden
    • wenn Outlook läuft, dann wird geprüft, ob das Hauptscript läuft.
    • Falls nein, dann wird es gestartet.

    Script 2 (Hauptscript):

    • Prüft, ob Outlook läuft. Falls ja wird die PID gespeichert.
    • Falls nein oder die PID sich geändert hat, dann beendet das Skript (und wird kurz darauf von Script 1 wieder gestartet)

    Alle anderen Varianten wären mir zu unsicher und sehr mühsam zu debuggen.

  • so bin immer noch am testen, ich habe nun die start_objekt()wie folgt geändert, glaube aber das wird meine endgültige Funktion dafür sein. :

    EDIT:

    nun nach mehrmaligem testen dieser Funktion funktioniert es nun auch mit den unterschiedlichen Versionen von Outlook. :)

    water Beitrag #14 & #17 haben mir dabei sehr geholfen, dabei zu verstehen wie ich in meinem fall am _ol_open und _ol_close am besten einsetze.

    2 Mal editiert, zuletzt von MojoeB (24. August 2023 um 07:04)