我正在尝试删除 Outlook 中的约会,我使用了我在该主题下找到的代码使用 GlobalAppointmentID 获取 Outlook AppointmentItem。简而言之,代码将自定义属性添加到约会的 UserProperties 集合中,并将 GlobalAppointmentID 作为文本存储在新属性中,稍后搜索该属性/值组合并对约会执行您需要的操作。当约会位于 Outlook 默认日历上时,该代码运行良好,但当约会位于用户创建的日历上时,我找不到该约会。
我收到以下错误:
这是查找和删除约会的伪代码:
MAPIFolder calendarFolder = GetCalendar(userCalendar); //find user created calendar
string filter = String.Format("[GAID] = '{0}'", globalAppointmentID);
Items calendarItems = calendarFolder.Items;
calendarItems.IncludeRecurrences = true;
try
{
Outlook.AppointmentItem appointmentItem = null;
appointmentItem = calendarItems.Find(filter);
if (appointmentItem != null)
{
appointmentItem.Delete();
}
}
catch (System.Exception ex)
{
throw;
}
我知道该属性在那里,因为我能够循环遍历 userProperties 集合并查看其名称和值
foreach (AppointmentItem item in calendarItems)
{
for (int i = 1; i <= item.UserProperties.Count; i++)
{
Console.WriteLine(item.UserProperties[i].Name);
Console.WriteLine(item.UserProperties[i].Value);
}
}
这似乎对我有用,但事实并非如此,我错过了什么?
谢谢你
仅当您的属性添加到文件夹字段时,Outlook 才会通过名称 (
GAID
) 识别您的属性。如果您使用 UserProperties.Add
参数 == true 调用 AddToFolderFields
,就会出现这种情况。
如果约会被移至其他文件夹,Outlook 将不知道该属性名称的含义。您可以使用 DASL 属性名称和
"@SQL="
查询前缀来解决该问题。要找出任何 MAPI 属性的 DASL 名称,请使用 OutlookSpy 查看它(我是其作者) - 选择具有问题集中属性的约会,单击 OutlookSpy 功能区上的 IMessage 按钮,选择属性,查看在“DASL”编辑框中。如果使用 UserProperties.Add
添加属性,DASL 名称将为 "http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/GAID/0x0000001F"
string filter = String.Format("@SQL=""http://schemas.microsoft.com/mapi/string/{00020329-0000-0000-C000-000000000046}/GAID/0x0000001F"" = '{0}'", globalAppointmentID);
请注意,您需要设置自定义用户属性的唯一原因是 Outlook 对象模型不允许搜索二进制 (
PT_BINARY
) MAPI 属性,例如 GlobalAppointmentID
。如果可以选择使用Redemption(我也是它的作者),您可以使用如下代码:
RDOSession session = new Redemption.RDOSession;
session.MAPIOBJECT = Application.Session.MAPIOBJECT;
RDOFolder folder = session.GetFolderFromID(calendarFolder.EntryID);
string filter = string.Format("GlobalAppointmentID = '{0}'", globalAppointmentID);
RDOAppointmentItem appointmentItem = folder.Items.Find(filter);
if (appointmentItem != null)
{
appointmentItem .Delete();
}