C# Outlook 加载项:如何以编程方式删除用户定义的 属性?
C# Outlook Add-in: How can I delete a User-defined property programmatically?
我几乎在所有我能想到的地方都尝试过寻找这个问题的答案,包括在 Whosebug 上。可惜无济于事。原来如此。
我正在开发 Outlook 加载项(使用 Outlook 2021),并开发了一些代码来创建一些专门用于该加载项的 ItemProperties。现在,创建这些属性后,我可以在转到“视图”->“设置”->“高级视图设置”->“列”时看到它们,如屏幕截图所示。
Screenshot of User-defined fields in Outlook
不过,在某些情况下,我想完全删除属性。如图所示,我知道如何手动执行此操作,但我无法找到如何通过 C# 以编程方式执行此操作。我已经做到了从每封包含那种 属性 的邮件中删除属性,如下所示:
IEnumerable<MailItem> listOfAssignedEmails = itemsToProcess.Where(
t => t.ItemProperties[MailExpiration.ExpirationDatePropertyName] != null);
foreach (MailItem email in listOfAssignedEmails)
{
// Note: The Delete() operation is deprecated. A more up-to-date method must be found.
email.ItemProperties[MailExpiration.ExpirationDatePropertyName].Delete();
email.Save();
}
... 是的,我知道 Delete() 操作已被弃用;但是,我找不到从电子邮件中删除项目属性的另一种方法(欢迎提出任何建议)。
基本上,很少会删除此 属性(例如,如果用户选择卸载加载项。但是,如果有任何方法可以删除 属性 =27=]自动,我很乐意知道。
如有任何建议,我们将不胜感激。
屏幕截图中显示的属性列表属于 Folder.UserDefinedProperties property which returns a UserDefinedProperties object that represents the user-defined custom properties for the Folder 对象。
使用 ItemProperties.Remove 方法从集合中(从项目中)移除一个对象。
使用ItemProperties属性到returnItemProperties
集合。使用 ItemProperties.Item(index)
,其中索引是对象的名称或项目在集合中的数字位置,return 单个 ItemProperty
对象。
从所有已有的电子邮件中删除自定义 属性 确实是个坏主意:这真的没有意义,因为用户永远不会看到它们,但您将不得不润饰(因此更改大量电子邮件的最后修改日期。
另请注意,MAPI 中的命名属性是一种有限资源 - 一个邮箱中最多可以有 64k。一旦使用了特定的 属性 映射,您将永远无法取消映射,即使没有使用该 属性.
的项目也是如此
第三,从安装程序(而不是 VSTO 插件)做任何与 Outlook 相关的事情都是一个非常糟糕的主意 - Windows 安装程序在服务中运行。
如果您想确保用户不再将您的自定义字段视为视图中的可用属性,您需要处理文件夹字段 - 它们存储在隐藏(关联)消息中的 blob 中文件夹。 OOM 根本不暴露文件夹字段(如果你在调用 UserProperties.Add
时不计算 AddToFolderFields
参数)。如果使用 Redemption is an option (I am its author), it exposed RDOFolderFields object (accessible from RDOFolder2.FolderFields
属性) 允许添加或删除文件夹字段。
我几乎在所有我能想到的地方都尝试过寻找这个问题的答案,包括在 Whosebug 上。可惜无济于事。原来如此。
我正在开发 Outlook 加载项(使用 Outlook 2021),并开发了一些代码来创建一些专门用于该加载项的 ItemProperties。现在,创建这些属性后,我可以在转到“视图”->“设置”->“高级视图设置”->“列”时看到它们,如屏幕截图所示。
Screenshot of User-defined fields in Outlook
不过,在某些情况下,我想完全删除属性。如图所示,我知道如何手动执行此操作,但我无法找到如何通过 C# 以编程方式执行此操作。我已经做到了从每封包含那种 属性 的邮件中删除属性,如下所示:
IEnumerable<MailItem> listOfAssignedEmails = itemsToProcess.Where(
t => t.ItemProperties[MailExpiration.ExpirationDatePropertyName] != null);
foreach (MailItem email in listOfAssignedEmails)
{
// Note: The Delete() operation is deprecated. A more up-to-date method must be found.
email.ItemProperties[MailExpiration.ExpirationDatePropertyName].Delete();
email.Save();
}
... 是的,我知道 Delete() 操作已被弃用;但是,我找不到从电子邮件中删除项目属性的另一种方法(欢迎提出任何建议)。
基本上,很少会删除此 属性(例如,如果用户选择卸载加载项。但是,如果有任何方法可以删除 属性 =27=]自动,我很乐意知道。
如有任何建议,我们将不胜感激。
屏幕截图中显示的属性列表属于 Folder.UserDefinedProperties property which returns a UserDefinedProperties object that represents the user-defined custom properties for the Folder 对象。
使用 ItemProperties.Remove 方法从集合中(从项目中)移除一个对象。
使用ItemProperties属性到returnItemProperties
集合。使用 ItemProperties.Item(index)
,其中索引是对象的名称或项目在集合中的数字位置,return 单个 ItemProperty
对象。
从所有已有的电子邮件中删除自定义 属性 确实是个坏主意:这真的没有意义,因为用户永远不会看到它们,但您将不得不润饰(因此更改大量电子邮件的最后修改日期。
另请注意,MAPI 中的命名属性是一种有限资源 - 一个邮箱中最多可以有 64k。一旦使用了特定的 属性 映射,您将永远无法取消映射,即使没有使用该 属性.
的项目也是如此第三,从安装程序(而不是 VSTO 插件)做任何与 Outlook 相关的事情都是一个非常糟糕的主意 - Windows 安装程序在服务中运行。
如果您想确保用户不再将您的自定义字段视为视图中的可用属性,您需要处理文件夹字段 - 它们存储在隐藏(关联)消息中的 blob 中文件夹。 OOM 根本不暴露文件夹字段(如果你在调用 UserProperties.Add
时不计算 AddToFolderFields
参数)。如果使用 Redemption is an option (I am its author), it exposed RDOFolderFields object (accessible from RDOFolder2.FolderFields
属性) 允许添加或删除文件夹字段。