.net 如何使用C# VSTO加载项从Outlook中的OLE附件中提取原始文件数据?

6yoyoihd  于 2023-05-19  发布在  .NET
关注(0)|答案(2)|浏览(226)

我正在用C#开发Outlook的VSTO加载项,我需要从OLE附件中提取原始文件。用户将一个文件(如Word文档或Excel电子表格)作为OLE对象附加到电子邮件,我需要访问嵌入到OLE对象中的原始数据。
我尝试使用Attachment.PropertyAccessor检索附件数据,但出现“无效OLE结构化存储文件”错误。我还尝试使用OpenMcdf库来提取嵌入的对象数据,但我不确定如何将字节数组Map到原始文件。
是否有一种方法可以使用C#从Outlook中的OLE附件访问原始文件数据?在将原始数据转换为OLE对象之前,是否可以使用Outlook中的事件读取原始数据?任何帮助或指导将不胜感激。

c7rzv4ha

c7rzv4ha1#

不在Outlook对象模型中。在扩展MAPI中(C++或 Delphi ),可以将附件作为IStorage对象打开(IAttach::OpenProperty(PR_ATTACH_DATA_OBJ, IStorage, ...)),然后提取数据,但其格式取决于创建它所使用的OLE服务器-您可以在OutlookSpy中看到数据(我是它的作者)-选择消息,点击IMessage按钮,双击GetAttachmentTable选项卡上的附件,选择PR_ATTACH_DATA_OBJ属性,选择IMAPIProp::OpenProperty| IStorage)。
如果使用Redemption是一个选项(我也是它的作者),它的版本RDOAttachmentSaveAs处理最流行格式(Word、Excel、Power Point、PDF等)的OLE存储附件。

q9rjltbz

q9rjltbz2#

Outlook对象模型对可以使用PropertyAccessor对象读取的数据量应用限制。您需要使用Outlook所基于的低级API-扩展MAPI或围绕该API的任何其他第三方 Package 器,例如Redemption(如Dmitry已经提到的),以阅读附件的二进制数组(内容)。当PR_ATTACH_METHOD属性的值为ATTACH_EMBEDDED_MSGATTACH_OLE时,PR_ATTACH_DATA_OBJ属性保存附件。OLE编码类型可以从PR_ATTACH_TAG确定。
使用Outlook对象模型的最佳方法是使用Attachment.SaveAsFile方法将文件保存在磁盘上,然后将其读回。

相关问题