从Outlook(interop)中检索单个项目的最有效方法是什么?

4

我需要创建一个程序,将自己的任务对象与Outlook中的任务同步。在操作过程中,Outlook中的任务可能会被创建/更新/删除。

最直接的方法是遍历Outlook中的所有任务项,查找要更新的任务。大致如下:

ApplicationClass _app;
NameSpace _nameSpace;
MAPIFolder _folder;

_app = new ApplicationClass();
_nameSpace = _app.GetNamespace("MAPI");
_folder = _nameSpace.GetDefaultFolder(OlDefaultFolders.olFolderTasks);

Dictionary<int,MyTask> data = GetData();

for (int i = 1; i <= _folder.Items.Count; i++)
{
    TaskItem taskItem = (TaskItem)_folder.Items.Item(i);
    int itemID;
    if(ItemNeedsProcessing(taskItem, out itemID))
        UpdateItem(taskItem, data[itemID]);
}

但这可能会遍历数百个项目(取决于客户的Outlook任务历史记录),只为进行一两个更改。

或者,我可以跟踪任务的ItemID...

string itemID = "00000000873..."; //taken from property on object.
object o = _nameSpace.GetItemFromID(itemID); //ignore possible exceptions for now
TaskItem taskItem = (TaskItem)o;

... 并直接对其进行更新 (这在某种程度上使应用程序端的任务创建 / 删除变得更加复杂)。

直接检索任务项(GetItemFromID)是最有效的方法吗?或者我是否忽略了一些陷阱?

2个回答

4

Outlook 2007+新增了Folder.GetTable,相比于Folder.Items,它使用轻量级方法进行检索优化。使用Tables可以比Items迭代器快高达10倍

关于检索实际项目,Session.GetItemFromID 是检索项目的最快方法 - 特别是如果您将 Store.StoreID 作为第二个参数传递,这样 Outlook 就不必确定特定 EntryID 属于哪个 Store

const string PR_STORE_ENTRYID = "http://schemas.microsoft.com/mapi/proptag/0x0FFB0102";
Outlook.Table tasks = Application.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderTasks).GetTable();
tasks.Columns.Add(PR_STORE_ENTRYID); // optimal for GetItemFromID
while (!tasks.EndOfTable)
{
    Outlook.Row task = tasks.GetNextRow();
    Outlook.TaskItem item = Application.Session.GetItemFromID(task["EntryID"], task.BinaryToString(PR_STORE_ENTRYID)) as Outlook.TaskItem;
} 

关于最佳方法 - 如果你想要最小化同步执行时间,你应该在应用程序中跟踪任务 EntryID任务 StoreID。否则,检索所有任务的暴力方法也可以使用,但我建议使用Folder.GetTable()而不是使用Folder.Items

1
非常好的答案!我的限制是要兼容Outlook 2003及以上版本...所以我现在还不能使用GetTable方法。使用StoreID似乎是目前最好的方法。 - MoSlo

1

在 SliverNinja 的 回答 基础上,我的建议是使用 Outlook Redemption RDO 库。这是一个第三方商业工具,但它将允许您在 Outlook 2003(及以上版本)中使用 MAPITable


也不错,但我希望得到的是原生的东西,而不是涉及第三方库(并不是我反对第三方库)。 - MoSlo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接