Outlook加载项 - 将数据存储和查找为隐藏的StorageItem

时间:2017-10-24 08:18:52

标签: c# outlook vsto outlook-addin outlook-vba

我想在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。

1 个答案:

答案 0 :(得分:2)

存储(也称为关联)项目只是来自MAPI视角的常规消息(如果单击IMAPIFolder按钮并转到“关联内容”选项卡,则可以在OutlookSpy中看到它们),它只是OOM决定以非常不同的方式揭露它们。 OOM中的存储项目实际上并不是为了搜索而设计的 - 我们的想法是您通过主题或消息类创建/打开您的私人项目,而不关心或触摸您不了解的其他存储项目。

我能想到的一个技巧是使用地址本身构建消息类(例如“IPM.Note.user@domain.demo”),并在打开存储项时指定该消息类。

如果您真的想要搜索相关的目录,扩展MAPI(C ++或Delphi)或Redemption可能是您唯一的选择。赎回以与公开常规项目相同的方式公开相关项目,即RDOFolderHiddentItems vs RDOFolderItems。然后,您可以使用RDOItems进行搜索。Find/FindNext/Restrict/MAPITable.ExecSQL