Wir schreiben ein MS Outlook Plugin. Um unsere Geschäftslogik zu erfüllen, sollten alle Termine zwischen bestimmten Daten überprüft werden. Beim Abrufen aller Elemente aus Kalendern treten verschiedene Probleme auf. Wir haben zwei Möglichkeiten ausprobiert:
Outlook-API. Wir verwenden die Standard - Logik , die in MSDN beschrieben wird - eine Art von Artikel [Start], Satz
IncludeRecurrences
zuTrue
und führen Sie die Suche \ Artikel einschränken Abfrage über Kalender wie hier . In unserer Testumgebung funktioniert es einwandfrei. In der Umgebung unseres Kunden: Bei wiederkehrenden Terminen werden Start- und Enddatum auf die entsprechenden Daten eines Haupttermins festgelegt. In einigen Raumkalendern haben wir beispielsweise einen wöchentlichen Termin, der im Januar erstellt wurde. Wenn wir versuchen, alle Artikel im August zu finden, erhalten wir unter anderem vier Artikel dieses wiederkehrenden Termins, deren Start- und Enddatum jedoch auf Januar festgelegt sind . Outlook zeigt jedoch korrekte Daten im selben Kalender an ...Sehr schlecht, aber wir haben immer noch WebDAV! Wir schreiben eine einfache Testanwendung und versuchen, alle Elemente aus dem Kalender mit WebDAV abzufragen. Natürlich haben wir das Rad nicht neu erfunden und nur den Code aus der Dokumentation eingefügt . Das vorherige Problem ist gelöst, aber das nächste tritt auf: Es werden keine wiederkehrenden Elemente zurückgegeben, die vor mehr als ungefähr sechs Monaten erstellt wurden. Ich habe keine Ahnung - es gibt keine Parameter, die 'alte' Gegenstände einschränken!
Was ist falsch? Vermissen wir etwas Wichtiges?
Technische Details: Exchange 2003, Outlook 2003-2010. Ehrlich gesagt verschwindet der erste Fehler, wenn wir den zwischengespeicherten Exchange-Modus aktivieren, aber das können wir nicht.
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();
}
UPDATE 1:
Zusätzliche Untersuchungen mit OutlookSpy zeigen, dass das Problem nicht in unserem Code enthalten ist. Die Start- / Enddaten in der API sind falsch, wenn der Exchange-Cache-Modus deaktiviert ist. Aber Outlook-Entwickler waren sich dessen bewusst und zeigen irgendwie korrekte Daten in Kalendern an! Weiß jemand wie?
UPDATE 2:
Antwort von Outlook Support Escalation Engineer:
Auf dieser Grundlage kann ich bestätigen, dass dies ein Problem in unserem Produkt ist.