OutlookEx UDF + _OL_ItemSend

  • Hallo,

    Ich benutze seit kurzem AutoIt um verschiedene Prozesse zu automatisieren. Und ein Prozess davon sind die Mails in Outlook. Dazu benutze ich die OutlookEx UDF.
    Mein Skript funktionniert soweit einwandfrei wenn Outlook offen ist.
    Wenn ich Outlook schliesse funktionniert das Skript auch noch, nur hakt es an einer Sache. Und zwar soll eine Mail an verschiedene Personen verschickt werden. Dazu benutze ich "_OL_ItemSend". Wenn Outlook offen ist funktionniert der Versand ohne Probleme. Wenn Outlook aber geschlossen ist, dann wird die Mail nicht verschickt sondern bleibt in der Outbox hängen. Wenn ich Outlook dann wiederum öffne wird diese dann verschickt.

    Sollte dies normalerweise funktionnieren oder doch nicht? Muss ich Outlook für diesen Fall offen lassen?

    Vielen dank.

  • OutllookEX sollte auch funktionieren, wenn Outlook nicht läuft. _OL_Open startet dann einfach Outlook im Hintergrund und _OL_Close beendet Outlook dann wieder.
    Das Problem ist, dass Outlook sich selbst beendet, sobald keine Referenz mehr auf ein Object besteht und kein Fenster geöffnet ist.
    Um das genau zu beurteilen, müsste man Dein Skript sehen.

  • Hallo,

    ich werde dir hier mal ein par schnipsel aus dem code und der Teil der in Frage kommt kopieren da der code noch andere sachen macht.
    Das Programm läuft im Tray im Hintergrund


    #AutoIt3Wrapper_AU3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=Y
    #include <OutlookEX.au3>
    #include <Process.au3>
    #include <TrayConstants.au3> ; Required for the $TRAY_ICONSTATE_SHOW constant.
    #include <Array.au3>
    #include <File.au3>
    #include <FileConstants.au3>

    Opt("TrayMenuMode", 3) ; The default tray menu items will not be shown and items are not checked when selected. These are options 1 and 2 for TrayMenuMode.
    ; *****************************************************************************
    ; Connect to outlook;
    *****************************************************************************
    Global $oOutlook = _OL_Open()
    If @error <> 0 Then Exit MsgBox(16, "OutlookEX UDF", "Error creating a connection to Outlook. @error = " & @error & ", @extended = " & @extended)


    ; *****************************************************************************
    ;Hier stehen Globale variabeln, und der Tray wird erstellt mit menu Items. Menu Item Exit enthält den _OL_Close;
    *****************************************************************************


    Func SendMail2Central();
    *****************************************************************************;
    Create a html mail plus attachment;
    *****************************************************************************

    ;Hier steht ein bisschen code


    if condition then

    ; Create the item without setting the body.
    local $oItem = _OL_ItemCreate($oOutlook, $olMailItem, $OLdraftmail, "", "To=" & $MailTo, "CC=" & $MailCC, "Subject=A subject", "BodyFormat=" & $olFormatHTML)

    ; Add all attachments
    $oItem = _OL_ItemAttachmentAdd($oOutlook, $oItem, Default, $aFileList[1])

    ; Modify the item to add HTML
    $oItem = _OL_ItemModify($oOutlook, $oItem, Default, "HTMLBody=")


    _OL_ItemSend($oOutlook, $oItem)


    .... weiterer code

    endif
    endfunc

    Hoffe du bekommst da noch was rausgelesen :)
    Aber wie gesagt, wenn Outlook offen ist wird die mail versendet, wenn Outlook geschlossen ist wird die mail nicht versendet sondern bleibt in der Outbox liegen und versendet sich erst wenn ich Outlook öffne.

  • Welche Version der OutlookEX UDF verwendet Du?

  • Nimm mal überall das $oItem raus (außer bei _OL_ItemCreate). Da die Variablen nicht ByRef übergeben werden, könnte das ursprüngliche $oItem freigegeben werden und damit Outlook beendet werden.
    Ist mal so ein Gedanke, ungetestet.

    [autoit]

    ; Add all attachments
    _OL_ItemAttachmentAdd($oOutlook, $oItem, Default, $aFileList[1])

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

    ; Modify the item to add HTML
    _OL_ItemModify($oOutlook, $oItem, Default, "HTMLBody=")

    [/autoit]
  • Was heisst "scheint"? Die Sonne scheint, aber ein Skript funktioniert oder eben nicht :)

  • Probier mal:

    [autoit]

    #AutoIt3Wrapper_AU3Check_Parameters= -d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
    #AutoIt3Wrapper_AU3Check_Stop_OnWarning=Y
    #include <OutlookEX.au3>
    #include <Process.au3>
    #include <TrayConstants.au3> ; Required for the $TRAY_ICONSTATE_SHOW constant.
    #include <Array.au3>
    #include <File.au3>
    #include <FileConstants.au3>

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

    Global $oItem ; <== NEU
    Opt("TrayMenuMode", 3) ; The default tray menu items will not be shown and items are not checked when selected. These are options 1 and 2 for TrayMenuMode.
    ; *****************************************************************************
    ; Connect to outlook
    ; *****************************************************************************
    Global $oOutlook = _OL_Open()
    If @error <> 0 Then Exit MsgBox(16, "OutlookEX UDF", "Error creating a connection to Outlook. @error = " & @error & ", @extended = " & @extended)

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

    ; *****************************************************************************
    ; Hier stehen Globale variabeln, und der Tray wird erstellt mit menu Items. Menu Item Exit enthält den _OL_Close
    ; *****************************************************************************

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

    Func SendMail2Central()
    ;*****************************************************************************
    ; Create a html mail plus attachment
    ;*****************************************************************************

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

    ;Hier steht ein bisschen code

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

    if condition then

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

    ; Create the item without setting the body.
    $oItem = _OL_ItemCreate($oOutlook, $olMailItem, $OLdraftmail, "", "To=" & $MailTo, "CC=" & $MailCC, "Subject=A subject", "BodyFormat=" & $olFormatHTML)

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

    ; Add all attachments
    _OL_ItemAttachmentAdd($oOutlook, $oItem, Default, $aFileList[1]) ; <== Assignment entfernt

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

    ; Modify the item to add HTML
    _OL_ItemModify($oOutlook, $oItem, Default, "HTMLBody=") ; <== Assignment entfernt

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

    _OL_ItemSend($oOutlook, $oItem) ; <== Assignment entfernt

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

    .... weiterer code

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

    endif
    endfunc

    [/autoit]
  • Also hier scheint die Sonne definitif nicht :)

    Die änderung hat leider nichts gebracht, Mail bleibt in der Outbox stecken und wird nicht verschickt wenn Outlook geschlossen ist.
    Noch dazu bekomme ich dann diese Meldung:
    "C:\PROGRA~2\AutoIt3\Include\OutlookEX.au3" (1269) : ==> Variable must be of type "Object".:
    $oFolder = $oNamespace.Folders($aFolders[1])
    $oFolder = $oNamespace^ ERROR

  • Da ist aber die Verschiebung der Variablen unschuldig.
    Der Fehler tritt entweder in _OL_FolderAccess auf oder bei einem impliziten Aufruf dieser Funktion. Z.B. durch _OL-ItemCreate.

    Mit welcher Version von Outlook arbeitest Du?

  • Jetzt seh ichs erst:

    [autoit]

    $oItem = _OL_ItemCreate($oOutlook, $olMailItem, $OLdraftmail, "", "To=" & $MailTo, "CC=" & $MailCC, "Subject=A subject", "BodyFormat=" & $olFormatHTML)

    [/autoit]


    Diese Zeile ist verkehrt. Die Empfänger musst Du über _OL_ItemRecipientAdd dazuhängen.
    Muss also lauten:

    [autoit]

    $oItem = _OL_ItemCreate($oOutlook, $olMailItem, "", "", "Subject=A subject", "BodyFormat=" & $olFormatHTML)

    [/autoit]
  • Wenn ich _OL_ItemRecipientAdd benutze, muss ich für jede mail adresse ein "vPx" benutzen, also

    [autoit]

    _OL_ItemRecipientAdd($oOutlook, $olMailItem, "", "", $vP1="mail1", $vP2="mail2", usw )

    [/autoit]


    Das sehe ich ja richtig.

    Nur werden dann alle mailadressen ins "To" gesetzt? Da ich ja momentan 2 ins "To" setze und 3 ins "CC".

    EDIT:
    Würde das hier funktionnieren?

    [autoit]

    _OL_ItemRecipientAdd($oOutlook, $oItem, Default, $olTo, $MailTo)
    _OL_ItemRecipientAdd($oOutlook, $oItem, Default, $olCC, $MailCC)

    [/autoit]

    Einmal editiert, zuletzt von laszia (21. August 2014 um 16:34)

  • Gemäß Help File: Ja.

  • Ich habe das jetzt mal getestet, leider löst das nicht das Problem beim versenden der Mail wenn Outlook geschlossen ist. Mail bleibt weiterhin in der Outbox hängen.
    Ist vielleicht jetzt ein Problem bei mir.
    Dann bleibt Outlook eben offen, ist jetzt nicht so schlimm.
    Vielen dank für deine Hilfe und Zeit.

  • _OL_Open macht das sowieso. Das Problem ist nur, dass Outlook selbst wieder endet, wenn kein Object referenziert und kein Outlook -Fenster offen ist.
    Außerdem würde mich interessieren, woran das Problem liegt.

  • Also es liegt nur am vesenden der Mail.
    Ich habe eine andere Funktion drin die ungelesene Mails liest, schaut ob ein Attachement dran hängt mit speziellem Namen und dann ein Unzip macht in einem speziellen Folder. Das funktionniert wenn Outlook geschlossen ist.
    Leider ist halt nur das Problem mit dem versenden der Mail. Die Mail wird erstellt, mit Attachement und landet dann in der Outbox. Diese bleibt aber dort hängen.
    Das _OL_Open mache ich ganz am Anfang wenn ich das Program starte. Den Close mache ich wenn ich das Program wieder schliesse. Normalerweise müsste die Verbindung mit Oulook immer bestehen bis ich halt das Programm schliesse, oder nicht?

  • Normalerweise müsste die Verbindung mit Oulook immer bestehen bis ich halt das Programm schliesse, oder nicht?

    Wie in Post #16 beschrieben eben nicht.
    Ersetz mal die Funktion _OL_ItemSend duch $oItem.Send()