0

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

自动取款机我可以:

  • 从 Outlook 导入约会并在我的日历中显示
  • 在 Outlook 约会更新时更新我的​​约会
  • 在我的日历中创建约会时创建 Outlook 约会

我遇到的唯一问题是在我的约会更新/删除时更新/删除 Outlook 约会。

我有相应约会的 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)
}

我不断收到“条件无效”异常。显然 Outlook 不允许搜索二进制属性(例如 GlobalAppointmentID)。

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

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

4

3 回答 3

0

是的,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
于 2021-12-10T15:37:28.793 回答
0

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

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

于 2021-12-10T15:38:22.050 回答
0

进一步查看后我最终做了什么:我添加了一个文本 UserProperty,我将 GlobalAppointmentID("GAID") 放入其中。您可以过滤这些内容。它似乎可以解决问题。

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

        }
于 2021-12-13T09:15:20.497 回答