Probleme beim abspeichern Adobe-Dokumente aus Outlook

  • Hallo Entwickler-Kollegen,

    hätte hier eine Outlook-Frage:

    Folgende Funktion soll im Outlook im 'Posteingang' die E-Mail scannen und überprüfen, ob sich Anhänge an den E-Mails befinden. Je nach Anzahl der der gefunden Anhänge sollen diese kopiert und in einem Ablageordner gespeichert werden.

    In diesem Fall unter: K:\CRS\ZFM\AutoIt\Programme\peppi\Attachments
    In dem Ordner: 123

    Die Funktion läuft zwar gut und schnell, jedoch gibt es das Problem, dass häufig die PDF-Dokumente unvollständig gespeichert werden. Dies lassen sich dann nicht mehr öffnen, obwohl es beim händischen speichern normal funktioniert. Andere Adobe-Dokumente, Bilder und Dokumente lassen sich wiederum problemlos öffnen.

    Ich vermute, dass es hier weniger ein Geschwindigkeitsproblem, sondern eher ein Problem ist, mit welcher Version die PDF-Dokumente generiert wurden (von neueren oder älteren Versionen).

    Kennt jemand die Problematik bzw. hat jemand eine Idee, wie man zuverlässig alle PDF-Dokumente abspeichern kann?

    Hier ist meine Funktion:

    Spoiler anzeigen
    [autoit]


    $oOutlook = _m_outlook_creat_get_Object() ; übergibt Objekt in Variable $oOutlook
    $Anhangfolder = 'K:\CRS\ZFM\AutoIt\Programme\peppi\Attachments\' ; speicherort der Anhänge
    $Item_ID = 123

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

    Global $aOL_Item = _OL_ItemFind($oOutlook, $Mail_Absender, $olMail, "", "", "", "EntryID"); übergibt alle Email-IDs
    If $aOL_Item[0][0] = 0 Then Exit MsgBox(16, "OutlookEX UDF: _OL_ItemAttachmentGet Example Script", "Es konnten keine Emails inm Ordner 'Drittanbieter\Posteingang' gefunden werden. @error = " & @error)
    Local $BeginnNo = 1, $ActualNo = $aOL_Item[0][0], $AnhangNo = ''
    While 1
    $Result = _OL_ItemAttachmentGet($oOutlook, $aOL_Item[$ActualNo][0], Default)
    If IsArray($Result) Then
    $AnhangNo = $Result[0][0]
    for $i = 0 to $AnhangNo
    _OL_ItemAttachmentSave($oOutlook, $aOL_Item[$ActualNo][0], Default, 1, $Anhangfolder&$Item_ID&'\'&$Result[$AnhangNo][1])
    $AnhangNo -=1
    IF @error <> 0 Then MsgBox(0, 'Result','Achtung Speicherfehler. @error =' & @error & ", @extended = " & @extended)
    next
    EndIf
    $AnhangNo = ''
    $BeginnNo += 1
    $ActualNo -= 1
    If $ActualNo = 0 Then Exit
    Wend
    _OL_Close($oOutlook)

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

    func _m_outlook_creat_get_Object($action = 'get')

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

    Local Static $outlook_Object

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

    Switch $action
    Case 'get'
    if IsObj($outlook_Object) then
    return $outlook_Object
    Else
    ContinueCase
    endif
    Case 'create'
    $outlook_Object = _OL_Open()
    return $outlook_Object
    case 'close'
    _OL_Close($outlook_Object)
    $outlook_Object = 0
    EndSwitch
    endfunc ;<==/m_outlook_creat_get_Object

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

    Vorab besten Dank für Eure Ideen

    Crack

  • Von welcher Office Version reden wir hier?

  • Hatte noch nie ein Problem mit nicht vollständig gesicherten Anhängen.
    Kannst Du mal _OL_ItemSave probieren? Flag = 2 sichert alle Anhänge.

  • vielen Dank für deinen Vorschlag. Habe ich ausprobiert. Leider konnten
    die unterschiedlichen Dateitypen nicht alle erkannt werden.

    Habe aber jetzt eine Lösung mit AutoIT und VBA gefunden, die alle Formate
    unterstützt und die PDFs auch stets vollständig abspeichert.

    Die Lösung sieht so aus:

    [autoit][/autoit]
    Spoiler anzeigen
    [autoit]

    $oOutlook = _m_outlook_creat_get_Object() ; übergibt Objekt in Variable $oOutlook
    $Anhangfolder = 'K:\CRS\ZFM\AutoIt\Programme\peppi\Attachments\' ; peicherort der Anhänge
    $Item_ID = 123; Ablageordner

    Global $aOL_Item = _OL_ItemFind($oOutlook, $Mail_Absender, $olMail, "", "", "", "EntryID"); übergibt alle Email-IDs
    If $aOL_Item[0][0] = 0 Then Exit MsgBox(16, "OutlookEX UDF: _OL_ItemAttachmentGet Example Script", "Es konnten keine Emails im Ordner 'Posteingang' gefunden werden. @error = " & @error)
    Local $ActualNo = $aOL_Item[0][0]; gibt die Anzahl der gefunden Emails zurück
    While 1
    $Result = _OL_ItemAttachmentGet($oOutlook, $aOL_Item[$ActualNo][0], Default)
    If IsArray($Result) Then
    for $i = 1 to UBound($Result) -1
    $oItem = $Result[$i][0]
    $oItem.SaveAsFile($Anhangfolder&$Item_ID&'\'&$oItem.Filename)
    for $i2 = 0 to 10
    $res = FileExists ($Anhangfolder&$Item_ID&'\'&$Result[$i][2])
    If $res = 1 Then Exitloop 1
    If $i2 = 10 Then Exitloop SetError(1)
    Sleep(300)
    next
    IF @error <> 0 Then Exit MsgBox(64, 'Result', 'Achtung Speicherfehler. mit Attachment: '&$Result[$i][2])
    next
    EndIf
    $ActualNo -= 1
    If $ActualNo = 0 Then Exitloop
    Wend
    MsgBox(64, "Hinweis", "Erfolgreich gespeichert!")
    _OL_Close($oOutlook)
    Exit

    func _m_outlook_creat_get_Object($action = 'get')
    Local Static $outlook_Object
    Switch $action
    Case 'get'
    if IsObj($outlook_Object) then
    return $outlook_Object
    Else
    ContinueCase
    endif
    Case 'create'
    $outlook_Object = _OL_Open()
    return $outlook_Object
    case 'close'
    _OL_Close($outlook_Object)
    $outlook_Object = 0
    EndSwitch
    endfunc ;<==/m_outlook_creat_get_Object

    [/autoit]
    [autoit][/autoit]

    Besten Dank für die Unterstützung