Drag & Drop mit E-Mail

  • Hi

    Wir bekommen täglich dutzende E-Mails mit neuen Lizenzanfragen für eines meiner Programme.
    Alle diese Anfragen muss jemand in eine interne Datenbank einpflegen.

    Da das Abtippen oder Rüberkopieren mühsam ist, dachte ich an folgende Lösung:
    Ist es möglich, eine E-Mail aus Outlook per Drag & Drop auf ein z.B. Inputfeld in meiner GUI zu ziehen und ich kann dann den Inhalt der E-Mail selbständig parsen und automatisch korrekt in die Felder einfüllen? Der Benutzer müsste dann nur noch kontrollieren, ob alles korrekt abgefüllt ist. (Sollte in > 99% der Fälle stimmen). Ich brauche den Inhalt der Mail und den Absender.

    Weiss hier jemand einen Ansatzpunkt?
    Mit dem "normalen" Drag & Drop werden nur Dateien akzeptiert.
    Aber in Windows kann ich ja auch eine Datei aus Outlook auf den Desktop ziehen und ich bekomme eine Kopie der Mail.

    Vielen Dank.
    Veronesi

  • Hi Chip

    Danke für die Antwort.
    Ich habe zwar noch nicht in die Outlook UDF geschaut, doch ich konnte einen Teilerfolg verbuchen.
    Wenn ich nun weiss, wie der Titel des Mails ist, kann ich meine neue UDF verwenden.

    _GetEmailText
    [autoit]

    Func _GetEmailText($sTitle, $sType = "Body")
    ;http://msdn.microsoft.com/en-us/library/…office.11).aspx
    Local Const $olFolderInbox = 6
    Local $oOutlook = ObjCreate("Outlook.Application")
    If Not IsObj($oOutlook) Then Return SetError(1, 0, 0)
    Local $oNameSpace = $oOutlook.GetNameSpace("MAPI")
    Local $oFolder = $oNameSpace.GetDefaultFolder($olFolderInbox)
    Local $oMailItem = $oFolder.Items($sTitle)
    ;~ $oMailItem.Display()
    Switch $sType
    Case "Body"
    Local $Ret = $oMailItem.Body()
    $oOutlook = ""
    $oNameSpace = ""
    $oFolder = ""
    $oMailItem = ""
    Return $Ret
    Case "Sender"
    Local $Ret = $oMailItem.SenderEmailAddress()
    $oOutlook = ""
    $oNameSpace = ""
    $oFolder = ""
    $oMailItem = ""
    Return $Ret
    EndSwitch
    EndFunc ;==>_GetEmailText

    [/autoit]

    Nun müsste ich nur noch wissen, wie ich an den Titel komme.
    Wenn ich im Outlook ein Mail markiere und Ctrl+C drücke, und das dann in ein Notepad einfüge, komme ich an den Titel. (Müsste nur noch etwas parsen...)
    Aber wenn ich das mit folgender Funktion versuche, wird nie etwas kopiert!

    Weiss hier noch jemand rat? Das wäre super. Bin ja schon sehr weit gekommen!

    Problemstellung
    [autoit]

    #include <WindowsConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <Misc.au3>
    Opt("GUIOnEventMode", 1)
    Global $hUser32, $hGUI1,$Input

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

    _GUI1()

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

    While True
    Sleep(5000)
    WEnd

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

    _Exit()

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

    Func _GUI1()
    $hGUI1 = GUICreate("Test", 800, 600, -1, -1, -1, $WS_EX_ACCEPTFILES)
    GUISetOnEvent($GUI_EVENT_CLOSE ,"_CloseGUI1")
    $Input = GUICtrlCreateInput("", 10, 10, 700, 50)
    GUICtrlSetState(-1, $GUI_DROPACCEPTED)
    GUISetState()
    $hUser32 = DllOpen("user32.dll")
    AdlibRegister("_CheckMouse", 100)
    EndFunc

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

    Func _CheckMouse()
    If _IsPressed("01", $hUser32) Then
    If WinActive("") <> $hGUI1 Then
    Sleep(50)
    Send("^C") ;Copy Element ====> Dies funktioniert eben irgendwie nicht!!!!!!!!!
    While _IsPressed("01", $hUser32)
    Sleep(10)
    WEnd
    If _WindowFromPoint() = ControlGetHandle($hGUI1, "", $Input) Then
    MouseClick("left")
    Send("^v")
    EndIf
    EndIf
    EndIf
    EndFunc

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

    Func _WindowFromPoint()
    Local $point, $cHwnd, $hwnd, $pos, $size
    $point = MouseGetPos()
    $hwnd = DllCall($hUser32, "hwnd", "WindowFromPoint", "int", $point[0], "int", $point[1])
    Return $hwnd[0]
    EndFunc

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

    Func _CloseGUI1()
    GUIDelete($hGUI1)
    AdlibUnRegister("_CheckMouse")
    DllClose($hUser32)
    _Exit()
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]

    Gruss Veronesi

  • Inzwischen weiss ich, weshalb das Send("^c") nicht funktioniert.
    Man muss das Fenster zuerst aktivieren und erst dann den Drag & Drop Befehl mit der Maus starten....
    Auch ein WinActivate(...) hat leider nichts gebracht.
    Ebensowenig ein ControlSend.

    Da scheint Outlook irgendwie resistent dagegen zu sein :(

    Wenn noch jemand eine Idee hat, ohne dass man das Outlook Fenster zuvor aktivieren muss, dann immer her damit :)

    Gruss Veronesi