Estamos escribiendo un complemento de MS Outlook. Para satisfacer nuestra lógica de negocios, debe verificar todas las citas entre algunas fechas. Tenemos varios problemas al recuperar todos los elementos de los calendarios. Probamos dos opciones:
API de Outlook. Nosotros utilizamos la lógica estándar que se describe en MSDN - Artículos Tipo de [Inicio], conjunto
IncludeRecurrences
aTrue
y ejecutar el Find \ Limitar la consulta sobre el calendario artículos como aquí . Funciona bien en nuestro entorno de prueba. Sin embargo, en el entorno de nuestro cliente: Para las citas periódicas, las fechas de inicio y finalización se establecen en las fechas correspondientes de una "cita principal". Por ejemplo, en el calendario de alguna sala tenemos una cita semanal que se creó en enero, y si tratamos de encontrar todos los elementos en agosto, obtenemos entre otros cuatro elementos de esta cita recurrente, pero sus fechas de inicio y finalización se establecen en enero. . Pero Outlook muestra las fechas correctas en el mismo calendario ...Muy mal, ¡pero todavía tenemos WebDAV! Escribimos una aplicación de prueba simple e intentamos consultar todos los elementos del calendario usando WebDAV. Por supuesto, no reinventamos la rueda y simplemente pegamos el código de la documentación . El problema anterior está resuelto, pero surge el siguiente: no devuelve elementos recurrentes que se crearon hace más de aproximadamente seis meses. No tengo ni idea, ¡no hay parámetros que restrinjan los elementos 'antiguos'!
¿Qué está mal? ¿Nos estamos perdiendo algo importante?
Detalles técnicos: Exchange 2003, Outlook 2003-2010. Hablando francamente, el primer error desaparece si activamos el modo de intercambio en caché, pero no podemos hacer eso.
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();
}
ACTUALIZACIÓN 1:
Investigaciones adicionales con OutlookSpy muestran que el problema no está en nuestro código: las fechas de inicio y finalización son incorrectas dentro de la API cuando el modo de intercambio en caché está desactivado. Pero los desarrolladores de Outlook lo sabían y de alguna manera muestran las fechas correctas en los calendarios. ¿Alguien sabe cómo?
ACTUALIZACIÓN 2:
Respuesta del ingeniero de escalamiento de soporte de Outlook:
Basado en esto, puedo confirmar que este es un problema en nuestro producto.