Outlooknachricht per DragDrop als *.msg speichern

  • Moin,

    ich versuche eine Outlooknachricht per Drag & Drop in einem Ordner als *.msg Datei mit @water's UDF zu speichern.

    Anbei der Code. Es funktioniert leider nicht.

    könnt ihr mir helfen?

    Spoiler anzeigen

    #include <GUIConstantsEx.au3>

    #include <WindowsConstants.au3>

    #include "DragDropEvent.au3"

    #include <OutlookExConstants.au3>

    #include <OutlookEX.au3>

    #include <Array.au3>

    Opt("MustDeclareVars", 1)

    DragDropEvent_Startup()

    Main()

    Exit

    Func Main()

    Local $MainWin = GUICreate("DragDrop", 380, 130, -1, -1, -1, $WS_EX_TOPMOST)

    GUISetFont(12, 900)

    GUICtrlCreateLabel("(DragDrop)", 40, 40)

    DragDropEvent_Register($MainWin)

    GUIRegisterMsg($WM_DRAGENTER, "OnDragDrop")

    GUIRegisterMsg($WM_DRAGOVER, "OnDragDrop")

    GUIRegisterMsg($WM_DRAGLEAVE, "OnDragDrop")

    GUIRegisterMsg($WM_DROP, "OnDragDrop")

    GUISetState(@SW_SHOW)

    While GUIGetMsg() <> $GUI_EVENT_CLOSE

    WEnd

    GUIDelete()

    EndFunc ;==>Main

    Func OnDragDrop($hWnd, $Msg, $wParam, $lParam)

    Static $DropAccept

    Switch $Msg

    Case $WM_DRAGENTER, $WM_DROP

    ToolTip("")

    Select

    Case DragDropEvent_IsFile($wParam)

    If $Msg = $WM_DROP Then

    Local $FileList = DragDropEvent_GetFile($wParam)

    MsgBox(262144, "DragDropEvent", StringReplace($FileList, "|", @LF))

    EndIf

    $DropAccept = $DROPEFFECT_COPY

    Case DragDropEvent_IsText($wParam)

    If $Msg = $WM_DROP Then

    Global $oOApp = ObjCreate("Outlook.Application")

    Global $oItems = $oOApp.GetDefaultFolder($olFolderInbox).Items

    ObjEvent($oItems, "oItems_")

    Global $oItem = DragDropEvent_GetText($wParam)

    Msgbox(1,"",$oItem)

    Global $oOutlook = _OL_Open()

    Global $SendMailFile = "D:\Hallo.msg"

    _OL_ItemSave($oOutlook, $oItem, Default, $SendMailFile, $olMSGUnicode)

    $oItem.Display

    EndIf

    $DropAccept = $DROPEFFECT_COPY

    Case Else

    $DropAccept = $DROPEFFECT_NONE

    EndSelect

    Return $DropAccept

    Case $WM_DRAGOVER

    Local $X = DragDropEvent_GetX($wParam)

    Local $Y = DragDropEvent_GetY($wParam)

    ToolTip("(" & $X & "," & $Y & ")")

    Return $DropAccept

    Case $WM_DRAGLEAVE

    ToolTip("")

    EndSwitch

    EndFunc ;==>OnDragDrop

    Func oItems_ItemAdd($oOL_Item)

    MsgBox(64, "OutlookEX UDF Example Script", "Mail has been sent!" & @CRLF & @CRLF & _

    "Subject: " & $oOL_Item.Subject)

    _OL_ItemSave($oOutlook, $oOL_Item, Default, $SendMailFile, $olMSGUnicode)

    EndFunc ;==>oOFolder_ItemAdd

  • Das Thema Mails in irgendetwas zu verwandeln liegt mir ziemlich am Herzen. Leider z.Z. nicht genug Zeit. Was wird das wenn ich fragen darf?

    Edit :

    Wenn Du ein Outloock Mail auf dem Desktop ablegst wandelt sich das nicht von selbst in ein msg? Benutze kein Outlook, aber meine Mail Programme verhalten sich alle so. Aber eben kein Outlook

    Gruß

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Zitat

    Wenn Du ein Outloock Mail auf dem Desktop ablegst wandelt sich das nicht von selbst in ein msg

    Das ist mir klar!

    Ich habe eine AutoitGui und möchte es gern für diese GUI verwenden.

  • Ok - habe soetwas dieser Tage für images gemacht... Verarbeitest Du die MSG weiter? Was "treibst" Du damit?

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Zitat

    Verarbeitest Du die MSG weiter? Was "treibst" Du damit?

    Ich möchte sie auf der Festplatte als *.msg speichern. Alles andere ist sekundär.

    Für andere Dateien ist es ja kein Problem.

    Ich denke, water könnte was dazu sagen. Er hat die UDF dafür geschrieben, die ich sonst hervorragend nutze.

  • So funktioniert es, z.B. auf Laufwerk D:\ ! ;)

    Spoiler anzeigen

    #include <GUIConstantsEx.au3>

    #include <WindowsConstants.au3>

    #include "DragDropEvent.au3"

    #include <OutlookExConstants.au3>

    #include <OutlookEX.au3>

    #include <Array.au3>

    Opt("MustDeclareVars", 1)

    DragDropEvent_Startup()

    Main()

    Exit

    Func Main()

    Local $MainWin = GUICreate("DragDrop", 380, 130, -1, -1, -1, $WS_EX_TOPMOST)

    GUISetFont(12, 900)

    GUICtrlCreateLabel("(DragDrop)", 40, 40)

    DragDropEvent_Register($MainWin)

    GUIRegisterMsg($WM_DRAGENTER, "OnDragDrop")

    GUIRegisterMsg($WM_DRAGOVER, "OnDragDrop")

    GUIRegisterMsg($WM_DRAGLEAVE, "OnDragDrop")

    GUIRegisterMsg($WM_DROP, "OnDragDrop")

    GUISetState(@SW_SHOW)

    While GUIGetMsg() <> $GUI_EVENT_CLOSE

    WEnd

    GUIDelete()

    EndFunc ;==>Main

    Func OnDragDrop($hWnd, $Msg, $wParam, $lParam)

    Static $DropAccept

    Switch $Msg

    Case $WM_DRAGENTER, $WM_DROP

    ToolTip("")

    Select

    Case DragDropEvent_IsFile($wParam)

    If $Msg = $WM_DROP Then

    Local $FileList = DragDropEvent_GetFile($wParam)

    MsgBox(262144, "DragDropEvent", StringReplace($FileList, "|", @LF))

    EndIf

    $DropAccept = $DROPEFFECT_COPY

    Case DragDropEvent_IsText($wParam)

    If $Msg = $WM_DROP Then

    Global $oOutlook = _OL_Open()

    $oOutlook = ObjCreate("Outlook.Application")

    For $objItem In $oOutlook.ActiveExplorer.Selection

    LOcal $sSubject = $objItem.Subject

    ;~ MsgBox(1, "", $sSubject)

    $objItem.SaveAs("D:\" & "\" & StringRegExpReplace($sSubject, '[\/:*?"<>|]', '_') & ".msg", $olMSG)

    Next

    EndIf

    $DropAccept = $DROPEFFECT_COPY

    Case Else

    $DropAccept = $DROPEFFECT_NONE

    EndSelect

    Return $DropAccept

    Case $WM_DRAGOVER

    Local $X = DragDropEvent_GetX($wParam)

    Local $Y = DragDropEvent_GetY($wParam)

    ToolTip("(" & $X & "," & $Y & ")")

    Return $DropAccept

    Case $WM_DRAGLEAVE

    ToolTip("")

    EndSwitch

    EndFunc ;==>OnDragDrop

  • Code
    Global $oOutlook = _OL_Open()
    $oOutlook = ObjCreate("Outlook.Application")

    ist doppelt gemoppelt. Wirf die zweite Zeile raus.

    Außerdem würde ich die Verbindung zu Outlook nicht in einer Funktion sondern gleich nach dem Programmstart machen (sonst machst Du das ja wieder und wieder und ...). Und bei Scriptende vielleicht (zwecks der Schönheit) noch ein _OL_Close.

  • water, ich wollte das ganze noch erweitern.

    Die gesamte Mail mit Anhang kann ja jetzt per DragDrop als *.msg Datei gespeichert werden.

    Nun wollte ich auf dem gleichen Weg aus einer Mail nur den Anhang per DragDrop speichern.

    Das Subject kann ich ja wie oben im Script auslesen, aber das Auslesen des .Attachments bekomme ich nicht hin.

    Mit $objItem.SaveAsFile ist es ja dann möglich das File zu speichern.

    Kannst du mir helfen?

  • Dafür ist die Funktion _OL_ItemSave da. Da kannst Du entscheiden, was wo gesichert werden soll.

  • Zitat

    Dafür ist die Funktion _OL_ItemSave da. Da kannst Du entscheiden, was wo gesichert werden soll.

    Wenn ich eine neue Mail erstelle, verwende ich auch den Befehl zum Speichern in eine *.msg Datei.

    Das klappt gut.

    Aber woher bekomme ich das?

    "$vItem = EntryID or object of the item to save"

  • Hängt davon ab, was die Funktionen in "DragDropEvent.au3" machen. Irgendwie müssen die zurückgeben, welches Item verschoben wurde.
    Jede Mail hat eine sogenannte EntryID (eindeutige Kennung) oder es wird direkt das Objekt der Mail zurückgegeben.

  • Ist das mit der EntryID Programmabhängig? Gibt es das nur in Outlook oder auch in anderen Programmen? Woher kommt die Nummer?


    Danke

    Peter

    Hinweise auf Suchmaschinen finde ich überflüssig - wer fragt hat es nicht gefunden oder nicht verstanden. Die Antwort gibt sich oftmals schneller als der Hinweis auf Dr. Goggle & Co.

    Ab 19-10-22 ergänzt um:

    Die Welt wird nicht bedroht von den Menschen, die böse sind, sondern von denen, die das Böse zulassen. (Albert Einstein)

  • Ich kenne das nur von Outlook - aber andere Programme müssen auch eine Kennung haben um ein Objekt eindeutig zu identifizieren.

    Wenn Du bereits die ganze Mail sichern kannst, dann hast Du ja schon Zugriff auf die Mail. Mit _OL_ItemSave kannst Du nicht nur die ganze Mail (inkl. Anhänge), sondern nur dei Anhänge sichern.
    Mit Parameter $iFlags steuerst Du das.

  • Zitat

    Mit _OL_ItemSave kannst Du nicht nur die ganze Mail (inkl. Anhänge), sondern nur dei Anhänge sichern.

    Mit Parameter $iFlags steuerst Du das.

    water Vielen Dank!

    Eine super UDF. :)

    Genauso habe ich es schon gemacht und es funktioniert gut.

    Leider wird mit dem Setzen des "Flags 2 + 8" bei den Anhängen kein "@error = 11" erzeugt, sondern nur bei "Flags 1 + 8".

    Somit kann ich wenigstens beim Item sehen ob es schon als Datei gespeichert ist und dann entscheiden ob ich es ersetze oder hinzufüge.

  • Genau. Aber das könnte man bei Bedarf noch einbauen :)
    Oder Du verwendest vorab FileExists um zu checken, ob es die Datei/den Anhang schon gibt.