从IMessage获取Outlook.MailItem

时间:2016-08-02 23:10:39

标签: c# outlook outlook-addin

我正在开发一个Outlook加载项(VSTO,C#),它需要能够从签名或加密的邮件中访问 smime.p7m 文件。我知道如何获得相关的IMessage,但我希望在C#中执行此操作,而无需实现太多许多COM包装器。这是我到目前为止所得到的:

我为IMAPISecureMessage写了一个C#包装器。它不长或复杂。我可以使用Outlook.MailItem并获取其MAPIOBJECT属性,该属性似乎只是基础IMessage。然后,我可以将IMessage投射到我的IMAPISecureMessage包装器上并在其上调用GetBaseMessage()。这一切似乎都有效。

问题是,这会返回IMessage。我需要从这个IMessage中提取附件(smime.p7m)。我希望通过在返回的MailItem周围包裹IMessage来做到这一点,但我找不到任何办法。我可以看到如何创建MailItemApplication.CreateItemItems.Add),但我无法设置现有MAPIOBJECT的{​​{1}}属性,而我看不到从现有MAPI对象(例如MailItem中的MailItem)创建IMessage的方法。

有没有办法创建所需的GetBaseMessage()?如果没有,有没有办法可以从MailItem中获取附件(smime.p7m),而无需实现一大堆COM接口或使用专有的第三方库(如Redemption)?

1 个答案:

答案 0 :(得分:1)

您当然可以创建IMessageIMAPITableIAttach接口定义并致电IMessage::GetAttachmentTable,然后IMAPITable::SetColumns / QueryRows(或{ {1}})要检索HrQueryAllRows,然后调用PR_ATTACH_NUM打开附件,然后IMessage::OpenAttach打开二进制数据IAttach.OpenProperty(PR_ATTACH_DATA_BIN, IID_IStream, ...)

您还可以尝试将邮件的邮件类更改为IStream,保存,完全释放(并祈祷Outlook不保留引用),然后使用{{1}将其作为常规MailItem打开}。

或者,正如您所提到的,您可以使用Redemption及其RDOEncryptedMessage对象。