使用 GlobalAppointmentID 获取 Outlook AppointmentItem

Get Outlook AppointmentItem using GlobalAppointmentID

我正在为我的公司开发与 Outlook 日历同步的日历。

大气压我可以:

我遇到的唯一问题是 updating/deleting Outlook 约会时我的约会 update/delete。

我有相应约会的 GlobalAppointmentID,但我似乎无法搜索该 ID。

我试过了:

using Microsoft.Office.Interop;

private void GetAppointment(string myGlobalAppointmentID)
{
Outlook.Application oApp = new Outlook.Application();

Outlook.NameSpace mapiNamespace = oApp.GetNamespace("MAPI");

Outlook.MAPIFolder calendarFolder = mapiNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
Outlook.Items outlookCalendarItems = calendarFolder.Items;

Outlook.AppointmentItem appointmentItem = (Outlook.AppointmentItem)outlookCalendarItems.Find("[GlobalAppointmentID] = '{0}'", myGlobalAppointmentID));

//update or delete appointmentItem here (which I know how to do)
}

我一直收到 'Condition is not valid' 异常。 显然 Outlook 不允许搜索二进制属性(例如 GlobalAppointmentID)。

我在其他情况下使用相同的 outlookCalendarItems.Find() 和 calendarFolder.Items.Restrict() 没有问题。

我尝试使用 Redemption,但我也无法使用它。 有没有人有经验或建议?

是的,OOM 不允许您搜索二进制属性(以及收件人或附件),但 Redemption(我是它的作者)应该可以。以下脚本 (VBA) 对我来说工作得很好:

  set Session = CreateObject("Redemption.RDOSession")
  Session.MAPIOBJECT = Application.Session.MAPIOBJECT
  set Folder = Session.GetDefaultFolder(olFolderCalendar)
  set appt = Folder.Items.Find("GlobalAppointmentID = '040000008200E00074C5B7101A82E00800000000D0FECEE58FEAD70100000000000000001000000041C887A3FA12694F8A0402FEFFAD0BBB'")
  MsgBox appt.Subject

Outlook 对象模型不支持使用 Items.Find/Items.FindNext 搜索二进制属性,例如 GlobalAppointmentId(任何其他 PT_BINARY 属性) /Items.Restrict.

唯一的解决方法是遍历 Calendar 文件夹中的所有项目(效率低下)或使用扩展 MAPI 进行搜索(或使用第三方包装程序,例如 Redemption。

经过进一步研究后我最终做了什么: 我在放置 GlobalAppointmentID("GAID") 的地方添加了文本 UserProperty。 你可以过滤那些。 它似乎可以解决问题。

private void AddGAIDIfNeeded(Outlook.AppointmentItem app)
        {
            bool GAIDexists = false;
            if (app.UserProperties.Count != 0)
            {
                foreach (UserProperty item in app.UserProperties)
                {
                    if (item.Name == "GAID")
                    {
                        GAIDexists = true;
                        break;
                    }
                }
            }

            if (GAIDexists == false)
            {
                app.UserProperties.Add("GAID", Outlook.OlUserPropertyType.olText);
                app.UserProperties["GAID"].Value = app.GlobalAppointmentID;
                app.Save();
            }
        }

并查找特定的 AppointmentItem:

private void DeleteOutlookAppointmentByGAID(string globalAppointmentID)
        {
            Outlook.Application oApp = new Outlook.Application();
            Outlook.NameSpace mapiNamespace = oApp.GetNamespace("MAPI");
            Outlook.MAPIFolder calendarFolder = mapiNamespace.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar);
            Outlook.Items outlookCalendarItems = calendarFolder.Items;

            try
            {
                Outlook.AppointmentItem appointmentItem = null;
                appointmentItem = outlookCalendarItems.Find(String.Format("[GAID] = '{0}'", globalAppointmentID));

                if (appointmentItem != null)
                {
                    appointmentItem.Delete();
                }
            }
            catch (Exception ex)
            {
                classExecptionLogging.LogErrorToFolder(ex);
            }

        }