我需要为每个使用过的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<,>
中使用。
答案 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_ID
和PR_TRANSPORT_MESSAGE_HEADERS
)中的邮件ID。但它们没有设置在新创建的项目上。从SMTP服务器或通过SMTP连接器收到的邮件中提供了这些属性。