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

时间:2016-08-24 09:30:04

标签: c# outlook outlook-addin

我有一个Outlook COM加载项(C#,Visual Studio 2012),它使用其他邮件属性扩展标准表单。该加载项适用于Outlook 2010,2013和2016。

理想情况下,我会将这些属性放在表单区域上,但由于属性需要位于命名空间PS_INTERNET_HEADERS中,并且表单区域无法实现。相反,我有一个自定义任务窗格,其中包含我所有属性的控件。为了与Outlook流保持同步以保存消息,我仍然有一个隐藏的表单区域,并在命名空间PS_PUBLIC_STRINGS中包含一个内部属性。每当自定义任务窗格中的某个属性发生更改时,我都会更改此内部属性的值。然后我监听MailItem.CustomPropertyChanged,当内部属性发生该事件时,我使用PropertyAccessor.SetProperties来设置命名空间PS_INTERNET_HEADERS中的属性;如果属性为空,我使用PropertyAccessor.DeleteProperties,因为存在具有空值或根本不存在的属性的语义差异。

除了这一切之外,我还会听Application.ItemSend,在那里我检查所有属性是否有有效值;如果没有,发送将被取消。

大部分时间都可以正常工作。但问题是它在Outlook 2016上针对特定方案失败了。场景是:

  • 创建消息,填写接收者,主题,正文并将其中一个PS_INTERNET_HEADERS属性控件设置为无效值。
  • 尝试发送;发送被Application.ItemSend取消,因为属性的值无效。
  • 删除无效值并发送消息。

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

我的解决方法是在对PropertyAccessor.SetProperties和PropertyAccessor.DeleteProperties的所有调用之后调用MailItem.Save。然而,这会创建一个草稿邮件项目,我想避免。

我能做什么的任何线索?

1 个答案:

答案 0 :(得分:0)

这解决了问题(省略了释放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;
    }