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) 是最有效的方法吗?还是我错过了一些陷阱?

4

2 回答 2

4

添加了 Outlook 2007+ Folder.GetTable,与Folder.Items. 使用Tables 可以比使用Items迭代器快 10 倍。

至于检索实际项目,Session.GetItemFromID是检索项目的最快方法 - 特别是如果您将Store.StoreID作为辅助参数传递,因此 Outlook 不必确定特定的存储属于哪个存储。EntryID

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;
} 

至于最佳方法 -如果您想最小化同步执行时间,您应该在应用程序中跟踪Task EntryIDTask StoreID 。否则,检索所有任务的蛮力方法将起作用,但我建议使用Folder.GetTable()而不是使用Folder.Items.

于 2012-06-13T13:41:38.477 回答
1

基于 SliverNinja 的回答,我的建议是使用 Outlook Redemption RDO Library。它是一个第三方商业工具,但它允许您MAPITable在 Outlook 2003(及更高版本)中使用。

于 2012-06-13T18:33:54.233 回答