Ми пишемо плагін MS Outlook. Щоб задовольнити нашу бізнес-логіку, він повинен перевірити всі зустрічі між деякими датами. Ми стикаємось із кількома проблемами з отриманням усіх елементів із календарів. Ми спробували два варіанти:
API Outlook. Ми використовуємо стандартну логіку, яка описана в MSDN - елементи сортування по [Start], набір
IncludeRecurrences
дляTrue
і запустити Find \ Обмежити запит через елементи календаря , як тут . Це добре працює в нашому тестовому середовищі. Однак у середовищі нашого замовника: для періодичних зустрічей датою початку та закінчення встановлюються відповідні дати „головного побачення”. Наприклад, у календарі деяких кімнат у нас є щотижнева зустріч, яка була створена в січні, і якщо ми спробуємо знайти всі предмети в серпні, ми отримаємо серед інших чотири елементи цієї періодичної зустрічі, але датою їх початку та закінчення встановлено січень . Але Outlook відображає правильні дати в тому ж календарі ...Дуже погано, але у нас все ще є WebDAV! Ми пишемо простий тестовий додаток і намагаємося запитувати всі елементи з календаря за допомогою WebDAV. Звичайно, ми не винаходили колесо, а просто вставляли код із документації . Попередня проблема вирішена, але виникає наступна: вона не повертає повторювані елементи, створені більше приблизно півроку тому. Я не маю поняття - немає параметрів, що обмежують "старі" предмети!
Що не так? Ми пропускаємо щось важливе?
Технічні деталі: Exchange 2003, Outlook 2003-2010. Чесно кажучи, перша помилка зникає, якщо ми вмикаємо кешований режим обміну, але ми не можемо цього зробити.
var nameSpace = application.GetNamespace("MAPI");
var recepient = nameSpace.CreateRecipient(roomEMail);
recepient.Resolve();
var calendar = nameSpace.GetSharedDefaultFolder(recepient, OlDefaultFolders.olFolderCalendar);
var filter = string.Format("[Start]<'{1}' AND [End]>'{0}'",
dateFrom.ToString("dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture), dateTo.ToString("dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture)
);
var allItems = calendar.Items;
allItems.Sort("[Start]");
allItems.IncludeRecurrences = true;
var _item = allItems.Find(filter);
while (_item != null) {
AppointmentItem item = _item as AppointmentItem;
if (item != null) {
if (item.Subject != "some const")
&& (item.ResponseStatus != OlResponseStatus.olResponseDeclined)
&& (item.MeetingStatus != OlMeetingStatus.olMeetingReceivedAndCanceled
&& item.MeetingStatus != OlMeetingStatus.olMeetingCanceled))
{
/* Here we copy item to our internal class.
* We need: Subject, Start, End, Organizer, Recipients, MeetingStatus,
* AllDayEvent, IsRecurring, RecurrentState, ResponseStatus,
* GlobalAppointmentID */
}
}
_item = allItems.FindNext();
}
ОНОВЛЕННЯ 1:
Додаткове дослідження за допомогою OutlookSpy показує, що проблема не в нашому коді - дати початку / кінця неправильні в API, коли кешований режим обміну вимкнено. Але розробники Outlook це знали, і вони якось відображають правильні дати в календарях! Хтось знає як?
ОНОВЛЕННЯ 2:
Відповідь інженера з питань ескалації підтримки Outlook:
На основі цього я можу підтвердити, що це проблема у нашому продукті.