唯一标识Mailitem

时间:2017-07-28 06:29:26

标签: outlook vsto

我需要为每个使用过的MailItem存储一个模型。为此,我写了以下方法

    private readonly static Dictionary<string, PermitCustomPaneViewmodel> ViewmodelLookup = new Dictionary<string, PermitCustomPaneViewmodel>();

    public static PermitCustomPaneViewmodel CreateOrGet(MailItem c)
    {
        if (c.EntryID == null)
            c.Save();
        if (!ViewmodelLookup.ContainsKey(c.EntryID))
        {
            var vm = new PermitCustomPaneViewmodel(c);
            c.Unload += () => ViewmodelLookup.Remove(c.EntryID);
            ViewmodelLookup.Add(c.EntryID, vm);
        }
        return ViewmodelLookup[c.EntryID];
    }

当模型已经存在时,我查找并返回它。如果它没有创建,我创建它并在卸载MailItem后删除该条目。

但是我观察到MailItem对象不会一直无效,直到调用unload。为了可靠地识别我使用EntryID的MailItem。现在的问题是,仅在保存项目时才有效。

所以目前我保存了项目,如果没有找到EntryID。但是这会自动将项目保存在草稿中。

有没有办法将MailItem以某种方式保存,以便可以在Dictionary<,>中使用。

1 个答案:

答案 0 :(得分:1)

新创建的项目不具有EntryID属性集。获取商店提供商分配的ID,您必须保存它。如果需要标识新的MailItem对象,可以考虑使用UserProperties.Add方法在项目中添加用户属性,该方法在UserProperties集合中创建新的用户属性。例如:

Sub AddUserProperty() 
 Dim myItem As Outlook.ContactItem 
 Dim myUserProperty As Outlook.UserProperty 

 Set myItem = Application.CreateItem(olContactItem) 
 Set myUserProperty = myItem.UserProperties _ 
 .Add("LastDateSpokenWith", olDateTime) 
 myItem.Display 
End Sub

请注意,当项目移动到另一个商店(例如,从收件箱到Microsoft Exchange Server公用文件夹)或从一个个人文件夹(.pst)文件移动到另一个.pst文件时,条目ID会更改。解决方案不应该依赖于EntryID属性是唯一的,除非不移动项目。基本上只要邮件保留在其父文件夹中它就可以正常工作,或者如果将Outlook项目移动到其他文件夹(取决于商店提供商),它可能会被更改。

您还可以考虑使用邮件MIME标头(PR_INTERNET_MESSAGE_IDPR_TRANSPORT_MESSAGE_HEADERS)中的邮件ID。但它们没有设置在新创建的项目上。从SMTP服务器或通过SMTP连接器收到的邮件中提供了这些属性。