Outlook, ungelesenen Mails von einem Eingebundenen Konto auslesen

  • Hi,
    Ich wollte eine Überprüfung ob ungelesenen Mails in einem zweiten eingebundenen Outlookprofil stehen, aber irgendwie klaps nicht.

    Wenn ich das auf meine eingenen Posteingang mache funktioniert das:

    [autoit]


    #AutoIt3Wrapper_AU3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=Y

    [/autoit][autoit][/autoit][autoit]

    #include <OutlookEX.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $oOutlook = _OL_Open()
    Global $aItems, $message, $folder
    _OL_FolderSet($oOutlook, "*\Posteingang")

    [/autoit][autoit][/autoit][autoit]

    $aItems = _OL_ItemFind($oOutlook, "*", $olMail, "[UnRead]=True", "", "", "Subject,Body", "", 1)
    If IsArray($aItems) Then
    _ArrayDisplay($aItems, "OutlookEX UDF: _OL_ItemFind Example Script - Unread mails")
    Else
    MsgBox(48, "OutlookEX UDF: _OL_ItemFind Example Script", "Could not find an unread mail. @error = " & @error & ", @extended: " & @extended)
    EndIf

    [/autoit]

    Jetzt habe ich ein zweites Postfach eingebunden und möchte hier das gleiche machen.
    Die Idee war mit

    [autoit]

    _OL_FolderSet($oOutlook, "*\Postfach - Gruppenpostfach1\Posteingang")

    [/autoit]


    den Focus auf das zweite Postfach zu setzen und dann die gleiche Abfrage nochmal zu machen.
    Funktioniert aber nicht, er zeigt mir dann wieder die ungelesenen Mails in meinem persönlichen Posteingang an.

    Dann hatte ich noch versucht das andere Postfach mit

    [autoit]

    $oOutlook = _OL_Open()

    [/autoit]

    zu öffnen.
    Aber das bekomme ich auch nicht hin.

    Kann jemand helfen.

    Gruß
    Wolke

    Einmal editiert, zuletzt von wolkenloser (10. Mai 2012 um 11:17)

  • Auf das zweite Postfach greifst Du mit _OL_FolderAccess zu. Du bekommst einen Array zurück dessen Element[1] Du dann an die weiteren Funktionen weitergibst. _OL_FolderGet gibt Dir im Array auch die Anzahl der ungelesenen Mails zurück.

    _OL_FolderSet kannst Du komplett streichen, da diese Funktion nur den selektierten Folder ändert (also für das GUI sinnvoll ist).

  • Auf das zweite Postfach greifst Du mit _OL_FolderAccess zu. Du bekommst einen Array zurück dessen Element[1] Du dann an die weiteren Funktionen weitergibst. _OL_FolderGet gibt Dir im Array auch die Anzahl der ungelesenen Mails zurück.

    _OL_FolderSet kannst Du komplett streichen, da diese Funktion nur den selektierten Folder ändert (also für das GUI sinnvoll ist).

    Das hatte ich auch schon probiert,
    aber wenn ich das mache

    [autoit]


    Global $aFolder = _OL_FolderAccess($oOutlook, "*\Postfach - Gruppenpostfach1\Posteingang"

    [/autoit][autoit][/autoit][autoit]

    oder

    [/autoit][autoit][/autoit][autoit]

    Global $aFolder = _OL_FolderAccess($oOutlook, "*\Postfach - Gruppenpostfach1"

    [/autoit]

    bekomme ich eine Fehler: @error = "4"

    Gruß
    Wolke

  • @error = 4 steht für: "Specified folder could not be found".
    Wenn das ein zweites Postfach ist (=gehört einem anderen User), dann kann der Name nicht mit "*" (=eigener User) beginnen.
    Was steht im Outlook in der Folderübersicht für ein Name für dieses Postfach?

  • So funktionierts bei mir, gerade getestet bei den Kollegen ebend so. Outlook 2007. Das postfach Kunde ist ein Multifunktionpostfach und greifen ca 21 Kollegen drauf.

    [autoit]


    #AutoIt3Wrapper_AU3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=Y

    [/autoit][autoit][/autoit][autoit]

    #include <OutlookEX.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $oOutlook = _OL_Open()
    Global $aItems, $message, $aFolder
    _OL_FolderAccess($oOutlook, "Postfach - Kunde")

    [/autoit][autoit][/autoit][autoit]

    $aItems = _OL_ItemFind($oOutlook, "Postfach - Kunde\Posteingang", $olMail, "[UnRead]=True", "", "", "Subject,Body", "", 1)
    If IsArray($aItems) Then
    _ArrayDisplay($aItems, "OutlookEX UDF: _OL_ItemFind Example Script - Unread mails")
    Else
    MsgBox(48, "OutlookEX UDF: _OL_ItemFind Example Script", "Could not find an unread mail. @error = " & @error & ", @extended: " & @extended)
    EndIf

    [/autoit]

    €dit: ohne _OL_FolderAccess($oOutlook, "Postfach - Kunde") funktioniert es auch, da das Postfach komplett eingebuden ist und ich Master Rechte habe. Die Kollegen haben nur Read Only.

  • [quote='water','index.php?page=Thread&postID=253634#post253634']Auf das zweite Postfach greifst Du mit _OL_FolderAccess zu. Du bekommst einen Array zurück dessen Element[1] Du dann an die weiteren Funktionen weitergibst. _OL_FolderGet gibt Dir im Array auch die Anzahl der ungelesenen Mails zurück.

    _OL_FolderSet kannst Du komplett streichen, da diese Funktion nur den selektierten Folder ändert (also für das GUI sinnvoll ist).

    Das hatte ich auch schon probiert,
    aber wenn ich das mache

    [autoit]


    Global $aFolder = _OL_FolderAccess($oOutlook, "Postfach - Gruppenpostfach1\Posteingang"

    [/autoit][autoit][/autoit][autoit]

    oder

    [/autoit][autoit][/autoit][autoit]

    Global $aFolder = _OL_FolderAccess($oOutlook, "Postfach - Gruppenpostfach1"

    [/autoit]

    Ohne *\ geht es.
    Es dauert nur etwas länger weil im Postfach über 20.000 Mails stehen.
    Trotzdem geil das es funktioniert !
    :thumbup:

    Gruß
    Wolke

  • Falls Performance ein Thema ist, dann gibt es da verschiedene Möglichkeiten:

    • Definition einer Rule für das Postfach, dass neue Mails in einen eigenen Folder kopiert (nicht verschoben) werden. Dieser Folder kann dann von Deinem Skript verarbeitet werden und abgearbeitete Mails kännen dann problemlos aus diesem Folder gelöscht werden.
    • Mit einem Skript das Outlook Event "Neue Mail" abfangen und dann die eingegangene Mail verarbeiten. Geht natürlich viel schneller!
  • Da fällt mir gerade etwas zu ein:

    Wenn ich "_OL_ItemFind" ausführe wird je ein Array mit Einträgen gefüllt.
    Kann ich irgendwie anzeigen lassen während das geschied ?
    z.B. mit Tooltip das aktuelle Item anzeigen ? (MSGBOX wäre Sinn frei)

    Gruß
    Wolke

  • Leider nein.
    In der Funktion verwende ich die Methode "Restrict" bzw. filtere selbst die Datensätze. Outlook hat hier nicht die Möglichkeit eine Callback Funktion aufzurufen mit der dann ein Fortschrittsbalken etc. angezeigt werden kann.
    Die methode AdvancedSearch arbeitet mit Events, die habe ich aber (noch) nicht implementiert.

  • Wenn ich alle ungelesenen Mails mit meinem Aufruf als gelesen markieren will, wie würdest Du das machen ?

    Mein Ziel ist festzustellen, wenn in diesem Postfach seit max 30min keine neuen Mails mehr auftauchen.

    Gruß
    Wolke

  • Dann würde ich doch eher nach Mails suchen, die in der letzten 1/2 Stunde eingetroffen sind. Wenn das Ergebnis 0 ist, dann hat Du keine Mails bekommen.


  • Dann würde ich doch eher nach Mails suchen, die in der letzten 1/2 Stunde eingetroffen sind. Wenn das Ergebnis 0 ist, dann hat Du keine Mails bekommen.

    ICh habe das mal so versucht:

    [autoit]


    $aItems = _OL_ItemFind($oOutlook, "Postfach - Gruppenpostfach1\Posteingang", $olMail, "[Start]='2012-05-16 10:15' And [End]='2012-05-16 10:45'", "", "", "Subject,Body", "", 1)

    [/autoit]

    In dieser Zeit habe ich ca 20 Mails im Postfach, mir wird aber keine angezeigt...

    Gruß
    Wolke

  • Ein MailItem kennt die Properties "Start" und "End" nicht - das ist für Appointments.
    Du musst für ein MailItem die Property "ReceivedTime" verwenden. Also:

    [autoit]


    $aItems = _OL_ItemFind($oOutlook, "Postfach - Gruppenpostfach1\Posteingang", $olMail, "[ReceivedTime]<='2012-05-16 10:45' And [ReceivedTime]>='2012-05-16 10:15'", "", "", "Subject,Body", "", 1)

    [/autoit]

    zeigt alle Mails die zwischen 10:15 und 10:45 eingetroffen sind.

  • Mhm,
    ich habe ein bisschen experimentiert, einmal hat es geklappt,
    Jetzt nicht mehr.
    Für dei Zeit habe ich mal was dazugebaut

    [autoit]


    Global $jetzt, $30minago
    $jetzt = @year & "-" & @mon & "-" & @mday & " " & @hour & ":" & @min
    $30minago =stringtrimright(stringreplace(_dateadd('n', -30, _nowcalc()),"/","-"),3)
    MsgBox(0,"Uhrzeiten", $jetzt & @cr & $30minago)

    [/autoit]

    Das liefert dann das hier:
    2012-05-16 13:48
    2012-05-16 13:18


    mit

    [autoit]


    global $Postfach = "*\Posteingang"
    $aItems = _OL_ItemFind($oOutlook, $Postfach, $olMail, "[UnRead]=True", "", "", "Subject,Body", "", 1)

    [/autoit]


    Bekomme ich schön meine ungelesenen Mails angezeigt

    damit bekomme ich nix...

    [autoit]


    global $Postfach = "*\Posteingang"
    $aItems = _OL_ItemFind($oOutlook, $Postfach, $olMail, "[ReceivedTime]<='" & $30minago & "' And [ReceivedTime]>='" & $jetzt & "'", "", "", "Subject,Body", "", 1)

    [/autoit]


    Hier nochmal das ganze Script was bei jedem sofort funktionieren müsste.

    [autoit]


    #AutoIt3Wrapper_AU3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=Y

    [/autoit][autoit][/autoit][autoit]

    #include <OutlookEX.au3>
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <Date.au3>

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Global $oOutlook = _OL_Open()
    Global $aItems, $message, $folder, $aItems2

    [/autoit][autoit][/autoit][autoit]

    ; ZEITSTEMPEL
    Global $jetzt, $30minago
    $jetzt = @year & "-" & @mon & "-" & @mday & " " & @hour & ":" & @min
    $30minago =stringtrimright(stringreplace(_dateadd('n', -30, _nowcalc()),"/","-"),3)
    MsgBox(0,"Uhrzeiten", $jetzt & @cr & $30minago)
    ;~ clipput( $jetzt & @cr & $30minago)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $aItems = _OL_ItemFind($oOutlook, "*\Posteingang", $olMail, "[UnRead]=True", "", "", "Subject,Body", "", 1)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;Zeige Ungelesene Mails im Posteingang
    If IsArray($aItems) Then
    _ArrayDisplay($aItems, "")

    [/autoit][autoit][/autoit][autoit]

    Else
    MsgBox(48, "OutlookEX UDF: _OL_ItemFind Example Script", "Could not find an unread mail. @error = " & @error & ", @extended: " & @extended)
    EndIf

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    ;Zeige mails aus den letzten 30 Minuten
    $aItems2 = _OL_ItemFind($oOutlook, "*\Posteingang", $olMail, "[ReceivedTime]<='" & $30minago & "' And [ReceivedTime]>='" & $jetzt & "'", "", "", "Subject,Body", "", 1)
    If IsArray($aItems2) Then
    _ArrayDisplay($aItems2, "")

    [/autoit][autoit][/autoit][autoit]

    Else
    MsgBox(48, "OutlookEX UDF: _OL_ItemFind Example Script", "Could not find an unread mail. @error = " & @error & ", @extended: " & @extended)
    EndIf

    [/autoit]

    Gruß
    Wolke

  • Dreh die Abfrage auf <=> um dann geht's. Die Zeile sieht dann wie folgt aus:

    [autoit]

    $aItems2 = _OL_ItemFind($oOutlook, "*\Posteingang", $olMail, "[ReceivedTime]>='" & $30minago & "' And [ReceivedTime]<='" & $jetzt & "'", "", "", "Subject,Body", "", 1)

    [/autoit]