如果附件本身是邮件,如何在 Outlook 中以编程方式访问附件数据
Posted
技术标签:
【中文标题】如果附件本身是邮件,如何在 Outlook 中以编程方式访问附件数据【英文标题】:How to access attachment data programmatically in outlook if attachment is itself a mail 【发布时间】:2017-11-08 05:15:47 【问题描述】:我正在以编程方式尝试通过以下方式在 C# 中获取附件数据:--
Microsoft.Office.Interop.Outlook.Attachment attachment = objMail.Attachments[attachmentIndex];
if (attachment.DisplayName.Equals("Test"))
const string PR_ATTACH_DATA = "http://schemas.microsoft.com/mapi/proptag/0x37010102";
byte[] attachmentData = attachment.PropertyAccessor.GetProperty(PR_ATTACH_DATA);
如果附件是文本文件或图像文件,现在我的代码可以正常工作。但如果附件本身是邮件,则会抛出属性未知或找不到的异常。
请建议在哪些情况/附件类型中,此属性“http://schemas.microsoft.com/mapi/proptag/0x37010102”将不起作用,在这些情况下,在字节数组中获取附件数据的替代属性/方法是什么?
谢谢
【问题讨论】:
【参考方案1】:PR_ATTACH_DATA_BIN
仅适用于常规的按值附件 (PR_ATTACH_METHOD == ATTACH_BY_VALUE
)。嵌入式消息或 OLE 附件不公开该属性 - 它们使用必须使用 IAttach::OpenProperty(IID_IStorage, ...)
打开的 PR_ATTACH_DATA_OBJ
- 使用 OutlookSpy 查看现有消息(选择消息,单击 IMessage 按钮,转到 GetAttachmentTable 选项卡,双击附件)。
还请记住,PropertyAccessor.GetProperty
只能检索小附件的该属性。对于大型附件,PR_ATTACH_DATA_BIN
必须使用IAttach::OpenProperty(IID_IStorage, ...)
打开为IStream
- PropertyAccessor.GetProperty
不会这样做。您将需要使用扩展 MAPI(C++ 或 Delphi)或 Redemption(公开 RDOAttachment.AsArray
/ AsText
/ AsStream
属性。
【讨论】:
嗨,德米特里,感谢您的回复。您能否提供一些示例,如何从 C# 代码调用 IAttach::OpenProperty ?这对我有很大帮助。 你不能 - 正如我所提到的,扩展 MAPI 仅适用于 C++ 或 Delphi。【参考方案2】:Microsoft Graph Rest API 是大多数 Microsoft 数据(包括事件)、大多数办公产品(包括 Outlook)的单一端点和包装器。最重要的是,任何语言都可以向端点发出请求并检索信息。请参阅完整的文档HERE 以开始使用。
有关 Outlook 附件的简单 Get 请求,请参见下面的代码。请注意,还有其他更复杂的实现。文档:https://docs.microsoft.com/en-us/graph/api/attachment-get?view=graph-rest-1.0&tabs=http 滚动链接,您可以找到 C#、Java 和 javascript 示例,了解如何实现此功能。
GET /me/messages/id/attachments/id
GET /users/id | userPrincipalName/messages/id/attachments/id
GET /me/messages/id/attachments/id/$value
GET /users/id | userPrincipalName/messages/id/attachments/id/$value
【讨论】:
以上是关于如果附件本身是邮件,如何在 Outlook 中以编程方式访问附件数据的主要内容,如果未能解决你的问题,请参考以下文章