【问题标题】:Drag and Drop to Outlook Message to Windows Form拖放到 Outlook 邮件到 Windows 窗体
【发布时间】:2018-09-07 20:44:51
【问题描述】:

我目前有一个 Windows 窗体应用程序,它接受来自其他应用程序的拖放文件。一切似乎都很顺利,直到我们发现如果我们将电子邮件附加到电子邮件中,事情就会变得很奇怪。

例如,用户可以直接从电子邮件中将附加的 jpg 或 pdf 文件拖到应用程序中。但是当电子邮件(.msg 文件)附加到电子邮件时,并且它是试图添加到程序中的附加电子邮件,那么会发生以下情况:以下代码能够正确读取所选附件的名称被拖入程序,但实际复制的文件是包含电子邮件的主要文件(包括所有附件)。

有什么方法可以拉出选中/拖动的消息?

谢谢!!

这是整个函数:

Public Shared Function HandleFileDrops(ByVal e As System.Windows.Forms.DragEventArgs) As String
    ' Based on and Borrowed from http://allandynes.com/2015/10/vb-net-drag-and-drop-from-outlook/
    Try
        If e.Data.GetDataPresent(DataFormats.FileDrop) Then
            ' We have a file so lets pass it to the calling form
            Dim Filename As String() = CType(e.Data.GetData(DataFormats.FileDrop), String())
            HandleFileDrops = Filename(0)
        ElseIf e.Data.GetDataPresent("FileGroupDescriptor") Then
            ' We have a embedded file. First lets try to get the file name out of memory
            Dim theStream As IO.Stream = CType(e.Data.GetData("FileGroupDescriptor"), IO.Stream)
            Dim fileGroupDescriptor(512) As Byte
            theStream.Read(fileGroupDescriptor, 0, 512)
            Dim fileName As System.Text.StringBuilder = New System.Text.StringBuilder("")
            Dim i As Integer = 76

            While Not (fileGroupDescriptor(i) = 0)
                fileName.Append(Convert.ToChar(fileGroupDescriptor(i)))
                System.Math.Min(System.Threading.Interlocked.Increment(i), i - 1)
            End While

            theStream.Close()
            ' We should have the file name or if its an email, the subject line. Create our temp file based on the temp path and this info
            Dim myTempFile As String = IO.Path.GetTempPath & fileName.ToString
            ' Look to see if this is a email message. If so save that temporarily and get the temp file.
            If InStr(myTempFile, ".msg") > 0 Then
                Dim objOL As New Microsoft.Office.Interop.Outlook.Application
                Dim objMI As Microsoft.Office.Interop.Outlook.MailItem
                If objOL.ActiveExplorer.Selection.Count > 1 Then
                    MsgBox("You can only drag and drop one item at a time into this screen. Only the first item you selected will be used.", MsgBoxStyle.OkOnly Or MsgBoxStyle.Information, "One Item At A Time")
                End If
                For Each objMI In objOL.ActiveExplorer.Selection()
                    objMI.SaveAs(myTempFile)
                    Exit For
                Next
                objOL = Nothing
                objMI = Nothing
            Else
                ' If its a attachment we need to pull the file itself out of memory
                Dim ms As IO.MemoryStream = CType(e.Data.GetData("FileContents", True), IO.MemoryStream)
                Dim FileBytes(CInt(ms.Length)) As Byte
                ' read the raw data into our variable
                ms.Position = 0
                ms.Read(FileBytes, 0, CInt(ms.Length))
                ms.Close()
                ' save the raw data into our temp file
                Dim fs As IO.FileStream = New IO.FileStream(myTempFile, IO.FileMode.OpenOrCreate, IO.FileAccess.Write)
                fs.Write(FileBytes, 0, FileBytes.Length)
                fs.Close()
            End If
            ' Make sure we have a actual file and also if we do make sure we erase it when done
            If IO.File.Exists(myTempFile) Then
                ' Assign the file name to the add dialog
                HandleFileDrops = myTempFile
            Else
                HandleFileDrops = String.Empty
            End If
        Else
            Throw New System.Exception("An exception has occurred.")
        End If
    Catch ex As Exception
        MsgBox("Could not copy file from memory. Please save the file to your hard drive first and then retry your drag and drop.", MsgBoxStyle.OkOnly Or MsgBoxStyle.Information, "Drag and Drop Failed")
        HandleFileDrops = String.Empty
    End Try

End Function

这是专门处理电子邮件的部分:

                Dim objOL As New Microsoft.Office.Interop.Outlook.Application
                Dim objMI As Microsoft.Office.Interop.Outlook.MailItem
                If objOL.ActiveExplorer.Selection.Count > 1 Then
                    MsgBox("You can only drag and drop one item at a time into this screen. Only the first item you selected will be used.", MsgBoxStyle.OkOnly Or MsgBoxStyle.Information, "One Item At A Time")
                End If
                For Each objMI In objOL.ActiveExplorer.Selection()
                    objMI.SaveAs(myTempFile)
                    Exit For
                Next
                objOL = Nothing
                objMI = Nothing

【问题讨论】:

    标签: vb.net outlook drag-and-drop


    【解决方案1】:

    在真正查看了我从网络上其他地方借来的代码之后,我现在确切地看到了它的作用。保存 Outlook 消息的代码部分创建当前 Outlook 对象的新实例,然后调用该对象以拉入其选定的项目,这恰好是主要的选定电子邮件 - 而不是被拖过的附加电子邮件。我可以添加几行代码来对电子邮件或附件名称进行一些比较,看看是什么。

    这现在可以很好地满足我的需求:

                    Dim objOL As New Microsoft.Office.Interop.Outlook.Application
                    Dim objMI As Microsoft.Office.Interop.Outlook.MailItem
                    If objOL.ActiveExplorer.Selection.Count > 1 Then
                        MsgBox("You can only drag and drop one item at a time into this screen. Only the first item you selected will be used.", MsgBoxStyle.OkOnly Or MsgBoxStyle.Information, "One Item At A Time")
                    End If
    
                    'If the message itself has the same name as fileName, then just save the selected MailObject
                    'Otherwise, iterate through all the attachments to the MailObject and save the one that hase that same name as the fileName
                    For Each objMI In objOL.ActiveExplorer.Selection()
                        If objMI.Subject = fileName.ToString() Then
                            objMI.SaveAs(myTempFile)
                        Else 
                            Dim objAttach As Microsoft.Office.Interop.Outlook.Attachments = objMI.Attachments
                            For Each attach As Microsoft.Office.Interop.Outlook.Attachment In objAttach
                                If attach.FileName = fileName.ToString() Then
                                    attach.SaveAsFile(myTempFile)
                                End If
                            Next
                        End If
    
                        Exit For
                    Next
                    objOL = Nothing
                    objMI = Nothing
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多