将一个或多个邮件从Outlook拖放到C#WPF应用程序

问题描述:

我正在使用.Net 3.5 Sp1上的C#编写的WPF中编写的Windows客户端上,其中要求是客户端收到的电子邮件中的数据可以存储在数据库中。现在最简单的方法就是复制和粘贴文本,主题,联系信息和手动收到的时间使用关节炎诱导量的ctrl-c/ctrl-v。将一个或多个邮件从Outlook拖放到C#WPF应用程序

我认为一个简单的方法来处理这个问题将允许用户从Outlook中拖动一个或多个电子邮件(他们都使用Outlook 2007当前)到窗口中,允许我的应用程序提取必要的信息并发送它到后端系统进行存储。

然而,几个小时的谷歌搜索有关这方面的信息似乎表明,有关这个看似基本的任务的信息缺乏惊人的缺乏。我认为像这样的东西在许多不同的设置中会很有用,但到目前为止我所能找到的所有东西都是非解决方案的一半。

有没有人有任何建议如何做到这一点?由于我只是要阅读邮件,不要发送任何内容或做任何恶意的事情,对于不涉及被憎恨的安全弹出窗口的解决方案而言,这会很好,但任何事情都不可能完成。

基本上,如果我可以得到所有被选中的邮件列表,拖放到Outlook中,我将可以自己处理其他邮件!

谢谢!

符文

+0

符文你还在寻找答案吗? – cgreeno 2008-12-23 10:25:43

+0

嗨克里斯 - 是的,我在上个月刚刚完成了一个完全不同的项目。我会尽快跟进,只要我的头在水面之上。 – 2009-02-05 08:09:19

+0

不应该绑定到您的Exchange服务器,并以这种方式访问​​Outlook邮箱?为什么不考虑CDO对​​象?这使您可以从Exchange服务器获取消息收集。 http://msdn.microsoft.com/en-us/library/ms978698.aspx – D3vtr0n 2009-06-10 16:46:25

我发现一个很好的article应该做你需要的。

UPDATE

我能得到该文章中WPF工作稍加调整中的代码,下面是你需要做的改变。

变化从System.Windows.Forms.IDataObject所有引用System.Windows.IDataObject

在OutlookDataObject构造,改变

FieldInfo innerDataField = this.underlyingDataObject.GetType().GetField("innerData", BindingFlags.NonPublic | BindingFlags.Instance); 

FieldInfo innerDataField = this.underlyingDataObject.GetType().GetField("_innerData", BindingFlags.NonPublic | BindingFlags.Instance); 

更改所有DataFormats。 GetFormat调用DataFormats.GetDataFormat

public void SetData(string format, bool autoConvert, object data) 
{ 
    this.underlyingDataObject.SetData(format, autoConvert, data); 
} 

更改SetData的实施,

public void SetData(string format, object data, bool autoConvert) 
{ 
    this.underlyingDataObject.SetData(format, data, autoConvert); 
} 

这些变化,我能得到它的邮件保存到文件作为文章一样。对不起格式化,但编号/项目符号列表不适用于代码片段。

我觉得Shell Style Drag and Drop in .NET (WPF and WinForms)可以帮助你。一旦您可以使用COM接口对拖放进行响应,您应该能够从Outlook中获取数据。

在XAML中,你需要设置你的事件:

<TextBlock 
     Name="myTextBlock" 
     Text="Drag something into here" 
     AllowDrop="True" 
     DragDrop.Drop="myTextBlock_Drop" 
     /> 

一旦你已经设置的AllowDrop = True和设置你放弃那么事件去后面的代码,并建立您的活动:

private void myTextBlock_Drop(object sender, DragEventArgs e) 
{ 
     // Mark the event as handled, so TextBox's native Drop handler is not called. 
     e.Handled = true; 
     Stream sr; 

      //Explorer 
      if (e.Data.GetDataPresent(DataFormats.FileDrop, true)) 
       //Do somthing 

     //Email Message Subject 
     if (e.Data.GetDataPresent("FileGroupDescriptor")) 
     { 
      sr = e.Data.GetData("FileGroupDescriptor") as Stream; 
       StreamReader sr = new StreamReader(sr2);//new StreamReader(strPath, Encoding.Default); 
      //Message Subject 
        string strFullString = sr.ReadToEnd(); 
     } 


} 

如果你想打破它进一步下降,你可以使用: 文件描述符或FILECONTENTS作为轮廓在以下article

你OT她的选择是与展望MS Office Primary Interop Assemblies联系在一起,并以这种方式打破信息。

我发现了很多解决方案,建议您对所有文件名使用“FileGroupDescriptor”,并使用DragEventArgs对象上的“FileContents”来检索每个文件的数据。 “FileGroupDescriptor”适用于电子邮件名称,但“FileContents”返回null,因为.Net中的IDataObject实现无法处理由COM返回的IStorage对象。

David Ewen有一个很好的解释,优秀的样本和代码下载,在http://www.codeproject.com/KB/office/outlook_drag_drop_in_cs.aspx伟大的作品。

我假设你有一个在Outlook后面运行的Exchange服务器。

您可以执行的操作是从Exchange服务器检索邮件,并根据邮件的EntryIDStoreID将其位置存储在数据库中。这里有一个VB.Net片段:

Imports Microsoft.Office.Interop 

Public Class OutlookClientHandler 

Private _application As Outlook.Application 
Private _namespace As Outlook.NameSpace 

Public Sub New() 
    If Process.GetProcessesByName("outlook".ToLower).Length > 0 Then 
     _application = New Outlook.Application 
    Else 
     Dim startInfo As ProcessStartInfo = New ProcessStartInfo("outlook.exe") 
     startInfo.WindowStyle = ProcessWindowStyle.Minimized 
     Process.Start(startInfo) 

     _application = New Outlook.Application 
    End If 
End Sub 

' Retrieves the specified e-mail from Outlook/Exchange via the MAPI 
Public Function GetMailItem(ByVal entryID as String, ByVal storeID as String) As Outlook.MailItem 
    _namespace = _application.GetNamespace("MAPI") 
    Dim item As Outlook.MailItem 
    Try 
     item = _namespace.GetItemFromID(entryID, storeID) 
    Catch comex As COMException 
     item = Nothing ' Fugly, e-mail wasn't found! 
    End Try 

    Return item 
End Function 
End Class 

我猜你是舒适的使用MAPI,否则,你可以在这里读到:

http://msdn.microsoft.com/en-us/library/cc765775(v=office.12).aspx

从Outlook检索选定的电子邮件

Public Function GetSelectedItems() As List(Of Object) 
    Dim items As List(Of Object) = New List(Of Object) 

    For Each item As Object In _application.ActiveExplorer().Selection 
     items.Add(item) 
    Next 

    Return items 
End Function 

从Outlook中检索电子邮件后,您可以将它们推送到您的数据库中!保存他们的EntryIDStoreID(你可能想要保存父母的(文件夹的)EntryIDStoreID)。