EWS - Как искать вещи [сообщение] между датами? - PullRequest
4 голосов
/ 30 марта 2010

Я пытаюсь найти элементы сообщения между двумя датами из папки входящих сообщений. Я использую следующий limittionType, но он выдает эту ошибку:

firmt.RootFolder = null

Что я делаю не так?

Между указанными датами есть несколько сообщений; -)

Спасибо за ваши предложения.

        using (ExchangeServiceBinding esb = new ExchangeServiceBinding())
        {
            esb.Url = ConfigurationManager.AppSettings["ExchangeWebServicesURL"].ToString();
            esb.RequestServerVersionValue = new RequestServerVersion();
            esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2007_SP1;
            esb.PreAuthenticate = true;
            esb.Credentials = new NetworkCredential(email, password);
            FindItemType findItemRequest = new FindItemType();
            // paging
            IndexedPageViewType ipvt = new IndexedPageViewType();
            ipvt.BasePoint = IndexBasePointType.Beginning;
            ipvt.MaxEntriesReturned = nombreMessage;
            ipvt.MaxEntriesReturnedSpecified = true;
            ipvt.Offset = offset;
            findItemRequest.Item = ipvt;
            // filter by dates
            AndType andType = new AndType();
            List<SearchExpressionType> searchExps = new List<SearchExpressionType>();
            RestrictionType restriction = new RestrictionType();
            PathToUnindexedFieldType pteft = new PathToUnindexedFieldType
            {
                FieldURI = UnindexedFieldURIType.itemDateTimeSent
            };
            IsGreaterThanOrEqualToType IsGreaterThanOrEqualTo = new IsGreaterThanOrEqualToType
            {
                Item = pteft,
                FieldURIOrConstant = new FieldURIOrConstantType
                {
                    Item = new ConstantValueType
                    {
                        Value = DateTime.Today.AddDays(-6d).ToString()
                    }
                }
            };
            searchExps.Add(IsGreaterThanOrEqualTo);

            IsLessThanOrEqualToType IsLessThanOrEqualTo = new IsLessThanOrEqualToType
            {
                Item = pteft,
                FieldURIOrConstant = new FieldURIOrConstantType
                {
                    Item = new ConstantValueType
                    {
                        Value = DateTime.Today.AddDays(1d).ToString()
                    }
                }
            };
            searchExps.Add(IsLessThanOrEqualTo);
            andType.Items = searchExps.ToArray();
            restriction.Item = andType;
            findItemRequest.Restriction = restriction;
            //// Define the sort order of items.
            FieldOrderType[] fieldsOrder = new FieldOrderType[1];
            fieldsOrder[0] = new FieldOrderType();
            PathToUnindexedFieldType dateOrder = new PathToUnindexedFieldType
            {
                FieldURI = UnindexedFieldURIType.itemDateTimeReceived
            };
            fieldsOrder[0].Item = dateOrder;
            fieldsOrder[0].Order = SortDirectionType.Descending;
            findItemRequest.SortOrder = fieldsOrder;
            findItemRequest.Traversal = ItemQueryTraversalType.Shallow;
            // define which item properties are returned in the response 
            findItemRequest.ItemShape = new ItemResponseShapeType
            {
                BaseShape = DefaultShapeNamesType.IdOnly
            };
            // identify which folder to search 
            DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[1];
            folderIDArray[0] = new DistinguishedFolderIdType { Id = DistinguishedFolderIdNameType.inbox };
            // add folders to request 
            findItemRequest.ParentFolderIds = folderIDArray;
            // find the messages 
            FindItemResponseType findItemResponse = esb.FindItem(findItemRequest);
            //-------------
            ArrayOfResponseMessagesType responseMessages = findItemResponse.ResponseMessages;
            ResponseMessageType responseMessage = responseMessages.Items[0];
            if (responseMessage is FindItemResponseMessageType)
            {
                FindItemResponseMessageType firmt = (responseMessage as FindItemResponseMessageType);
         *******FindItemParentType fipt = firmt.RootFolder;********
                object obj = fipt.Item;
                // FindItem contains an array of items.
                ArrayOfRealItemsType realitems = (obj as ArrayOfRealItemsType);
                ItemType[] items = realitems.Items;
                // if no messages were found, then return null -- we're done 
                if (items == null || items.Count() <= 0)
                    return null;
                // FindItem never gets "all" the properties, so now that we've found them all, we need to get them all. 
                BaseItemIdType[] itemIds = new BaseItemIdType[items.Count()];
                for (int i = 0; i < items.Count(); i++)
                    itemIds[i] = items[i].ItemId;
                GetItemType getItemType = new GetItemType
                {
                    ItemIds = itemIds,
                    ItemShape = new ItemResponseShapeType
                    {
                        BaseShape = DefaultShapeNamesType.AllProperties,
                        BodyType = BodyTypeResponseType.Text,
                        BodyTypeSpecified = true,
                        AdditionalProperties = new BasePathToElementType[] { 
                            new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.itemDateTimeSent },
                            new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageFrom },
                            new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageIsRead },
                            new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageSender },
                            new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageToRecipients },
                            new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageCcRecipients },
                            new PathToUnindexedFieldType { FieldURI = UnindexedFieldURIType.messageBccRecipients }
                        }
                    }
                };
                GetItemResponseType getItemResponse = esb.GetItem(getItemType);
                messages = ReadItems(getItemResponse, items.Count());
            }

Ответы [ 3 ]

4 голосов
/ 31 марта 2010

Я нашел ответ самостоятельно после долгого поиска формата даты.

Ограничения должны быть определены следующим образом:

// greater or equal to 
string dateStart = DateTime.Today.add(-6d);
string dateEnd = DateTime.Today.Add(1d);

PathToUnindexedFieldType dateSentPath = new PathToUnindexedFieldType();
dateSentPath.FieldURI = UnindexedFieldURIType.itemDateTimeSent;
IsGreaterThanOrEqualToType IsGreaterThanOrEqual = new IsGreaterThanOrEqualToType();
IsGreaterThanOrEqual.Item = dateSentPath;
FieldURIOrConstantType dateConstant = new FieldURIOrConstantType();
ConstantValueType dateConstantValue = new ConstantValueType();
dateConstantValue.Value = string.Format("{0}-{1}-{2}T00:00:00Z", dateStart.Year.ToString(), dateStart.Month.ToString(), dateStart.Day.ToString());
dateConstant.Item = dateConstantValue;
IsGreaterThanOrEqual.FieldURIOrConstant = dateConstant;

// less than or equal to
PathToUnindexedFieldType dateSentPath1 = new PathToUnindexedFieldType();
dateSentPath1.FieldURI = UnindexedFieldURIType.itemDateTimeSent;
IsLessThanOrEqualToType lessThanOrEqualTo = new IsLessThanOrEqualToType();
lessThanOrEqualTo.Item = dateSentPath1;
FieldURIOrConstantType dateConstant1 = new FieldURIOrConstantType();
ConstantValueType dateConstantValue1 = new ConstantValueType();
dateConstantValue1.Value = string.Format("{0}-{1}-{2}T00:00:00Z", dateEnd.Year.ToString(), dateEnd.Month.ToString(), dateEnd.Day.ToString());
dateConstant1.Item = dateConstantValue1;
lessThanOrEqualTo.FieldURIOrConstant = dateConstant1;

RestrictionType restriction = new RestrictionType();
AndType andType = new AndType();
andType.Items = new SearchExpressionType[] { lessThanOrEqualTo, IsGreaterThanOrEqual };
restriction.Item = andType;
findItemRequest.Restriction = restriction;

Надеюсь, это поможет кому-нибудь когда-нибудь; -)

0 голосов
/ 25 марта 2016

Ограничение также работает с использованием "Сортируемый шаблон даты / времени".

Datetime.Now.ToString("s")
0 голосов
/ 23 июля 2014

В случае, если кто-то столкнется с этим в будущем, EWS станет еще более строгим в отношении форматирования даты. Принятое форматирование ответа работает для двухзначных месяцев, но не для однозначных месяцев.

Форматирование, которое работает во всех случаях:

DateTime.Today.AddDays(15).ToString("yyyy-MM-ddThh:mm:ssZ")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...