Tobit Infocenter EML Export

  • Ich versuche per Script EML Dateien aus meinen Infocenter zu exportieren, die API Ansteuerungen ist aus der Dokumentation von Tobit. Leider passiert nichts und ich habe keine Ahnung warum, kennt sich jemand mit der Tobit API so aus und zeigt mir meinen Fehler?


    [autoit]


    Dim $oApp, $oAccount, $oArchive, $oMailItem, $oMessageItems, $oMessageItem, $Filename, $Item, $oUser, $DVEmlFromMailItem
    $oApp = ObjCreate("DVOBJAPILib.DvISEAPI")
    $oAccount = $oApp.Logon("", "", "", "", "", "AUTH")
    $oArchive = $oAccount.GetSpecialArchive(101)
    $oMessageItems = $oArchive.AllItems
    MsgBox(0, "", "Anzahl der gefunden Mails: " & $oMessageItems.Count)
    $sFileName = @SystemDir & '\shell32.dll'
    $stString = DllStructCreate("wchar[260]")
    $open = DllOpen("DVAPI32.DLL")
    For $i = 0 To $oMessageItems.Count - 1
    $oMessageItem = $oMessageItems.Item($i)
    If $oMessageItem.Type = 0 Then
    $oMailItem = $oMessageItems.Item($i)
    $Filename = $stString
    MsgBox(0, "", $oMailItem.Subject)
    MsgBox(0, "", DllCall($open, "init", "DVEmlFromMailItem", "", "oMessageItem", "Filename"))
    If DllCall($open, "none", "DVEmlFromMailItem", "oMailItem", $Filename) <> 0 Then
    FileCopy($Filename, @WorkingDir&"\" & $oMailItem.Subject & ".eml")
    EndIf
    EndIf

    [/autoit]

    Einmal editiert, zuletzt von kunstlust (4. Mai 2011 um 15:26)

  • Dein DLLCall ist nicht korrekt. Du musst schon die richtige Syntax verwenden und den Rückgabewer beachten ;)


    [autoit]

    $aResult = DllCall($dvapidll, "long", "DVEmlFromMailItem", "idispatch", $oMailItem, "str", $sFileName)
    If @error Then
    ; DllCall Fehler
    Else
    ; Rückgabewert der Funktion in $aResult[0]
    EndIF

    [/autoit]
  • Danke so geht es, muss nur noch die Betreff so umschreiben, das Sie als alle Files schreibbar sind...

    [autoit]


    Dim $oApp, $oAccount, $oArchive, $oMailItem, $oMessageItems, $oMessageItem, $Filename, $Item, $oUser, $DVEmlFromMailItem
    $oApp = ObjCreate("DVOBJAPILib.DvISEAPI")
    $oAccount = $oApp.Logon("", "", "", "", "", "AUTH")
    $oArchive = $oAccount.GetSpecialArchive(101)
    $oMessageItems = $oArchive.AllItems
    MsgBox(0, "", "Anzahl der gefunden Mails: " & $oMessageItems.Count)
    $sFileName = @SystemDir & '\shell32.dll'
    $stString = DllStructCreate("wchar[260]")
    $open = DllOpen("DVAPI32.DLL")

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

    For $i = 0 To $oMessageItems.Count - 1
    $oMessageItem = $oMessageItems.Item($i)
    If $oMessageItem.Type = 2 Then
    $oMailItem = $oMessageItems.Item($i)
    $Filename = $stString
    If DllCall("DVAPI32.DLL", "long", "DVEmlFromMailItem", "idispatch", $oMailItem, "str", $FileName) <> 0 Then
    $aResult = DllCall("DVAPI32.DLL", "long", "DVEmlFromMailItem", "idispatch", $oMailItem, "str", $FileName)
    If @error Then
    MsgBox(0,"","Fehler")
    Else
    FileCopy($aResult[2], @TempDir & $oMailItem.Subject & ".eml")
    EndIf
    EndIf
    EndIf
    Next

    [/autoit]
  • Das stimmt immer noch nicht. Warum machst du den DLLCall 2x?
    Außerdem bringt das $stFilename überhaupt nichts. Wenn du hier keinen Pfad angeben kannst, sondern nur ein Ergebnis erhälst reicht es so aus.
    Übrigens fehlt der Backslash nach @TempDir

    [autoit]


    $aResult = DllCall("DVAPI32.DLL", "long", "DVEmlFromMailItem", "idispatch", $oMailItem, "str", "")
    If @error Then
    MsgBox(0,"","Fehler beim DLLCall (Funktion gar nicht gestartet)")
    ElseIf $aResult[0] = 0 Then
    MsgBox(0,"","Fehler während der Funktion DVEmlFromMailItem (Funktion gestartet, hatte keinen Erfolg)")
    Else
    FileCopy($aResult[2], @TempDir & "\" & $oMailItem.Subject & ".eml")
    EndIf

    [/autoit]
  • Da ist noch ein Rest vom VB6 über geblieben, mir war auch nicht bekannt, dass die Ausgbabe der DLL in ein Array übergeben wird, ich habe mich zu sehr am dem VB6 aus der Dokumentation orientiert. Für diesen Tip bin ich dir sehr dankbar progandy, weil ich mich immer wieder im Kreis gedreht habe. Ich werde das in der kommenden Woche noch schöner machen, nur haben ich keinen Zugriff auf die DavidAPI, da ich das @Home nicht installiert habe.