C# EWS-如何在日期之间搜索项目[消息]?
我正在尝试从收件箱文件夹中搜索两个日期之间的邮件项目。 我使用以下restrictionType,但它会引发此错误: firmt.RootFolder=null 我做错了什么 在提到的日期之间有一些消息;-) 谢谢你的建议C# EWS-如何在日期之间搜索项目[消息]?,c#,exchangewebservices,C#,Exchangewebservices,我正在尝试从收件箱文件夹中搜索两个日期之间的邮件项目。 我使用以下restrictionType,但它会引发此错误: firmt.RootFolder=null 我做错了什么 在提到的日期之间有一些消息;-) 谢谢你的建议 using (ExchangeServiceBinding esb = new ExchangeServiceBinding()) { esb.Url = ConfigurationManager.AppSettings
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());
}
使用(ExchangeServiceBinding esb=new ExchangeServiceBinding())
{
esb.Url=ConfigurationManager.AppSettings[“ExchangeWebServicesURL”].ToString();
esb.RequestServerVersionValue=新的RequestServerVersion();
esb.RequestServerVersionValue.Version=ExchangeVersionType.Exchange2007_SP1;
esb.PreAuthenticate=true;
esb.Credentials=新的网络凭据(电子邮件、密码);
FindItemType findItemRequest=新的FindItemType();
//寻呼
IndexedPageViewType ipvt=新IndexedPageViewType();
ipvt.BasePoint=IndexBasePointType.Start;
ipvt.MaxEntriesReturned=nombreMessage;
ipvt.MaxEntriesReturnedSpecified=true;
偏移量=偏移量;
findItemRequest.Item=ipvt;
//按日期筛选
AndType AndType=新AndType();
List searchExps=新列表();
RestrictionType restriction=新的RestrictionType();
PathToUnindexedFieldType pteft=新的PathToUnindexedFieldType
{
FieldURI=UnindexedFieldURIType.itemDateTimeSent
};
IsGreaterThanOrEqualToType IsGreaterThanOrEqualTo=新IsGreaterThanOrEqualToType
{
项目=pteft,
FieldURIOrConstant=新的FieldURIOrConstantType
{
Item=新的ConstantValue类型
{
Value=DateTime.Today.AddDays(-6d).ToString()
}
}
};
searchExps.Add(大于或等于0);
IsLessThanOrEqualToType IsLessThanOrEqualTo=新IsLessThanOrEqualToType
{
项目=pteft,
FieldURIOrConstant=新的FieldURIOrConstantType
{
Item=新的ConstantValue类型
{
Value=DateTime.Today.AddDays(1d).ToString()
}
}
};
searchExps.Add(IsLessThanOrEqualTo);
andType.Items=searchExps.ToArray();
限制。项=和类型;
findItemRequest.Restriction=限制;
////定义项目的排序顺序。
FieldOrderType[]fieldsOrder=新的FieldOrderType[1];
fieldsOrder[0]=新的FieldOrderType();
PathToUnindexedFieldType dateOrder=新的PathToUnindexedFieldType
{
FieldURI=UnindexedFieldURIType.itemDateTimeReceived
};
fieldsOrder[0]。项=日期顺序;
fieldsOrder[0]。顺序=SortDirectionType.Descending;
findItemRequest.SortOrder=字段排序器;
findItemRequest.Traversal=ItemQueryTraversalType.Shallow;
//定义响应中返回的项属性
findItemRequest.ItemShape=新的ItemResponseShapeType
{
BaseShape=DefaultShapeNameType.IdOnly
};
//确定要搜索的文件夹
DifferentiedFolderIDType[]folderIDArray=新的DifferentiedFolderIDType[1];
folderIDArray[0]=新的DifferentiedFolderIDType{Id=DifferentiedFolderIDNameType.inbox};
//向请求添加文件夹
findItemRequest.ParentFolderId=FolderDarray;
//查找消息
FindItemResponseType findItemResponse=esb.FindItem(findItemRequest);
//-------------
ArrayOfResponseMessageType responseMessages=findItemResponse.responseMessages;
ResponseMessageType responseMessage=responseMessages.Items[0];
if(responseMessage为FindItemResponseMessageType)
{
FindItemResponseMessageType firmt=(响应消息为FindItemResponseMessageType);
*******FindItemParentType fipt=firmt.RootFolder********
对象对象=初始项;
//FindItem包含一个项目数组。
ArrayOfRealItemsType realitems=(对象为ArrayOfRealItemsType);
ItemType[]items=realitems.items;
//如果没有找到任何消息,则返回null——我们完成了
如果(items==null | | items.Count()在对日期格式进行长时间搜索后,我自己找到了答案
这些限制必须定义为:
// 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;
希望有一天这会对某人有所帮助;-)如果将来有人偶然发现这一点,EWS对日期格式的要求会更严格。公认的答案格式适用于两位数的月份,但不适用于一位数的月份
在所有情况下都适用的格式是:
DateTime.Today.AddDays(15).ToString("yyyy-MM-ddThh:mm:ssZ")
该限制还可以使用“可排序的日期/时间模式”
异常是在哪一行引发的?代码太多了。你需要能够识别问题发生在哪里,而不是发布整个程序。是的,很抱歉,但因为我不知道问题出在哪里,所以我发布了所有代码。异常位于带星星的那一行*********和vfipt的值为null。在深度调试会话之后,我发现responseMessage.MessageText具有以下内容“指定的值对于属性无效”。指定的值为“FieldURI”。这是MessageXml属性值:并且该值为null。
Datetime.Now.ToString("s")