【问题标题】:How to completely delete custom fields / user-defined properties for a folder?如何完全删除文件夹的自定义字段/用户定义属性?
【发布时间】:2021-09-02 18:27:06
【问题描述】:

要将Items.Sort 方法与自定义字段一起使用,我首先在一些邮件项中添加了一个新的UserProperty

Set oUserProp = oSentItem.UserProperties.Add("AAA", OlUserPropertyType.olText, AddToFolderFields:=False, _ 
DisplayFormat:=OlFormatText.olFormatTextText)
oUserProp .Value = "AAA"

由于我使用了AddToFolderFields:=False,然后我将相同的属性添加到已发送文件夹:

Set oUserDefinedProp = oNS.GetDefaultFolder(OlDefaultFolders.olFolderSentMail).UserDefinedProperties.Add( _
Name:="AAA", Type:=OlUserPropertyType.olText, DisplayFormat:=OlFormatText.olFormatTextText, Formula:="")

然后检索我使用的邮件:

oSentItems.Sort Property:="AAA", Descending:=False
Set oSentItem = oSentItems.GetLast

oSentItems.Sort Property:="[AAA]", Descending:=False
Set oSentItem = oSentItems.GetLast

我做了几次这个测试,使用“AAA”和“[AAA]”作为属性名称,我还在 Outlook UI 的已发送文件夹视图中直接添加了一个名为“AAA”的新列。

我删除了oSentFolder.UserDefinedPropertiesoSentFolder.UserDefinedProperties.Count = 0 中的UserDefinedProperty。但是,在 MFCMAPI 中,在 Sent Folder > Table > Set columns... > Property Tag Array 下,我无法摆脱相应的命名属性,这些属性显然在字符串命名空间(PS_PUBLIC_STRING 属性集)。我试图从 MFCMAPI 中删除它们,然后单击确定,但它们每次都会回来。

从 Outlook VBA 我尝试了以下,但找不到属性。

oSentFolder.PropertyAccessor.DeleteProperty "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/AAA"
oSentFolder.PropertyAccessor.DeleteProperty "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/[AAA]"
oSentFolder.PropertyAccessor.DeleteProperty "http://schemas.microsoft.com/mapi/proptag/0x8750001F"

oSentFolder.Items.ResetColumns

我不能使用 OutlookSpy,只能使用不需要安装的 MFCMAPI。

【问题讨论】:

    标签: vba outlook mapi


    【解决方案1】:

    即使您从文件夹字段中删除该属性(这样现在 Outlook 无法识别该属性名称),它仍可能在邮件中设置。

    即使你从所有设置了该属性的消息中删除该属性,存储仍然会记住该属性映射,因此如果创建具有相同 id/GUID 的属性,它将被映射到相同的 int 属性标记.

    【讨论】:

    • 好的,我认为没有办法删除这些映射?我猜的问题与这里相同:stackoverflow.com/questions/56935619/…
    • 仅出于我个人对 MAPI 在 Outlook 客户端和存储中的实现方式以及那些已删除的属性仍然如何显示的理解:MFCMAPI 仍然可以看到文件夹的列集下的属性,因为它们仍然由IMAPIProp::GetPropList 的实现返回不是吗? ——
    • 所以商店提供者使用其实现IMAPIProp::GetIDsFromNamesMAPI_CREATE标志自动将命名属性映射到proptag id,以“在名称到标识符映射表中内部注册标识符” ,对吗?
    • 好的,考虑到在我的情况下(法国-法国)它被命名为“Éléments envoyés”,您认为删除像 Sent 这样的整个文件夹是否安全?这不会混淆太多吗?
    • 我不建议删除任何默认文件夹 - 如果你不更新指向它的更新属性,你会遇到麻烦,例如PR_IPM_SENTMAIL_ENTRYID。
    【解决方案2】:

    为了回答 Dmitry 回答后的想法,我做了一些测试,实际上并不是使用 Folder.UserProperties.Add 方法添加属性来进行映射,而是使用该命名属性首次调用 .Sort 方法本身!

    但是,可以通过删除存储中的文件夹来清除该文件夹的映射表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-10
      • 1970-01-01
      • 2017-11-19
      相关资源
      最近更新 更多