将一个或多个邮件从Outlook拖放到C#WPF应用程序
我正在使用.Net 3.5 Sp1上的C#编写的WPF中编写的Windows客户端上,其中要求是客户端收到的电子邮件中的数据可以存储在数据库中。现在最简单的方法就是复制和粘贴文本,主题,联系信息和手动收到的时间使用关节炎诱导量的ctrl-c/ctrl-v。将一个或多个邮件从Outlook拖放到C#WPF应用程序
我认为一个简单的方法来处理这个问题将允许用户从Outlook中拖动一个或多个电子邮件(他们都使用Outlook 2007当前)到窗口中,允许我的应用程序提取必要的信息并发送它到后端系统进行存储。
然而,几个小时的谷歌搜索有关这方面的信息似乎表明,有关这个看似基本的任务的信息缺乏惊人的缺乏。我认为像这样的东西在许多不同的设置中会很有用,但到目前为止我所能找到的所有东西都是非解决方案的一半。
有没有人有任何建议如何做到这一点?由于我只是要阅读邮件,不要发送任何内容或做任何恶意的事情,对于不涉及被憎恨的安全弹出窗口的解决方案而言,这会很好,但任何事情都不可能完成。
基本上,如果我可以得到所有被选中的邮件列表,拖放到Outlook中,我将可以自己处理其他邮件!
谢谢!
符文
我发现一个很好的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服务器检索邮件,并根据邮件的EntryID
和StoreID
将其位置存储在数据库中。这里有一个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中检索电子邮件后,您可以将它们推送到您的数据库中!保存他们的EntryID
和StoreID
(你可能想要保存父母的(文件夹的)EntryID
和StoreID
)。
符文你还在寻找答案吗? – cgreeno 2008-12-23 10:25:43
嗨克里斯 - 是的,我在上个月刚刚完成了一个完全不同的项目。我会尽快跟进,只要我的头在水面之上。 – 2009-02-05 08:09:19
不应该绑定到您的Exchange服务器,并以这种方式访问Outlook邮箱?为什么不考虑CDO对象?这使您可以从Exchange服务器获取消息收集。 http://msdn.microsoft.com/en-us/library/ms978698.aspx – D3vtr0n 2009-06-10 16:46:25