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 属性) 允许添加或删除文件夹字段。