在 Exchange 中使用 EWS 获取忙/闲信息
了解如何使用 Exchange 中的 EWS 托管 API 或 EWS 获取忙/闲信息和建议的会议时间。
使用 EWS 托管 API 或 EWS 以编程方式 创建会议 并发送会议请求非常出色,但找到适用于所有与会者的时间通常是一项挑战。 如果你必须手动检查每个人何时都可用,则它违背了自动执行任务的目的。 幸运的是, ExchangeService.GetUserAvailability EWS 托管 API 方法和 GetUserAvailability EWS 操作得到了你的帮助。 可以使用此方法或操作来查询 Exchange 服务器,以找到安排会议的最佳时间,或者仅获取与会者的忙/闲信息。 您可以获取与会者列表的忙/闲信息,或者让 Exchange 服务器为你找到会议时间,或同时查找两者
图 1 说明了问题和解决方案。
图 1. 从 Exchange 服务器请求可用性信息
使用 EWS 托管 API 获取建议的会议时间和忙/闲信息
在 ExchangeService.GetUserAvailability 方法调用中使用 FreeBusyAndSuggestions 的 AvailabilityData 枚举值时,可以同时获取与会者的建议会议时间和所有计划事件时间的列表,如以下示例所示。
此示例假定已对 Exchange 服务器进行了身份验证,并且已获取名为 service 的 ExchangeService 对象。
private static void GetSuggestedMeetingTimesAndFreeBusyInfo(ExchangeService service)
{
// Create a collection of attendees.
List<AttendeeInfo> attendees = new List<AttendeeInfo>();
attendees.Add(new AttendeeInfo()
{
SmtpAddress = "mack@contoso.com",
AttendeeType = MeetingAttendeeType.Organizer
});
attendees.Add(new AttendeeInfo()
{
SmtpAddress = "sadie@contoso.com",
AttendeeType = MeetingAttendeeType.Required
});
// Specify options to request free/busy information and suggested meeting times.
AvailabilityOptions availabilityOptions = new AvailabilityOptions();
availabilityOptions.GoodSuggestionThreshold = 49;
availabilityOptions.MaximumNonWorkHoursSuggestionsPerDay = 0;
availabilityOptions.MaximumSuggestionsPerDay = 2;
// Note that 60 minutes is the default value for MeetingDuration, but setting it explicitly for demonstration purposes.
availabilityOptions.MeetingDuration = 60;
availabilityOptions.MinimumSuggestionQuality = SuggestionQuality.Good;
availabilityOptions.DetailedSuggestionsWindow = new TimeWindow(DateTime.Now.AddDays(1), DateTime.Now.AddDays(2));
availabilityOptions.RequestedFreeBusyView = FreeBusyViewType.FreeBusy;
// Return free/busy information and a set of suggested meeting times.
// This method results in a GetUserAvailabilityRequest call to EWS.
GetUserAvailabilityResults results = service.GetUserAvailability(attendees,
availabilityOptions.DetailedSuggestionsWindow,
AvailabilityData.FreeBusyAndSuggestions,
availabilityOptions);
// Display suggested meeting times.
Console.WriteLine("Availability for {0} and {1}", attendees[0].SmtpAddress, attendees[1].SmtpAddress);
Console.WriteLine();
foreach (Suggestion suggestion in results.Suggestions)
{
Console.WriteLine("Suggested date: {0}\n", suggestion.Date.ToShortDateString());
Console.WriteLine("Suggested meeting times:\n");
foreach (TimeSuggestion timeSuggestion in suggestion.TimeSuggestions)
{
Console.WriteLine("\t{0} - {1}\n",
timeSuggestion.MeetingTime.ToShortTimeString(),
timeSuggestion.MeetingTime.Add(TimeSpan.FromMinutes(availabilityOptions.MeetingDuration)).ToShortTimeString());
}
}
int i = 0;
// Display free/busy times.
foreach (AttendeeAvailability availability in results.AttendeesAvailability)
{
Console.WriteLine("Availability information for {0}:\n", attendees[i].SmtpAddress);
foreach (CalendarEvent calEvent in availability.CalendarEvents)
{
Console.WriteLine("\tBusy from {0} to {1} \n", calEvent.StartTime.ToString(), calEvent.EndTime.ToString());
}
i++;
}
}
使用 EWS 获取建议的会议时间和忙/闲信息
可以使用 GetUserAvailability 操作获取与会者的建议会议时间列表和所有计划的活动时间,如以下示例所示。 这也是使用 EWS 托管 API 获取建议的会议时间时 EWS 托管 API 发送的 XML 请求。
<?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="https://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2010" />
<t:TimeZoneContext>
<t:TimeZoneDefinition Name="(UTC-08:00) Pacific Time (US &amp; Canada)" Id="Pacific Standard Time">
<t:Periods>
<t:Period Bias="P0DT8H0M0.0S" Name="Standard" Id="Std" />
<t:Period Bias="P0DT7H0M0.0S" Name="Daylight" Id="Dlt/1" />
<t:Period Bias="P0DT7H0M0.0S" Name="Daylight" Id="Dlt/2007" />
</t:Periods>
<t:TransitionsGroups>
<t:TransitionsGroup Id="0">
<t:RecurringDayTransition>
<t:To Kind="Period">Dlt/1</t:To>
<t:TimeOffset>P0DT2H0M0.0S</t:TimeOffset>
<t:Month>4</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>1</t:Occurrence>
</t:RecurringDayTransition>
<t:RecurringDayTransition>
<t:To Kind="Period">Std</t:To>
<t:TimeOffset>P0DT2H0M0.0S</t:TimeOffset>
<t:Month>10</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>-1</t:Occurrence>
</t:RecurringDayTransition>
</t:TransitionsGroup>
<t:TransitionsGroup Id="1">
<t:RecurringDayTransition>
<t:To Kind="Period">Dlt/2007</t:To>
<t:TimeOffset>P0DT2H0M0.0S</t:TimeOffset>
<t:Month>3</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>2</t:Occurrence>
</t:RecurringDayTransition>
<t:RecurringDayTransition>
<t:To Kind="Period">Std</t:To>
<t:TimeOffset>P0DT2H0M0.0S</t:TimeOffset>
<t:Month>11</t:Month>
<t:DayOfWeek>Sunday</t:DayOfWeek>
<t:Occurrence>1</t:Occurrence>
</t:RecurringDayTransition>
</t:TransitionsGroup>
</t:TransitionsGroups>
<t:Transitions>
<t:Transition>
<t:To Kind="Group">0</t:To>
</t:Transition>
<t:AbsoluteDateTransition>
<t:To Kind="Group">1</t:To>
<t:DateTime>2007-01-01T08:00:00.000Z</t:DateTime>
</t:AbsoluteDateTransition>
</t:Transitions>
</t:TimeZoneDefinition>
</t:TimeZoneContext>
</soap:Header>
<soap:Body>
<m:GetUserAvailabilityRequest>
<m:MailboxDataArray>
<t:MailboxData>
<t:Email>
<t:Address>mack@contoso.com</t:Address>
</t:Email>
<t:AttendeeType>Organizer</t:AttendeeType>
<t:ExcludeConflicts>false</t:ExcludeConflicts>
</t:MailboxData>
<t:MailboxData>
<t:Email>
<t:Address>sadie@contoso.com</t:Address>
</t:Email>
<t:AttendeeType>Required</t:AttendeeType>
<t:ExcludeConflicts>false</t:ExcludeConflicts>
</t:MailboxData>
</m:MailboxDataArray>
<t:FreeBusyViewOptions>
<t:TimeWindow>
<t:StartTime>2014-02-13T00:00:00</t:StartTime>
<t:EndTime>2014-02-14T00:00:00</t:EndTime>
</t:TimeWindow>
<t:MergedFreeBusyIntervalInMinutes>30</t:MergedFreeBusyIntervalInMinutes>
<t:RequestedView>FreeBusy</t:RequestedView>
</t:FreeBusyViewOptions>
<t:SuggestionsViewOptions>
<t:GoodThreshold>49</t:GoodThreshold>
<t:MaximumResultsByDay>2</t:MaximumResultsByDay>
<t:MaximumNonWorkHourResultsByDay>0</t:MaximumNonWorkHourResultsByDay>
<t:MeetingDurationInMinutes>60</t:MeetingDurationInMinutes>
<t:MinimumSuggestionQuality>Good</t:MinimumSuggestionQuality>
<t:DetailedSuggestionsWindow>
<t:StartTime>2014-02-13T00:00:00</t:StartTime>
<t:EndTime>2014-02-14T00:00:00</t:EndTime>
</t:DetailedSuggestionsWindow>
</t:SuggestionsViewOptions>
</m:GetUserAvailabilityRequest>
</soap:Body>
</soap:Envelope>
服务器使用 GetUserAvailability 响应消息响应 GetUserAvailability 请求,如以下示例所示。
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="https://schemas.xmlsoap.org/soap/envelope/">
<s:Header>
<h:ServerVersionInfo MajorVersion="15" MinorVersion="0" MajorBuildNumber="873" MinorBuildNumber="9" Version="V2_9"
xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetUserAvailabilityResponse xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">
<FreeBusyResponseArray>
<FreeBusyResponse>
<ResponseMessage ResponseClass="Success">
<ResponseCode>NoError</ResponseCode>
</ResponseMessage>
<FreeBusyView>
<FreeBusyViewType xmlns="http://schemas.microsoft.com/exchange/services/2006/types">FreeBusy</FreeBusyViewType>
<CalendarEventArray xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
<CalendarEvent>
<StartTime>2014-02-13T08:00:00</StartTime>
<EndTime>2014-02-13T10:00:00</EndTime>
<BusyType>Free</BusyType>
</CalendarEvent>
<CalendarEvent>
<StartTime>2014-02-13T11:00:00</StartTime>
<EndTime>2014-02-13T12:00:00</EndTime>
<BusyType>Busy</BusyType>
</CalendarEvent>
</CalendarEventArray>
<WorkingHours xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
<TimeZone>
<Bias>480</Bias>
<StandardTime>
<Bias>0</Bias>
<Time>02:00:00</Time>
<DayOrder>1</DayOrder>
<Month>11</Month>
<DayOfWeek>Sunday</DayOfWeek>
</StandardTime>
<DaylightTime>
<Bias>-60</Bias>
<Time>02:00:00</Time>
<DayOrder>2</DayOrder>
<Month>3</Month>
<DayOfWeek>Sunday</DayOfWeek>
</DaylightTime>
</TimeZone>
<WorkingPeriodArray>
<WorkingPeriod>
<DayOfWeek>Monday Tuesday Wednesday Thursday Friday</DayOfWeek>
<StartTimeInMinutes>480</StartTimeInMinutes>
<EndTimeInMinutes>1020</EndTimeInMinutes>
</WorkingPeriod>
</WorkingPeriodArray>
</WorkingHours>
</FreeBusyView>
</FreeBusyResponse>
<FreeBusyResponse>
<ResponseMessage ResponseClass="Success">
<ResponseCode>NoError</ResponseCode>
</ResponseMessage>
<FreeBusyView>
<FreeBusyViewType xmlns="http://schemas.microsoft.com/exchange/services/2006/types">FreeBusy</FreeBusyViewType>
<CalendarEventArray xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
<CalendarEvent>
<StartTime>2014-02-12T00:00:00</StartTime>
<EndTime>2014-02-13T00:00:00</EndTime>
<BusyType>Free</BusyType>
</CalendarEvent>
<CalendarEvent>
<StartTime>2014-02-13T08:00:00</StartTime>
<EndTime>2014-02-13T10:00:00</EndTime>
<BusyType>Free</BusyType>
</CalendarEvent>
<CalendarEvent>
<StartTime>2014-02-13T11:00:00</StartTime>
<EndTime>2014-02-13T12:00:00</EndTime>
<BusyType>Busy</BusyType>
</CalendarEvent>
<CalendarEvent>
<StartTime>2014-02-13T15:00:00</StartTime>
<EndTime>2014-02-13T16:00:00</EndTime>
<BusyType>Tentative</BusyType>
</CalendarEvent>
</CalendarEventArray>
<WorkingHours xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
<TimeZone>
<Bias>480</Bias>
<StandardTime>
<Bias>0</Bias>
<Time>02:00:00</Time>
<DayOrder>1</DayOrder>
<Month>11</Month>
<DayOfWeek>Sunday</DayOfWeek>
</StandardTime>
<DaylightTime>
<Bias>-60</Bias>
<Time>02:00:00</Time>
<DayOrder>2</DayOrder>
<Month>3</Month>
<DayOfWeek>Sunday</DayOfWeek>
</DaylightTime>
</TimeZone>
<WorkingPeriodArray>
<WorkingPeriod>
<DayOfWeek>Monday Tuesday Wednesday Thursday Friday</DayOfWeek>
<StartTimeInMinutes>540</StartTimeInMinutes>
<EndTimeInMinutes>1020</EndTimeInMinutes>
</WorkingPeriod>
</WorkingPeriodArray>
</WorkingHours>
</FreeBusyView>
</FreeBusyResponse>
</FreeBusyResponseArray>
<SuggestionsResponse>
<ResponseMessage ResponseClass="Success">
<ResponseCode>NoError</ResponseCode>
</ResponseMessage>
<SuggestionDayResultArray>
<SuggestionDayResult xmlns="http://schemas.microsoft.com/exchange/services/2006/types">
<Date>2014-02-13T00:00:00</Date>
<DayQuality>Excellent</DayQuality>
<SuggestionArray>
<Suggestion>
<MeetingTime>2014-02-13T09:00:00</MeetingTime>
<IsWorkTime>true</IsWorkTime>
<SuggestionQuality>Excellent</SuggestionQuality>
<AttendeeConflictDataArray>
<IndividualAttendeeConflictData>
<BusyType>Free</BusyType>
</IndividualAttendeeConflictData>
<IndividualAttendeeConflictData>
<BusyType>Free</BusyType>
</IndividualAttendeeConflictData>
</AttendeeConflictDataArray>
</Suggestion>
<Suggestion>
<MeetingTime>2014-02-13T09:30:00</MeetingTime>
<IsWorkTime>true</IsWorkTime>
<SuggestionQuality>Excellent</SuggestionQuality>
<AttendeeConflictDataArray>
<IndividualAttendeeConflictData>
<BusyType>Free</BusyType>
</IndividualAttendeeConflictData>
<IndividualAttendeeConflictData>
<BusyType>Free</BusyType>
</IndividualAttendeeConflictData>
</AttendeeConflictDataArray>
</Suggestion>
</SuggestionArray>
</SuggestionDayResult>
</SuggestionDayResultArray>
</SuggestionsResponse>
</GetUserAvailabilityResponse>
</s:Body>
</s:Envelope>