EWS - Csharp - List unread inbox messages using a restriction
// C# sample using Exchange Web Service Proxy classes to list unread messages in an inbox using a restriction.
private void FindInFolder()
{
// TODO: Put this code into a winform and call from a button:
// TODO: create 3 text boxes called txtRequest, txtResponse, txtItems
// TODO: Set the properties for the three text boxes to multiline=true, Scrolling=Both and Wrap=false.
// TODO: Change the credentials below to match your server & mailbox
//----------------- Setup basic credentials for test server ----
//------------------
//string sUserName = "administrator"; // TODO: Change
//string sPassword = "MyPassword1"; // TODO: Change
//string sDomain = "mydom"; // TODO: Change
//string sAuthenticate = "Basic"; //"Windows, "Basic" // TODO: Change
//string sEWS_URL = "https://my2k7server.mydom.extest.microsoft.com/EWS/Services.wsdl"; // TODO: Change
//----------------- Setup windows credentials for live server ----
//
string sUserName = ""; // TODO: Change
string sPassword = ""; // TODO: Change
string sDomain = ""; // TODO: Change
string sAuthenticate = "Windows"; //Windows, Basic // TODO: Change
string sEWS_URL = "https://myserver.microsoft.com/ews/exchange.asmx"; // TODO: Change
// ------------------- Lets now bind to Exchange
NetworkCredential nc = null;
if (sAuthenticate == "Windows")
{
nc = System.Net.CredentialCache.DefaultNetworkCredentials;
}
else
{
nc = new NetworkCredential(sUserName, sPassword, sDomain);
}
ExchangeServiceBinding esb = new ExchangeServiceBinding();
esb.Url = sEWS_URL;
esb.Credentials = nc;
//----------------------- main code ---------------
FindItemType findItemRequest = new FindItemType();
findItemRequest.Traversal = ItemQueryTraversalType.Shallow;
// Define which item properties are returned in the response
ItemResponseShapeType itemProperties = new ItemResponseShapeType();
itemProperties.BaseShape = DefaultShapeNamesType.AllProperties;
findItemRequest.ItemShape = itemProperties; // Add properties shape to request
// Identify which folders to search to find items
DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[1];
folderIDArray[0] = new DistinguishedFolderIdType();
folderIDArray[0].Id = DistinguishedFolderIdNameType.inbox;
// Add folders to request
findItemRequest.ParentFolderIds = folderIDArray;
//Create unread only restriction --------------------------
RestrictionType restriction = new RestrictionType();
IsEqualToType isEqualTo = new IsEqualToType();
PathToUnindexedFieldType pathToFieldType = new PathToUnindexedFieldType();
pathToFieldType.FieldURI = UnindexedFieldURIType.messageIsRead;
FieldURIOrConstantType constantType = new FieldURIOrConstantType();
ConstantValueType constantValueType = new ConstantValueType();
constantValueType.Value = "0";
constantType.Item = constantValueType;
isEqualTo.Item = pathToFieldType;
isEqualTo.FieldURIOrConstant = constantType;
restriction.Item = isEqualTo;
findItemRequest.Restriction = restriction;
// ------------- GetAccessibilityObjectById the stream
using ( StreamWriter myreqWriter = new StreamWriter( "c:\\findItemRequest.xml"))
{
XmlSerializer myReqSerializer = new XmlSerializer(typeof(FindItemType));
myReqSerializer.Serialize(myreqWriter, findItemRequest);
}
txtRequest.Text = File.ReadAllText("c:\\findItemRequest.xml");
// ------------- Send the request and get the response
FindItemResponseType findItemResponse = esb.FindItem(findItemRequest);
using (StreamWriter myrespWriter = new StreamWriter("c:\\findItemResponse.xml"))
{
XmlSerializer myRespSerializer = new XmlSerializer(typeof(FindItemResponseType));
myRespSerializer.Serialize(myrespWriter, findItemResponse);
}
txtResponse.Text = File.ReadAllText("c:\\findItemResponse.xml");
// ------------- read returned
FindItemResponseMessageType folder = (FindItemResponseMessageType) findItemResponse.ResponseMessages.Items[0];
ArrayOfRealItemsType folderContents = new ArrayOfRealItemsType();
folderContents = (ArrayOfRealItemsType)folder.RootFolder.Item;
ItemType[] items = folderContents.Items;
string sText = "";
foreach (ItemType curItem in items)
{
sText += "Subject: " +(curItem.Subject.Trim()) + " ";
sText += "DisplayTo: " + (curItem.DisplayTo.Trim()) + " ";
sText += "DateTimeReceived: " + (curItem.DateTimeReceived.TimeOfDay.ToString()) + " ";
sText += "DateTimeReceived: " + (curItem.ItemClass.Trim()) + " ";
sText += "\r\n" ;
Console.WriteLine(curItem.Subject);
}
txtItems.Text = sText;
}
Comments
Anonymous
October 16, 2008
I've put together a list of articles which cover common questions on Exchange Web Services (EWS). TheseAnonymous
November 03, 2008
Hi Dan, first of all thanks for your great Blog about WebDav... it's really awesome! But can you give an example how a second restriction would be implemented? In this example you're only looking for unread messages, how should the implementation look like if you set a second restriction for a additional field like for example sender? Here an example of what I mean: Looking for all unread Messages where sender is info@example.com I've followed your usefull links but couldn't find an answer how to combine multiple restrictions in one request... thx and greetings from germany, SebastianAnonymous
March 03, 2009
Sebastian, You can find a sample here with multiple restrictions http://blogs.msdn.com/vikas/archive/2007/07/27/howto-getfolder-finditem-restriction-getitem.aspx You can extend this sample with as many restrictions as you likeAnonymous
May 06, 2009
When i run above code i see error 401. Please helpAnonymous
May 18, 2009
A 401 is unauthorized - not enough permissions. Please look at the section on 401 errors in the paper on my very first blog posting - WebDAV 101.Anonymous
September 05, 2010
Hi Daniel, can you explain me the best way to retrieve an email received in reply to a specific email? Thank youAnonymous
September 07, 2010
You could try the conversation index, and if there is no conversation index, then use conversation topic. Reference: msdn.microsoft.com/.../cc765583.aspxAnonymous
November 29, 2010
Hi, thats a very useful little program for me but what do i have to change if i want to see the unread items of another mailbox on which i have access rights? And is it possible to get the unread items of the subfolders of inbox, too? Thank you in Advance!Anonymous
May 01, 2012
Thanks for this useful code, I need to list only unread mails from gmail in web application using pop3 client how can i achieve thisplease help me.. Thanks in Advance.....Anonymous
November 20, 2012
Hi, We are getting this exception when accessing the EWS. org.xml.sax.SAXException: Processing instructions are not allowed within SOAP messages at org.apache.axis.SOAPPart.getEnvelope can anyone give some clue about the issue? Thank