如何使用 EWS API Outlook 从其他用户那里获取日历项目
how to get the calendar items from other users with EWS API Outlook
我想大致了解别人的日历。当我使用方法 1 时,我可以获得他的日历信息,除了 'Occurences' 项目不在...
使用方法 2,我能够获取那个人的事件项目,但它显示的是我的日历项目而不是那个人,而我传递的是那个人的电子邮件地址的服务...
在这两种方式中,我都传递了包含其他电子邮件地址的“服务”参数...
我需要 X 人的所有日历信息 + 事件...为什么方法 2 给我的日历项目而不是那个人?
有什么建议吗?...
方法一:使用方法->Folder.Bind
string username ="SomeOneElseEmail@outlook.com"
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
service.UseDefaultCredentials = true;
folderIdFromCalendar = new FolderId(WellKnownFolderName.Calendar, username);
PropertySet propertySet = new PropertySet(AppointmentSchema.Subject);
Folder TargetFolder = Folder.Bind(service, folderIdFromCalendar, propertySet);
方法二:使用方法->FindAppointments
service.AutodiscoverUrl(username, RedirectionUrlValidationCallback);
/////////
DateTime startDate = DateTime.Now;
DateTime endDate = startDate.AddDays(30);
const int NUM_APPTS = 5;
// Initialize the calendar folder object with only the folder ID.
CalendarFolder calendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar, new PropertySet());
// Set the start and end time and number of appointments to retrieve.
CalendarView ccView = new CalendarView(startDate, endDate, NUM_APPTS);
// Limit the properties returned to the appointment's subject, start time, and end time.
ccView.PropertySet = new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End);
// Retrieve a collection of appointments by using the calendar view.
FindItemsResults<Appointment> appointments2 = calendar.FindAppointments(ccView);
Console.WriteLine("\nThe first " + NUM_APPTS + " appointments on your calendar from " + startDate.Date.ToShortDateString() +
" to " + endDate.Date.ToShortDateString() + " are: \n");
foreach (Appointment a in appointments2)
{
Console.Write("Subject: " + a.Subject.ToString() + " ");
Console.Write("Start: " + a.Start.ToString() + " ");
Console.Write("End: " + a.End.ToString());
Console.WriteLine();
}
方法 2 应该可行,但您需要使用 FolderId 的重载来指定要访问的邮箱,因此更改
CalendarFolder calendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar, new PropertySet());
至
folderIdFromCalendar = new FolderId(WellKnownFolderName.Calendar, username);
CalendarFolder calendar = CalendarFolder.Bind(service, folderIdFromCalendar , new PropertySet());
我带着 ews-java-api 库的 Java 解决方案来到这里。 Java 的语法非常接近 C#,所以我还是分享了代码片段。
方法 1 - 绑定到目标用户的日历文件夹
此方法绑定目标用户文件夹的日历文件夹并执行约会查询。类似于您以用户 A 身份登录并打开用户 B 的日历列表的实际用例。
import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ConnectingIdType;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.service.folder.CalendarFolder;
import microsoft.exchange.webservices.data.core.service.item.Appointment;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.misc.ImpersonatedUserId;
import microsoft.exchange.webservices.data.property.complex.FolderId;
import microsoft.exchange.webservices.data.property.complex.Mailbox;
import microsoft.exchange.webservices.data.search.CalendarView;
import microsoft.exchange.webservices.data.search.FindItemsResults;
/**
* Get user appointment within range
* @param targetUserEmail: Target User Email, e.g: "johndoe@mycompany.ch"
* @param from From range
* @param to To range
* */
public List<Appointment> getAppointments(String targetUserEmail, Date from, Date to) throws Exception {
// Initiate the exchange servive
ExchangeCredentials techUserCredential = new WebCredentials("ewsTechUserName", "ewsTechPswd", "mydomain");
exchangeService = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
exchangeService.setCredentials(techUserCredential);
exchangeService.setUrl(new URI("https://outlook.mycompany.ch/EWS/Exchange.asmx"));
// binding to the calendar folder of that user
FolderId targetUserCalendarId = new FolderId(WellKnownFolderName.Calendar, Mailbox.getMailboxFromString(targetUserEmail));
CalendarFolder calendarFolder = CalendarFolder.bind(exchangeService, targetUserCalendarId);
// Invoke the CalendarFolder#findAppointments method within range by from-to parameters
FindItemsResults<Appointment> findResults = calendarFolder.findAppointments(new CalendarView(from, to));
List<Appointment> results = findResults.getItems();
return results;
}
方法 2 - 使用 Impersonation mode
直接绑定到目标用户的日历文件夹
此方法允许凭据帐户模拟目标用户。通过模拟,用户 B(我们正在浏览条目的目标用户)正在查看他自己的日历条目。这可能会派上用场如果需要读取目标用户的私人约会信息。
请注意,此方法要求凭据帐户需要由 Exchange 服务器管理员授予 ApplicationImpersonation 角色。
import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ConnectingIdType;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.service.folder.CalendarFolder;
import microsoft.exchange.webservices.data.core.service.item.Appointment;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.misc.ImpersonatedUserId;
import microsoft.exchange.webservices.data.property.complex.FolderId;
import microsoft.exchange.webservices.data.property.complex.Mailbox;
import microsoft.exchange.webservices.data.search.CalendarView;
import microsoft.exchange.webservices.data.search.FindItemsResults;
/**
* Get user appointment within range
* @param targetUserEmail: Target User Email, e.g: johndoe@mycompany.ch
* @param from From range
* @param to To range
* */
public List<Appointment> getAppointments(String targetUserEmail, Date from, Date to) throws Exception {
// Initiate the exchange servive
ExchangeCredentials techUserCredential = new WebCredentials("ewsTechUserName", "ewsTechPswd", "mydomain");
exchangeService = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
exchangeService.setCredentials(techUserCredential);
exchangeService.setUrl(new URI("https://outlook.mycompany.ch/EWS/Exchange.asmx"));
/* This impersonation technique is required, if we also need to load the meeting detail if the current user is viewing his own
* private calendar entry */
ImpersonatedUserId impersonateUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, targetUserEmail);
exchangeService.setImpersonatedUserId(impersonateUserId);
// binding to the calendar folder of that user
FolderId targetUserCalendarId = new FolderId(WellKnownFolderName.Calendar, Mailbox.getMailboxFromString(targetUserEmail));
CalendarFolder calendarFolder = CalendarFolder.bind(exchangeService, targetUserCalendarId);
// Invoke the CalendarFolder#findAppointments method within range by from-to parameters
FindItemsResults<Appointment> findResults = calendarFolder.findAppointments(new CalendarView(from, to));
List<Appointment> results = findResults.getItems();
return results;
}
我想大致了解别人的日历。当我使用方法 1 时,我可以获得他的日历信息,除了 'Occurences' 项目不在...
使用方法 2,我能够获取那个人的事件项目,但它显示的是我的日历项目而不是那个人,而我传递的是那个人的电子邮件地址的服务...
在这两种方式中,我都传递了包含其他电子邮件地址的“服务”参数...
我需要 X 人的所有日历信息 + 事件...为什么方法 2 给我的日历项目而不是那个人?
有什么建议吗?...
方法一:使用方法->Folder.Bind
string username ="SomeOneElseEmail@outlook.com"
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2);
service.UseDefaultCredentials = true;
folderIdFromCalendar = new FolderId(WellKnownFolderName.Calendar, username);
PropertySet propertySet = new PropertySet(AppointmentSchema.Subject);
Folder TargetFolder = Folder.Bind(service, folderIdFromCalendar, propertySet);
方法二:使用方法->FindAppointments
service.AutodiscoverUrl(username, RedirectionUrlValidationCallback);
/////////
DateTime startDate = DateTime.Now;
DateTime endDate = startDate.AddDays(30);
const int NUM_APPTS = 5;
// Initialize the calendar folder object with only the folder ID.
CalendarFolder calendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar, new PropertySet());
// Set the start and end time and number of appointments to retrieve.
CalendarView ccView = new CalendarView(startDate, endDate, NUM_APPTS);
// Limit the properties returned to the appointment's subject, start time, and end time.
ccView.PropertySet = new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End);
// Retrieve a collection of appointments by using the calendar view.
FindItemsResults<Appointment> appointments2 = calendar.FindAppointments(ccView);
Console.WriteLine("\nThe first " + NUM_APPTS + " appointments on your calendar from " + startDate.Date.ToShortDateString() +
" to " + endDate.Date.ToShortDateString() + " are: \n");
foreach (Appointment a in appointments2)
{
Console.Write("Subject: " + a.Subject.ToString() + " ");
Console.Write("Start: " + a.Start.ToString() + " ");
Console.Write("End: " + a.End.ToString());
Console.WriteLine();
}
方法 2 应该可行,但您需要使用 FolderId 的重载来指定要访问的邮箱,因此更改
CalendarFolder calendar = CalendarFolder.Bind(service, WellKnownFolderName.Calendar, new PropertySet());
至
folderIdFromCalendar = new FolderId(WellKnownFolderName.Calendar, username);
CalendarFolder calendar = CalendarFolder.Bind(service, folderIdFromCalendar , new PropertySet());
我带着 ews-java-api 库的 Java 解决方案来到这里。 Java 的语法非常接近 C#,所以我还是分享了代码片段。
方法 1 - 绑定到目标用户的日历文件夹
此方法绑定目标用户文件夹的日历文件夹并执行约会查询。类似于您以用户 A 身份登录并打开用户 B 的日历列表的实际用例。
import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ConnectingIdType;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.service.folder.CalendarFolder;
import microsoft.exchange.webservices.data.core.service.item.Appointment;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.misc.ImpersonatedUserId;
import microsoft.exchange.webservices.data.property.complex.FolderId;
import microsoft.exchange.webservices.data.property.complex.Mailbox;
import microsoft.exchange.webservices.data.search.CalendarView;
import microsoft.exchange.webservices.data.search.FindItemsResults;
/**
* Get user appointment within range
* @param targetUserEmail: Target User Email, e.g: "johndoe@mycompany.ch"
* @param from From range
* @param to To range
* */
public List<Appointment> getAppointments(String targetUserEmail, Date from, Date to) throws Exception {
// Initiate the exchange servive
ExchangeCredentials techUserCredential = new WebCredentials("ewsTechUserName", "ewsTechPswd", "mydomain");
exchangeService = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
exchangeService.setCredentials(techUserCredential);
exchangeService.setUrl(new URI("https://outlook.mycompany.ch/EWS/Exchange.asmx"));
// binding to the calendar folder of that user
FolderId targetUserCalendarId = new FolderId(WellKnownFolderName.Calendar, Mailbox.getMailboxFromString(targetUserEmail));
CalendarFolder calendarFolder = CalendarFolder.bind(exchangeService, targetUserCalendarId);
// Invoke the CalendarFolder#findAppointments method within range by from-to parameters
FindItemsResults<Appointment> findResults = calendarFolder.findAppointments(new CalendarView(from, to));
List<Appointment> results = findResults.getItems();
return results;
}
方法 2 - 使用 Impersonation mode
直接绑定到目标用户的日历文件夹此方法允许凭据帐户模拟目标用户。通过模拟,用户 B(我们正在浏览条目的目标用户)正在查看他自己的日历条目。这可能会派上用场如果需要读取目标用户的私人约会信息。
请注意,此方法要求凭据帐户需要由 Exchange 服务器管理员授予 ApplicationImpersonation 角色。
import microsoft.exchange.webservices.data.core.ExchangeService;
import microsoft.exchange.webservices.data.core.enumeration.misc.ConnectingIdType;
import microsoft.exchange.webservices.data.core.enumeration.misc.ExchangeVersion;
import microsoft.exchange.webservices.data.core.enumeration.property.WellKnownFolderName;
import microsoft.exchange.webservices.data.core.service.folder.CalendarFolder;
import microsoft.exchange.webservices.data.core.service.item.Appointment;
import microsoft.exchange.webservices.data.credential.ExchangeCredentials;
import microsoft.exchange.webservices.data.credential.WebCredentials;
import microsoft.exchange.webservices.data.misc.ImpersonatedUserId;
import microsoft.exchange.webservices.data.property.complex.FolderId;
import microsoft.exchange.webservices.data.property.complex.Mailbox;
import microsoft.exchange.webservices.data.search.CalendarView;
import microsoft.exchange.webservices.data.search.FindItemsResults;
/**
* Get user appointment within range
* @param targetUserEmail: Target User Email, e.g: johndoe@mycompany.ch
* @param from From range
* @param to To range
* */
public List<Appointment> getAppointments(String targetUserEmail, Date from, Date to) throws Exception {
// Initiate the exchange servive
ExchangeCredentials techUserCredential = new WebCredentials("ewsTechUserName", "ewsTechPswd", "mydomain");
exchangeService = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
exchangeService.setCredentials(techUserCredential);
exchangeService.setUrl(new URI("https://outlook.mycompany.ch/EWS/Exchange.asmx"));
/* This impersonation technique is required, if we also need to load the meeting detail if the current user is viewing his own
* private calendar entry */
ImpersonatedUserId impersonateUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, targetUserEmail);
exchangeService.setImpersonatedUserId(impersonateUserId);
// binding to the calendar folder of that user
FolderId targetUserCalendarId = new FolderId(WellKnownFolderName.Calendar, Mailbox.getMailboxFromString(targetUserEmail));
CalendarFolder calendarFolder = CalendarFolder.bind(exchangeService, targetUserCalendarId);
// Invoke the CalendarFolder#findAppointments method within range by from-to parameters
FindItemsResults<Appointment> findResults = calendarFolder.findAppointments(new CalendarView(from, to));
List<Appointment> results = findResults.getItems();
return results;
}