我有一个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上针对特定方案失败了。场景是:
现在发送的项目仍然错误地具有无效值,它根本不存在,因为我调用了PropertyAccessor.DeleteProperties。对于调试,在Application.ItemSend处理程序中,我调用PropertyAccessor.GetProperties,该属性实际上已经消失了!如果不是删除属性,我将属性设置为空字符串,它可以工作 - 但正如我所说,这还不够。如果在Application.ItemSend处理程序中至少取消一次发送,我只能激发此错误。
我的解决方法是在对PropertyAccessor.SetProperties和PropertyAccessor.DeleteProperties的所有调用之后调用MailItem.Save。然而,这会创建一个草稿邮件项目,我想避免。
我能做什么的任何线索?
答案 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;
}