Outlook UDF nicht vorhandene User Filtern

  • Hallo zusammen,


    ich habe ein dringendes Problem.



    wenn ich über das Outlook UDF eine Mail versenden will (im Auftrag von ) und in der Liste ein User ist der nicht im Outlookadressbuch ist gibt es einen Fehler wenn die Person an erster
    Stelle steht oder wenn er an 2. Stelle steht werden keine Mails an alle die dahinter stehen geschickt.


    Das ist fatal! gibt es eine Möglichkeit diese User Automatisch zu Filtern oder nicht zu beachten ?



    Hier einmal die Senden Funktion:



    Func Senden()
    Global $iMax
    Global $iMax1
    Global $iMax2
    Local $data = $pto
    Local $data1 = $pcc
    Local $data2 = _GUICtrlEdit_GetText($fbcc)
    Global $to = StringSplit($data, ";",2)
    Global $cc = StringSplit($data1, ";",2)
    Global $bcc = StringSplit($data2, ";",2)



    If IsArray($to) Then
    $iMax = UBound($to); get array size
    For $i = 0 to $iMax - 1; subtract 1 from size to prevent an out of bounds error
    Next
    EndIf


    If IsArray($cc) Then
    $iMax1 = UBound($cc); get array size
    For $i = 0 to $iMax1 - 1; subtract 1 from size to prevent an out of bounds error
    Next
    EndIf


    If IsArray($bcc) Then
    $iMax2 = UBound($bcc); get array size
    For $i = 0 to $iMax - 1; subtract 1 from size to prevent an out of bounds error
    Next
    EndIf


    #ConsoleWrite($to[0] & @CRLF)
    #ConsoleWrite($to[1] & @CRLF)



    ; Open the connection to Outlook
    Global $oOL = _OL_Open()



    ; Create a mail item and set some properties
    Global $oItem = _OL_ItemCreate($oOL, $olMailItem, "*", "", "Subject=" & $betreff, "BodyFormat=" & $olFormatHTML, "HTMLBody=" & $textfeld, "SentOnBehalfOfName=Servicedesk")
    ConsoleWrite("itemcreate error " & @error & " Extendet " & @extended & @CRLF)


    ; Add a recipient and resolve it
    _OL_ItemRecipientAdd($oOL, $oItem, Default, $olTo, $to)
    _OL_ItemRecipientAdd($oOL, $oItem, Default, $olcc, $cc)
    _OL_ItemRecipientAdd($oOL, $oItem, Default, $olbcc, $bcc)
    ConsoleWrite("itemrecive error " & @error & " Extendet " & @extended & @CRLF)



    ; Send the mail
    _OL_ItemSend($oOL, $oItem)
    If @extended = -2147352567 Then _
    MsgBox(16, "OutlookEX UDF - Example Script", "You don't have permission to send the mail on behalf of the specified person!")
    ConsoleWrite("send error " & @error & " Extendet " & @extended & @CRLF)



    EndFunc


    ich hoffe ihr könnt mir helfen.


    Gruß
    Florian

  • Dafür gibt es die Funktion _OL_RecipientCheck. Damit lässt sich prüfen, ob der/die Empfänger gültig ist.

  • Water deine scripte sind ich Hammer aber auch sehr kompliziert zumindest wenn man nicht vollzeitprogrammierer ist.



    Wenn ich jetzt mal ein Stück aus der Vorlage nehme:



    Global $aResult = _OL_ItemRecipientCheck($oOL, $vRecipients ????? ) ;hier würde ich dann ja mein gefülltes Array eintragen wo die ganzen Empfänger drin sind oder ? das wäre bei mir $to aber wie übergebe ich das ? ich bekomme immer Fehler |2 - $vRecipients is empty


    If @error <> 0 Then Exit MsgBox(16, "OutlookEX UDF: _OL_ItemRecipientCheck Example Script", "Error frunning _OL_ItemRecipientCheck. @error = " & @error & ", @extended = " & @extended)
    _ArrayDisplay($aResult, "OutlookEX UDF: _OL_RecipientCheck Example Script", _
    -1, 0, "", "|", "Row|Recipient|Resolved?|Recipient object|AddressEntry object|Mail address|DisplayType|Name")



    Gruß Flo

  • Die Funktion erwartet die Recipients als String getrennt durch ";":
    "Name, Alias or SMTP mail address of one or multiple recipients separated by ;"
    Nimm also $sToCheck = _ArrayToString($To, ";")

  • Ich bekomme leider kein gescheites Ergebnis.


    [Blockierte Grafik: http://up.picr.de/19611188rb.jpg]


    nur eine leeres Array Display.
    ich habe das Array so übergeben:

    Global $aResult = _OL_ItemRecipientCheck($oOL, $sToCheck = _ArrayToString($to, ";"))

    So hatte ich es auch noch versucht:



    $sToCheck = _ArrayToString($to, ";")
    Global $aResult = _OL_ItemRecipientCheck($oOL, $sToCheck)

    wie ist das wenn ein User der nicht im Adressbuch ist gefundden wird muss der dann mit der Funktion _OL_ItemRecipientDelete entfernt werden ?

  • Dieses Beispiel zeigt, wie sich eine falsche Adresse (Nummer 3) von korrekten unterscheidet:
    #include <OutlookEX.au3>


    Global $oOutlook = _OL_Open()
    If @error Then Exit MsgBox(16, "OutlookEX UDF - _OL_RecipientCheck Example Script", "Error running _OL_Open. @error = " & @error & ", @extended = " & @extended)


    Global $aResult = _OL_ItemRecipientCheck($oOutlook, $oOutlook.GetNameSpace("MAPI").CurrentUser.Name & ";test.user@google.com;Wrong address")
    If @error <> 0 Then Exit MsgBox(16, "OutlookEX UDF: _OL_ItemRecipientCheck Example Script", "Error frunning _OL_ItemRecipientCheck. @error = " & @error & ", @extended = " & @extended)
    _ArrayDisplay($aResult, "OutlookEX UDF: _OL_RecipientCheck Example Script", _
    "", 0, "|", "Row|Recipient|Resolved?|Recipient object|AddressEntry object|Mail address|DisplayType|Name")


    _OL_Close($oOutlook)

  • Ok schätze jetzt klappt es, keine Ahnung was das Problem war habe alles per Hand noch einmal neu geschrieben dann ging es.


    aber nun wird mir ja das ganze Array ausgegeben mit True oder False, wie Filtere ich die False raus und gebe den Rest weiter an _OL_ItemSend ?
    Es soll ja Automatisch ablaufen ohne das der User etwas dazu tun muss.


    Evtl eine Ausgabe welche Empfänger False sind.

  • In einem Loop durchs Array gehen und nur jene mit True in einem String zusammenfassen und mit ";" trennen?

  • Das mit dem auslesen der True Daten und in ein String zusammen fassen klappt jetzt nicht wirklich


    ich habe einiges versucht, aber ich muss zugeben ich weiß schlicht weg nicht wie das geht :(



    If IsArray($aResult) Then
    For $i = 0 to UBound($aResult) -1

    Next
    EndIf



    muss ich das mit _arraySearch machen ?


    Edit: Ich habe natürlich gesucht, aber das scheint alles irgendwie nicht zu passen

  • Du musstdringend Deine Array Kenntnisse auffrischen ;-)
    Global $sTo = ""
    For $i = 1 To $aResult[0][0]
    If $aResult[$i][1] = True Then $sTo &= $aResult[$i][0] & ";"
    Next
    ConsoleWrite($sTo & @CRLF)

  • Du musstdringend Deine Array Kenntnisse auffrischen ;-)


    Da hast Du recht und nicht nur das... :)


    Also das Filtern klapp soweit gut aber das Übergeben an die _OL_ItemRecipientAdd bzw. Senden da bekomme ich den "no permission" fehler allerdings ohne Error und Extendet code.
    itemcreate error 0 Extendet 0
    itemrecive error 0 Extendet 0
    send error 0 Extendet 0


    Die Werte in der gefilterten Variable $sTo scheinen korrekt
    Nachname, Vorname;Nachname, Vorname; etc.


    hier nochmal die Senden Funktion:



    Func Senden()
    Global $iMax
    Global $iMax1
    Global $iMax2
    Local $data = $pto
    Local $data1 = $pcc
    Local $data2 = _GUICtrlEdit_GetText($fbcc)
    Global $to = StringSplit($data, ";",2)
    Global $cc = StringSplit($data1, ";",2)
    Global $bcc = StringSplit($data2, ";",2)
    If IsArray($to) Then
    $iMax = UBound($to)
    For $i = 0 to $iMax - 1
    Next
    EndIf


    If IsArray($cc) Then
    $iMax1 = UBound($cc)
    For $i = 0 to $iMax1 - 1
    Next
    EndIf


    If IsArray($bcc) Then
    $iMax2 = UBound($bcc)
    For $i = 0 to $iMax - 1
    Next
    EndIf



    ; Open the connection to Outlook
    Global $oOL = _OL_Open()


    ; Mailusertest


    Global $TOstring = _ArrayToString($to, ";")


    Global $aResult = _OL_ItemRecipientCheck($oOL, $TOstring)
    ConsoleWrite("Check " & @error & " Extendet " & @extended & @CRLF)
    If @error <> 0 Then Exit MsgBox(16, "OutlookEX UDF: _OL_ItemRecipientCheck Example Script", "Error frunning _OL_ItemRecipientCheck. @error = " & @error & ", @extended = " & @extended)
    _ArrayDisplay($aResult, "OutlookEX UDF: _OL_RecipientCheck Example Script", _
    "", 0, "|", "Row|Recipient|Resolved?|Recipient object|AddressEntry object|Mail address|DisplayType|Name")


    Global $sTo = ""
    For $i = 1 To $aResult[0][0]
    If $aResult[$i][1] = True Then $sTo &= $aResult[$i][6] & ";"
    Next


    ConsoleWrite($sTo & @CRLF)


    ; Create a mail item and set some properties
    Global $oItem = _OL_ItemCreate($oOL, $olMailItem, "*", "", "Subject=" & $betreff, "BodyFormat=" & $olFormatHTML, "HTMLBody=" & $textfeld, "SentOnBehalfOfName=Servicedesk")
    ConsoleWrite("itemcreate error " & @error & " Extendet " & @extended & @CRLF)


    ; Add a recipient and resolve it
    _OL_ItemRecipientAdd($oOL, $oItem, Default, $olTo, $sTo)
    _OL_ItemRecipientAdd($oOL, $oItem, Default, $olcc, $cc)
    _OL_ItemRecipientAdd($oOL, $oItem, Default, $olbcc, $bcc)
    ConsoleWrite("itemrecive error " & @error & " Extendet " & @extended & @CRLF)


    ; Send the mail
    _OL_ItemSend($oOL, $oItem)
    If @extended = -2147352567 Then _
    MsgBox(16, "OutlookEX UDF - Example Script", "You don't have permission to send the mail on behalf of the specified person!")
    ConsoleWrite("send error " & @error & " Extendet " & @extended & @CRLF)


    EndFunc

  • Der "permission error" zeigt an, dass Du keine "permission" sprich Berechtigung hast :-)
    Der Eigentümer der Mailbox muss Dir erlauben, dass Du in seinem Namen Mails versenden darfst.

  • ich habe die Berechtigung ohne die Checkfunktion klappt es ja bzw. wenn kein Empfänger drin steht der ungültig ist.
    und nun kommt nach dem Filtern auch der Fehler obeohl es passen müsste da alle Empfänger gültig sind.


    hast Du noch eine Idee woran das liegen könnte ?

  • Mein Fehler.
    RecipientAdd erwartet 1-10 Empfänger Objekte, 1-10 Empfänger Namen oder einen Array an Empfängern (Objekt oder Name). Was möchtest Du übergeben?

  • Hier ein funktionierendes Beispiel. "John Doe" musst Du noch durch einen gültigen Namen ersetzen. Einige zeilen habe ich auskommentiert oder den für den Test nicht verwendbaren Teil nach rechts in einen Kommentar verschoben.
    #include <OutlookEx.au3>
    Global $pcc = "", $Betreff = "TestBetreff", $textfeld = "TestText"
    Senden()
    Exit


    Func Senden()
    Local $data = "john doe;xyz123" ; $pto
    Local $data1 = $pcc
    Local $data2 = "" ; _GUICtrlEdit_GetText($fbcc)
    Local $cc = StringSplit($data1, ";", 2)
    Local $bcc = StringSplit($data2, ";", 2)


    ; Open the connection to Outlook
    Global $oOL = _OL_Open()


    ; Mailusertest
    Global $aResult = _OL_ItemRecipientCheck($oOL, $data)
    If @error <> 0 Then Exit MsgBox(16, "OutlookEX UDF: _OL_ItemRecipientCheck Example Script", "Error frunning _OL_ItemRecipientCheck. @error = " & @error & ", @extended = " & @extended)
    _ArrayDisplay($aResult, "OutlookEX UDF: _OL_RecipientCheck Example Script", _
    "", 0, "|", "Row|Recipient|Resolved?|Recipient object|AddressEntry object|Mail address|DisplayType|Name")


    Global $aTo[$aResult[0][0]], $j = 0
    For $i = 1 To $aResult[0][0]
    If $aResult[$i][1] = True Then
    $aTo[$j] = $aResult[$i][2]
    $j = $j + 1
    Endif
    Next


    ; Create a mail item and set some properties
    Global $oItem = _OL_ItemCreate($oOL, $olMailItem, "*", "", "Subject=" & $betreff, "BodyFormat=" & $olFormatHTML, "HTMLBody=" & $textfeld) ; , "SentOnBehalfOfName=Servicedesk")


    ; Add a recipient and resolve it
    _OL_ItemRecipientAdd($oOL, $oItem, Default, $olTo, $aTo)
    ; _OL_ItemRecipientAdd($oOL, $oItem, Default, $olcc, $cc)
    ; _OL_ItemRecipientAdd($oOL, $oItem, Default, $olbcc, $bcc)


    ; Send the mail
    _OL_ItemSend($oOL, $oItem)
    If @extended = -2147352567 Then _
    MsgBox(16, "OutlookEX UDF - Example Script", "You don't have permission to send the mail on behalf of the specified person!")


    EndFunc ;==>Senden

  • Andere alternative:
    Ich habe _OL_ItemRecipientCheck so angepasst, dass es einen Array zurückggibt, der nur die gültigen Adressen beinhaltet und direkt an _OL_ItemRecipientAddweitergegeben werden kann.
    Beispiel:

  • kannst Du mir erklären warum alle Empfänger ob To (was ja ok ist) aber auch CC in der An Zeile landenden wenn die Mail gesendet wird ?


    übergeben wird mit to und cc gesendet wird alles in to und ich kann den Fehler nicht finden. Die Wertübergaben sehen alle gut aus so wie ich das sehe.
    Könntest Du nochmal einen Blick drauf werfen ?


    Übrigens die "neue Funktion" ist SUPER :thumbsup: jetzt geht es sehr einfach.



    Func Senden()



    Local $data = $pto
    Local $data1 = $pcc
    Local $bcc = _GUICtrlEdit_GetText($fbcc)
    ;Global $to = StringSplit($data, ";",2)
    ;Global $cc = StringSplit($data1, ";",2)
    ;Global $data2 = StringSplit($bcc, ";",2)


    Global $textfeld = stringreplace(_GUICtrlEdit_GetText($Edit1), @CRLF, "<br>")
    Global $betreff=$pnotfall & " " & $melde


    ; Open the connection to Outlook
    Global $oOL = _OL_Open()


    ; Mailusertest TO & CC


    Global $aResult = _OL_ItemRecipientCheckEx($oOL, $data, "", "", "", "", "", "", "", "", "", True)
    Global $aResult1 = _OL_ItemRecipientCheckEx($oOL, $data1, "", "", "", "", "", "", "", "", "", True)


    ; Create a mail item and set some properties
    Global $oItem = _OL_ItemCreate($oOL, $olMailItem, "*", "", "Subject=" & $betreff, "BodyFormat=" & $olFormatHTML, "HTMLBody=" & $textfeld, "SentOnBehalfOfName=Servicedesk@hermes-europe.eu")
    ConsoleWrite("itemcreate error " & @error & " Extendet " & @extended & @CRLF)





    ; Add a recipient and resolve it
    _OL_ItemRecipientAdd($oOL, $oItem, Default, $olTo, $aResult)
    _OL_ItemRecipientAdd($oOL, $oItem, Default, $olCC, $aResult1)
    ;_OL_ItemRecipientAdd($oOL, $oItem, Default, $olbcc, $aBcc)
    ConsoleWrite("itemrecive error " & @error & " Extendet " & @extended & @CRLF)


    ; Send the mail
    _OL_ItemSend($oOL, $oItem)
    If @extended = -2147352567 Then _
    MsgBox(16, "OutlookEX UDF - Example Script", "You don't have permission to send the mail on behalf of the specified person!")
    ConsoleWrite("send error " & @error & " Extendet " & @extended & @CRLF)



  • Muss ich am Montag mal checken.