PropertyAccessor函数.DeleteProperties在Outlook 2016中不起作用

本文关键字:2016 不起作用 Outlook 函数 DeleteProperties PropertyAccessor | 更新日期: 2023-09-27 18:03:55

我有一个Outlook COM插件(c#, Visual Studio 2012),它通过额外的消息属性扩展了标准表单。该插件适用于Outlook 2010、2013和2016。

理想情况下,我会把这些属性放在一个表单区域,但作为属性需要在名称空间PS_INTERNET_HEADERS,这是不可能的表单区域。相反,我有一个自定义任务窗格,其中包含所有属性的控件。为了与保存消息的Outlook流同步,我仍然有一个表单区域,它是隐藏的,在命名空间PS_PUBLIC_STRINGS中包含一个内部属性。每当自定义任务窗格中的某个属性发生更改时,我就更改此内部属性的值。然后我收听MailItem。当内部属性发生该事件时,我使用PropertyAccessor。设置命名空间PS_INTERNET_HEADERS的属性;如果属性为空,则使用PropertyAccessor。DeleteProperties,因为属性为空值或根本不存在在语义上是有区别的。

除了这些,我还听Application。ItemSend,检查所有属性是否有有效值;如果没有,则取消发送。

这在大多数情况下都很有效。但问题是,对于一个特定的场景,它在Outlook 2016上失败了。场景如下:

  • 创建一个消息,填写收件人,主题,正文,并设置一个PS_INTERNET_HEADERS属性控件为无效值。
  • 试着发送;通过申请取消发送。ItemSend,因为属性有一个无效的值。
  • 删除无效值并发送消息

现在发送的项目仍然错误地具有无效值,它应该根本不存在,因为我调用了PropertyAccessor.DeleteProperties。在应用程序中进行调试。ItemSend处理程序我调用PropertyAccessor。GetProperties和属性实际上已经消失了!如果不删除属性,而是将属性设置为空字符串,它可以工作-但正如我所说的,这还不够。如果发送在应用程序中至少被取消一次,我只能触发此错误。ItemSend处理器。

我的解决方法是调用MailItem。在所有对PropertyAccessor的调用之后保存。设置属性和propertyaccessor . delete属性。然而,这会创建一个草稿邮件,这是我想避免的。

你知道我能做什么吗?

PropertyAccessor函数.DeleteProperties在Outlook 2016中不起作用

这样就解决了问题(省去了释放COM对象rdoMail的代码):

    private static void DeleteHeader(Redemption.RDOSession rdoSession, Outlook.MailItem mailItem, string name)
    {
        const int MapiPropertyTypeUnicodeString = 31;
        var rdoMail = (Redemption.RDOMail)rdoSession.GetRDOObjectFromOutlookObject(mailItem);
        var tag = rdoMail.GetIDsFromNames("{00020386-0000-0000-C000-000000000046}", name) | MapiPropertyTypeUnicodeString;
        rdoMail.Fields[tag] = null;
    }