OutlookEX UDF - 2019-11-30: Neue Version 1.4.0.0. freigegeben

  • Alle Funktionen dieser UDF bauen darauf auf, dass Outlook läuft.
    _OL_Open fährt Outlook (im Hintergrund hoch), wenn es nicht schon läuft und _OL_Open beendet es dann wieder.
    Sollte ein User kein Outlook installiert haben, dann kannst Du auch keine der Funktionen dieses UDFs verwenden.

  • manche haben es installiert, aber nicht konfiguriert...ich muss morgen nochmal genau nachschauen, ich war der meinung, dass dann der Konfigurationsassistent gestartet wird und dort "hängen" bleibt.

  • Das müsste man prüfen können, ob ein Profil eingerichtet ist.
    Vielleicht so:
    "Returns an empty string if no profile has been configured or if there is no default profile for Outlook."
    Wenn das Profil nicht konfiguriert wurde bzw. es kein Defaultprofile gibt, dann könntest Du einen speziellen Errorcode von _OL_Open bekommen.

    Edit:
    Diese angepasste Version von _OL_Open bringt @error = 9 wenn kein Profil konfiguriert ist.

    Sollte das OutlookEX UDF eine Funktion zur Konfiguration des Profils enthalten?

    Spoiler anzeigen
    [autoit]

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _OL_Open
    ; Description ...: Opens a connection to Microsoft Outlook.
    ; Syntax.........: _OL_Open([$fOL_WarningClick = False[, $sOL_WarningProgram = ""[, $iOL_WinCheckTime = 1000[, $iOL_CtrlCheckTime = 1000]]])
    ; Parameters ....: $fOL_WarningClick - Optional: If set to True a function will click away the Outlook security warning messages (default = False)
    ; $sL_WarningProgram - Optional: Complete path to the WarningProgram, e.g.: "C:\OLext\_OL_Warnings.exe"
    ; + (default = @ScriptDir & "\_OL_Warnings.exe" which is part of this UDF)
    ; $iOL_WinCheckTime - Optional: Time in milliseconds to wait before a check for a warning window is performed (default = 1000 milliseconds = 1 second)
    ; $iOL_CtrlCheckTime - Optional: How long, in milliseconds, we will wait before we check that the controls we click are enabled (default = 1000)
    ; Return values .: Success - New object identifier
    ; Failure - Returns 0 and sets @error:
    ; |1 - Unable to Create Outlook Object. See @extended for details (@error returned by ObjCreate)
    ; |2 - Unable to create custom error handler. See @extended for details (@error returned by ObjEvent)
    ; |3 - $fOL_WarningClick is invalid. Has to be True or False
    ; |4 - $iOL_WinCheckTime is invalid. Has to be an integer
    ; |5 - File $sOL_WarningProgram does not exist. Has to be an executable that can be startet using the run command
    ; |6 - Run error when running $sOL_WarningProgram. Please check @extended for more information
    ; |7 - $iOL_CtrlCheckTime is invalid. Has to be an integer
    ; |8 - Unable to logon to the default profile. See @extended for details (@error returned by Logon)
    ; |9 - No profile has been configured or there is no default profile for Outlook
    ; Author ........: Wooltown
    ; Modified ......: water
    ; Remarks .......: Create your own $sOL_WarningProgram Exe if the window title or messages have changed or are displayed in another language
    ; Related .......:
    ; Link ..........:
    ; Example .......:
    ; ===============================================================================================================================
    Func _OL_Open($fOL_WarningClick = False, $sOL_WarningProgram = "", $iOL_WinCheckTime = 1000, $iOL_CtrlCheckTime = 1000)

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

    Local Const $msoLanguageIDUI = 0x2 ; See http://msdn.microsoft.com/en-us/library/aa170976.aspx
    If Not IsBool($fOL_WarningClick) Then Return SetError(3, 0, 0)
    If Not IsInt($iOL_WinCheckTime) Then Return SetError(4, 0, 0)
    If Not IsInt($iOL_CtrlCheckTime) Then Return SetError(7, 0, 0)
    If ProcessExists("Outlook.exe") > 0 Then $fOL_AlreadyRunning = True
    Local $oOL = ObjCreate("Outlook.Application")
    If @error <> 0 Or Not IsObj($oOL) Then Return SetError(1, @error, 0)
    If $fOL_WarningClick Then
    If $sOL_WarningProgram = "" Then $sOL_WarningProgram = @ScriptDir & "\_OL_Warnings.exe"
    If Not FileExists($sOL_WarningProgram) Then Return SetError(5, 0, 0)
    Run($sOL_WarningProgram & " " & @AutoItPID & " " & $iOL_WinCheckTime & " " & $iOL_CtrlCheckTime & " " & $oOL.Version & " " & $oOL.LanguageSettings.LanguageID($msoLanguageIDUI), "", @SW_HIDE)
    If @error <> 0 Then Return SetError(6, @error, 0)
    EndIf
    ; A COM error handler will be initialised only if one does not exist
    If ObjEvent("AutoIt.Error") = "" Then
    $oOL_Error = ObjEvent("AutoIt.Error", "_OL_COMError") ; Creates a custom COM error handler
    If @error <> 0 Then Return SetError(2, @error, 0)
    EndIf
    Local $aVersion = StringSplit($oOL.Version, '.')
    ; Logon to the default profile if Outlook wasn't already running (for Outlook 2007 and later)
    If $fOL_AlreadyRunning = False And Int($aVersion[1]) >= 12 Then
    If $oOL.DefaultProfileName = "" Then Return SetError(9, 0, 0)
    Local $oOL_Namespace = $oOL.GetNamespace("MAPI")
    $oOL_Namespace.Logon($oOL.DefaultProfileName, "", False, False)
    If @error <> 0 Then Return SetError(8, @error, 0)
    EndIf
    Return $oOL

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

    EndFunc ;==>_OL_Open

    [/autoit]
  • danke werde ich morgen testen...
    öffnet sich das outlook schon bei _OL_Open ?, dann wäre der returnwert schon zu spät und der benutzer sitzt vor dem konfigmenü von outlook ;)

  • danke werde ich morgen testen...
    öffnet sich das outlook schon bei _OL_Open ?, dann wäre der returnwert schon zu spät und der benutzer sitzt vor dem konfigmenü von outlook ;)

    Eigentlich nicht. Es wird nur das ObjCreate durchgeführt und bei Outlook 2007/2010 geprüft, ob es ein Profil gibt.
    Falls nein, kriegst Du @error=9. Zu prüfen wäre, ob im Fehlerfall ein _OL_Close notwendig ist um die Outlook Exe zu beenden.

  • Version 0.5.0 ist freigegeben.

    Bitte ausgiebig testen vor Übernahme in die Produktion!

    Für download siehe bitte den Link in meiner Signatur.

  • Hallo zusammen,

    ich habe mal eine bescheidene Frage.
    Für mein Outlook(XP) suche ich eine Funktion die in Abhängigkeit der Dateigröße (PST-Datei) eine neue PST-Datei anlegt.
    Dann diese neue PST-Datei einbindet und die ältesten Mails (älter als 3 Monate) aus dem Ordner (gesendet/ empfangen) in die neue PST-Datei verschiebt.

    Kann man das mit der Outlook UDF erreichen?


    Gruß Schumi

  • Hallo zusammen,

    ich habe mal eine bescheidene Frage.
    Für mein Outlook(XP) suche ich eine Funktion die in Abhängigkeit der Dateigröße (PST-Datei) eine neue PST-Datei anlegt.
    Dann diese neue PST-Datei einbindet und die ältesten Mails (älter als 3 Monate) aus dem Ordner (gesendet/ empfangen) in die neue PST-Datei verschiebt.

    Kann man das mit der Outlook UDF erreichen?


    Gruß Schumi

    Ich denke, das müsste gehen.
    Die Größe der PST findest Du mit FileGetSize raus. Dann legst Du mit _OL_PSTCreate eine neue PST an. Suchst Dir mit _OL_ItemFind die zu verschiebenden Mails raus und schiebst sie dann mit _OL_ItemMove in die neue PST rüber.
    Was leider nicht automatisch geht, ist eine PST dann zu komprimieren. Da gibt es leide keine Möglichkeit mit COM zuzugreifen. Da müssen die Fenster direkt angesprochen werden.

  • Hallo water,
    das ist ja super....
    Man könnte also so ein automatisches "Archivsystem" bauen?
    Hat das schon einer versucht und gibt evtl. Beispiele auf denen man aufbauen kann?

    Gruß Schumi

  • Ja, könnte man. Vielleicht müsste man etwas experimentieren, aber generell sollte es funktionieren.
    Nein, ich habe sowas noch nicht gemacht. Das lässt sich mit den Befehlen aus meiner vorigen Post aber leicht bauen.
    Probier's mal und poste dann die Probleme auf die Du ev. stösst.

  • Version 0.6.0 ist freigegeben.

    Bitte ausgiebig testen vor Übernahme in die Produktion!

    Für download siehe bitte den Link in meiner Signatur.

  • Hallo water,

    habe gerade die neue Version getestet.
    Arbeite hier mit Outlook 2010 unter Win7@32bit und habe ein Problem.

    Vorab mein Code für einen einfachen Test:

    Code
    Global $oOL = _OL_Open()
    Global $oItem = _OL_Wrapper_SendMail($oOL, "test@test.de", "", "", "Test-Mail",  "Test Inhalt", $olFormatHTML, $olImportanceNormal)
    _OL_ItemSend($oOL, $oItem)

    Die E-Mail wird angelegt im Postausgang wird aber nicht versendet.
    Wo könnte hier das Problem liegen?

    MfG

  • Lass Dir mal den Fehlercode rausschreiben

    [autoit]

    Global $oOL = _OL_Open()
    Global $oItem = _OL_Wrapper_SendMail($oOL, "test@test.de", "", "", "Test-Mail", "Test Inhalt", $olFormatHTML, $olImportanceNormal) _OL_ItemSend($oOL, $oItem)
    ConsoleWrite(@error & @CRLF)

    [/autoit]
  • Hallo und guten Morgen,

    im Consolenfenster vom Editor bekomme ich folgende Ausgabe:

    Code
    >"C:\Program Files\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "C:\Users\XXX\Desktop\test.au3" /UserParams    
    +>07:44:52 Starting AutoIt3Wrapper v.2.1.0.8    Environment(Language:0409  Keyboard:00000407  OS:WIN_7/Service Pack 1  CPU:X64 OS:X86)
    >Running AU3Check (1.54.22.0)  from:C:\Program Files\AutoIt3
    +>07:44:52 AU3Check ended.rc:0
    >Running:(3.3.8.0):C:\Program Files\AutoIt3\autoit3.exe "C:\Users\XXX\Desktop\test.au3"    
    5004
    +>07:45:00 AutoIT3.exe ended.rc:0
    >Exit code: 0    Time: 8.734
  • 5004 bedeutet, dass es ein Problem mit _OL_ItemAttachmentAdd gab. Returncode 4 von _OL_ItemAttachmentAdd bedeutet:
    "4 - Attachment could not be found."

    Edit
    Wenn Du die Aufrufparameter genau prüfst, stellst Du fest, dass nach dem Body die Attachments kommen. Dieser Parameter fehlt bei Dir und daher wird $olFormatHTML als Attachment interpretiert.

  • Hab gerade meine letzte Antwort editiert. Da steht jetzt die Lösung drin.

  • Schön. Kleine Ursache, große Wirkung!