2

我正在尝试查询 Exchenge 以获取已将提醒设置为当前时间的应用程序约会。
我创建了一个简单的方法,它返回一个将在最近的将来开始的约会:

    public Appointment getMyAppointments()
    {
        try
        {
            CalendarFolder cfolder = CalendarFolder.Bind(service, WellKnownFolderName.Calendar);
            CalendarView calendarView = new CalendarView(DateTime.Now, DateTime.Now.AddHours(1));every appointment in one hour
            calendarView.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.Subject, ItemSchema.Categories);
            FindItemsResults<Appointment> findResults = cfolder.FindAppointments(calendarView);

            List<Item> items = new List<Item>();

            if (findResults.Items.Count > 0) // Prevent the exception
            {
                items.AddRange(findResults.Cast<Item>());
            }
            else
            {
                return null;
            }
            service.LoadPropertiesForItems(items, new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.Subject, ItemSchema.Categories, ItemSchema.Body));
            return findResults.Items[0];
        }
        catch (Exception e)
        {
            return null;
        }
    }

这将返回我将在最近的将来开始并且在当前时间处于活动状态的前一个约会:

如果我计划从 14:00 开始并在 14:30 结束的约会,如果我在 13:01 开始,我的方法将返回该约会,但如果我在 14:22 开始,它也会返回该约会。

我想更改该方法,以便返回所有在当前时间之前设置提醒但未开始的会议:

因此,如果我计划在 15:00 约会并将提醒设置为 15 分钟,然后我在 14:45 调用我的方法,我将得到那个约会。

我的想法是让所有约会在 8 小时内完成,然后遍历它们并检查它们是否有IsReminderSet并检查Start-ReminderMinutesBeforeStart是否小于当前时间。

编辑 - 这是我的临时解决方案

    public OWAAppointment GetMyAppointments(int minutes)
    {
        try
        {
            CalendarFolder cfolder = CalendarFolder.Bind(service, WellKnownFolderName.Calendar);
            CalendarView calendarView = new CalendarView(DateTime.Now, DateTime.Now.AddHours(10));
            calendarView.PropertySet = new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.Subject, ItemSchema.Categories);
            FindItemsResults<Appointment> findResults = cfolder.FindAppointments(calendarView);

            List<Item> items = new List<Item>();

            if (findResults.Items.Count > 0)
            {
                items.AddRange(findResults.Cast<Item>());
            }
            else
            {
                return null;
            }

            service.LoadPropertiesForItems(items, new PropertySet(BasePropertySet.FirstClassProperties, ItemSchema.Subject, ItemSchema.Categories, ItemSchema.Body, ItemSchema.ReminderDueBy, ItemSchema.ReminderMinutesBeforeStart));


            var appointment = findResults.Items
            .Where(item => item.Start >= DateTime.Now)
            .FirstOrDefault(item => item.Start.AddMinutes(-1*minutes) < DateTime.Now);

            return appointment // this will return appointment or null
        }
        catch (Exception e)
        {
            return null;
        }
    }

但也许这可以通过 EWS 更轻松地完成?

4

1 回答 1

1

是的,这可以更容易地完成。Exchange 2013 中引入了 EWS 的 GetReminders 操作(不是 EWS 托管 API)。可以在此处找到信息:GetReminders 操作。要检索所有当前提醒,请将 ReminderType 设置为 All 并将 EndTime 设置为当前时间。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
           xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" 
           xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header>
    <t:RequestServerVersion Version="Exchange2013" />
  </soap:Header>
  <soap:Body>
   <m:GetReminders>
      <m:EndTime>2014-05-06T21:00:00Z</m:EndTime>
      <m:ReminderType>All</m:ReminderType>
    </m:GetReminders>
  </soap:Body>
</soap:Envelope>
于 2014-05-06T16:43:28.550 回答