我正在开发一个Outlook加载项(VSTO,C#),它需要能够从签名或加密的邮件中访问 smime.p7m 文件。我知道如何获得相关的IMessage
,但我希望在C#中执行此操作,而无需实现太多许多COM包装器。这是我到目前为止所得到的:
我为IMAPISecureMessage
写了一个C#包装器。它不长或复杂。我可以使用Outlook.MailItem
并获取其MAPIOBJECT
属性,该属性似乎只是基础IMessage
。然后,我可以将IMessage
投射到我的IMAPISecureMessage
包装器上并在其上调用GetBaseMessage()
。这一切似乎都有效。
问题是,这会返回IMessage
。我需要从这个IMessage
中提取附件(smime.p7m)。我希望通过在返回的MailItem
周围包裹IMessage
来做到这一点,但我找不到任何办法。我可以看到如何创建MailItem
(Application.CreateItem
或Items.Add
),但我无法设置现有MAPIOBJECT
的{{1}}属性,而我看不到从现有MAPI对象(例如MailItem
中的MailItem
)创建IMessage
的方法。
有没有办法创建所需的GetBaseMessage()
?如果没有,有没有办法可以从MailItem
中获取附件(smime.p7m),而无需实现一大堆COM接口或使用专有的第三方库(如Redemption)?
答案 0 :(得分:1)
您当然可以创建IMessage
,IMAPITable
,IAttach
接口定义并致电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对象。