Find all unread emails with Exchange Web Service 2010, then mark as read?

I use Exchang Web Services 2010 to try and read all unread emails from a mailbox, and then mark them as read.

I proceed from this example:

http://msdn.microsoft.com/en-us/library/exchange/aa563373(v=exchg.140).aspx

And they came up with this to find all unread letters and read the contents of the body:

//Set up the connection to exchange service ExchangeServiceBinding exchangeService = new ExchangeServiceBinding(); exchangeService.Credentials = new NetworkCredential("userid", "password", "domain"); exchangeService.Url = "https://exchangeserver/ews/exchange.asmx"; //REturn all properties FindItemType findType = new FindItemType(); findType.Traversal = ItemQueryTraversalType.Shallow; findType.ItemShape = new ItemResponseShapeType(); findType.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties; //Only search the inbox DistinguishedFolderIdType[] foldersToSearch = new DistinguishedFolderIdType[1]; foldersToSearch[0] = new DistinguishedFolderIdType(); foldersToSearch[0].Id = DistinguishedFolderIdNameType.inbox; findType.ParentFolderIds = foldersToSearch; //Only unread emails RestrictionType restriction = new RestrictionType(); IsEqualToType isEqualTo = new IsEqualToType(); PathToUnindexedFieldType pathToFieldType = new PathToUnindexedFieldType(); pathToFieldType.FieldURI = UnindexedFieldURIType.messageIsRead; //Not IsRead FieldURIOrConstantType constantType = new FieldURIOrConstantType(); ConstantValueType constantValueType = new ConstantValueType(); constantValueType.Value = "0"; constantType.Item = constantValueType; isEqualTo.Item = pathToFieldType; isEqualTo.FieldURIOrConstant = constantType; restriction.Item = isEqualTo; //set the not IsRead restriction findType.Restriction = restriction; try { FindItemResponseType findResponse = exchangeService.FindItem(findType); ResponseMessageType[] responseMessType = findResponse.ResponseMessages.Items; List<ItemIdType> unreadItemIds = new List<ItemIdType>(); //get all unread item IDs foreach (ResponseMessageType respMessage in responseMessType) { if(respMessage is FindItemResponseMessageType) { FindItemResponseMessageType itemResponse = (FindItemResponseMessageType)respMessage; if (itemResponse.ResponseClass == ResponseClassType.Success) { if (itemResponse.RootFolder.Item != null) { if (itemResponse.RootFolder.Item is ArrayOfRealItemsType) { ArrayOfRealItemsType items = (ArrayOfRealItemsType)itemResponse.RootFolder.Item; if (items.Items != null) { ItemType[] itemTypes = items.Items; foreach (ItemType item in itemTypes) { if (item is MessageType) { unreadItemIds.Add(item.ItemId); } } } } } } } } if (unreadItemIds.Count == 0) MessageBox.Show("No unread emails found"); else { //Get all unread mail messages, display body GetItemType getItemType = new GetItemType(); getItemType.ItemShape = new ItemResponseShapeType(); getItemType.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties; getItemType.ItemShape.BodyType = BodyTypeResponseType.Text; getItemType.ItemShape.BodyTypeSpecified = true; getItemType.ItemIds = unreadItemIds.ToArray(); GetItemResponseType getItemResponse = exchangeService.GetItem(getItemType); if(getItemResponse.ResponseMessages != null) { ArrayOfResponseMessagesType responseMessages = getItemResponse.ResponseMessages; foreach(ResponseMessageType responseMessage in responseMessages.Items) { if (responseMessage is ItemInfoResponseMessageType) { ItemInfoResponseMessageType responseItemInfo = (ItemInfoResponseMessageType)responseMessage; if (responseItemInfo.Items != null) { ArrayOfRealItemsType responseRealItems = (ArrayOfRealItemsType)responseItemInfo.Items; if (responseRealItems.Items != null) { foreach (ItemType responseItemType in responseRealItems.Items) { if (responseItemType is MessageType) { MessageType fullMessage = (MessageType)responseItemType; BodyType body = fullMessage.Body; if (body != null) { MessageBox.Show(body.Value); } } } } } } } } } } catch(Exception ee) { MessageBox.Show(ee.Message +" " + (ee.InnerException ?? new Exception("")).Message); } 

This returns a text version of all unread email bodies, however there should be a more efficient way, no?

Does anyone know how I can update my MessageType email address as read and send it to the server?

+6
source share
3 answers

Cannot mark MessageType as read with EWS v1. See this MSDN blog post for a workaround if you are stuck with EWS v1.

EWS v2 introduced the IsRead property as writable ( message.IsRead = true; message.Update(); ), which makes it trivial. You can use the EWS v2 managed API for Exchange 2007 and later, but this is a separate installation. See the MSDN page in the EWS Managed API 2.0 for more details.

+4
source

I give one more answer element to help those who fall into the same trap as me and for those using EWS 2.0:

I used the Item type in my loop to receive mail in a mailbox. The Item object does not have the IsRead property (but is similar to the EmailMessage object). Thus, you can simply replace the Item type with the EmailMessage type in your loop (because casting is allowed from the element to the EmailMessage type):

 foreach (EmailMessage message in findResults.Items) { if(message.IsRead==false) //if the current message is unread { //treatment } else { } } 

This is how I earned it.

+3
source
  For Each appointment As EmailMessage In service.FindItems(WellKnownFolderName.Inbox, New SearchFilter.SearchFilterCollection(LogicalOperator.And, New SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, False)), New ItemView(999)) ' set as read appointment.IsRead = True appointment.Update(ConflictResolutionMode.AlwaysOverwrite) Next 
+1
source

Source: https://habr.com/ru/post/947047/


All Articles