我正在用C#开发Outlook的VSTO加载项,我需要从OLE附件中提取原始文件。用户将一个文件(如Word文档或Excel电子表格)作为OLE对象附加到电子邮件,我需要访问嵌入到OLE对象中的原始数据。
我尝试使用Attachment.PropertyAccessor检索附件数据,但出现“无效OLE结构化存储文件”错误。我还尝试使用OpenMcdf库来提取嵌入的对象数据,但我不确定如何将字节数组Map到原始文件。
是否有一种方法可以使用C#从Outlook中的OLE附件访问原始文件数据?在将原始数据转换为OLE对象之前,是否可以使用Outlook中的事件读取原始数据?任何帮助或指导将不胜感激。
2条答案
按热度按时间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是一个选项(我也是它的作者),它的版本RDOAttachment。
SaveAs
处理最流行格式(Word、Excel、Power Point、PDF等)的OLE存储附件。q9rjltbz2#
Outlook对象模型对可以使用
PropertyAccessor
对象读取的数据量应用限制。您需要使用Outlook所基于的低级API-扩展MAPI或围绕该API的任何其他第三方 Package 器,例如Redemption(如Dmitry已经提到的),以阅读附件的二进制数组(内容)。当PR_ATTACH_METHOD
属性的值为ATTACH_EMBEDDED_MSG
或ATTACH_OLE
时,PR_ATTACH_DATA_OBJ
属性保存附件。OLE编码类型可以从PR_ATTACH_TAG
确定。使用Outlook对象模型的最佳方法是使用Attachment.SaveAsFile方法将文件保存在磁盘上,然后将其读回。