如何使用 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;
}