我正在使用带有C#的.Net 3.5 Sp1编写的WPF编写的Windows客户端,其中要求客户端收到的电子邮件中的数据可以存储在数据库中.现在,处理此问题的最简单方法是使用诱导关节炎的量ctrl-c/ctrl-v复制并粘贴手动接收的文本,主题,联系信息和时间.
我认为处理这种情况的一种简单方法是允许用户将一个或多个电子邮件从Outlook(它们都使用当前的Outlook 2007)拖到窗口中,允许我的应用程序提取必要的信息并将其发送到后端存储系统.
然而,几个小时的谷歌搜索信息似乎表明这个看似基本的任务令人震惊的缺乏信息.我认为这样的东西在许多不同的设置中会有用,但到目前为止我能找到的所有东西都是半生不熟的非解决方案.
有没有人对如何做到这一点有任何建议?因为我只是要阅读邮件而不是发送任何内容或做任何有害的事情,所以对于一个不涉及讨厌的安全弹出窗口的解决方案来说会很好,但是任何事情都无法完成.
基本上,如果我可以获得所有选中的邮件列表,从Outlook中拖放,我将能够自己处理其余的邮件!
谢谢!
符文
我找到了一篇很棒的文章,应该完全符合你的需要.
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
从中更改SetData实现
public void SetData(string format, bool autoConvert, object data) { this.underlyingDataObject.SetData(format, autoConvert, data); }
至
public void SetData(string format, object data, bool autoConvert) { this.underlyingDataObject.SetData(format, data, autoConvert); }
通过这些更改,我能够像文章那样将消息保存到文件中.很抱歉格式化,但编号/项目符号列表不适用于代码段.
我发现很多解决方案建议您对所有文件名使用"FileGroupDescriptor",并在DragEventArgs对象上使用"FileContents"来检索每个文件的数据."FileGroupDescriptor"适用于电子邮件消息名称,但"FileContents"返回null,因为.Net中IDataObject的实现无法处理COM返回的IStorage对象.
David Ewen在http://www.codeproject.com/KB/office/outlook_drag_drop_in_cs.aspx上有很好的解释,优秀的示例和代码下载.