我想在Outlook中创建一个“本地数据库”,方法是以隐藏的形式存储一些辅助数据。
在调查对象模型之后,我找到了看起来很有希望的StorageItem对象。
我设法存储了一些行,并且还通过其独特的主题查找它们,但是,我无法遍历 StorageItem 。它在对象模型中说,没有可用于StorageItem对象的直接迭代器,但我可以从同一个文件夹中查询表,它将具有StorageItems。
该表最终将包含5个项目,并且它们都不像我存储的项目。
这是我目前用于插入带有一些自定义属性的StorageItems的代码:
public static void InsertStorageItem(String UniqueID, String Name, String Address)
{
Outlook.NameSpace ns = null;
Outlook.Folder tasksFolder = null;
ns = outlookApp.Session;
tasksFolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks) as Outlook.Folder;
Outlook.StorageItem OIEDBTask = tasksFolder.GetStorage(UniqueID, Microsoft.Office.Interop.Outlook.OlStorageIdentifierType.olIdentifyBySubject);
if (OIEDBTask.Size == 0)
{
OIEDBTask.UserProperties.Add("uniqueid", Microsoft.Office.Interop.Outlook.OlUserPropertyType.olText);
OIEDBTask.UserProperties.Add("name", Microsoft.Office.Interop.Outlook.OlUserPropertyType.olText);
OIEDBTask.UserProperties.Add("address", Microsoft.Office.Interop.Outlook.OlUserPropertyType.olText);
}
//assign values to custom properties
OIEDBTask.UserProperties["uniqueid"].Value = UniqueID;
OIEDBTask.UserProperties["name"].Value = Name;
OIEDBTask.UserProperties["address"].Value = Address;
OIEDBTask.Save();
}
以下是我想查询数据的方法:
public static dynamic QueryStorageItem()
{
List<dynamic> QueryResults = new List<dynamic>();
Outlook.NameSpace ns = null;
Outlook.Folder tasksFolder = null;
Outlook.Table ResultTable = null;
ns = outlookApp.Session;
tasksFolder = ns.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks) as Outlook.Folder;
String Filter = "[LastModificationTime] > '5/1/2005'"; //tried removing the filter, but it didn't help. the comparison date is very old, so it should always give back some data
ResultTable = tasksFolder.GetTable(Filter, Outlook.OlTableContents.olHiddenItems);
while(!ResultTable.EndOfTable) //tried a do-while structure also, didn't work.
{
Outlook.Row resultRow = ResultTable.GetNextRow();
QueryResults.Add(resultRow.GetValues()); //the GetValues() function will give me an array with 5 objects in it, that are very different than my StorageItems
}
return QueryResults;
}
使用StorageItems的设置属性的主要思想是使用Outlook提供的过滤:例如,尝试查找所有StorageItems,其中地址是一定的价值。 当然,我会写一个类似的过滤字符串:
String Filter = "[address] = 'certain value'";
这不起作用,在阅读了一点之后,我得出结论,它可能不起作用,因为它们是自定义UserProperties,并且过滤应该只适用于Outlook的内置属性项目,例如 LastModificationTime 和其他。
然而,即使没有过滤,我从 GetTable 函数返回的数据也没有用。 (所以我不能遍历行,它们不代表我插入的任何数据甚至结构)
有人可以指导一个更好的解决方案吗?
我的主要范围是,存储一些用户不可见的辅助数据。如果这不是解决方案,那么我将不得不创建任务而不是StorageItems。
答案 0 :(得分:2)
存储(也称为关联)项目只是来自MAPI视角的常规消息(如果单击IMAPIFolder按钮并转到“关联内容”选项卡,则可以在OutlookSpy中看到它们),它只是OOM决定以非常不同的方式揭露它们。 OOM中的存储项目实际上并不是为了搜索而设计的 - 我们的想法是您通过主题或消息类创建/打开您的私人项目,而不关心或触摸您不了解的其他存储项目。
我能想到的一个技巧是使用地址本身构建消息类(例如“IPM.Note.user@domain.demo”),并在打开存储项时指定该消息类。
如果您真的想要搜索相关的目录,扩展MAPI(C ++或Delphi)或Redemption可能是您唯一的选择。赎回以与公开常规项目相同的方式公开相关项目,即RDOFolder。HiddentItems
vs RDOFolder。Items
。然后,您可以使用RDOItems进行搜索。Find/FindNext/Restrict/MAPITable.ExecSQL
。