如果附件本身是邮件,如何在 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 中以编程方式访问附件数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在outlook中查找邮件附件内容?

将 Outlook 电子邮件的所有附件转换为 PDF

如何解除 outlook 2016 附件大小的限制

通过 python 发送时附件不显示在 Outlook 中

仅保存 Outlook MailItem 的真实附件

如何使用预填充的附件打开 Outlook 新邮件窗口