Web Services Exchange 2010 - Rechercher des emails en positionnant une restriction

Bonjour,

Voici un exemple clé en main d'utilisation des Web Services Exchange 2010 avec deux petites subtilités :

- La première permet de définir plusieurs dossiers et/ou plusieurs boites aux lettres pour un seul appel Web services comme FindItem

 DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[1];

folderIDArray[0] = new DistinguishedFolderIdType();
folderIDArray[0].Id = DistinguishedFolderIdNameType.inbox;
folderIDArray[0].Mailbox = new EmailAddressType();
folderIDArray[0].Mailbox.EmailAddress = "sebastien.bovo@microsoft.com";

// Add folders to the request.
findItemRequest.ParentFolderIds = folderIDArray;

- La deuxième consiste à pouvoir positionner une ou plusieurs restrictions sur les éléments que l’on souhaite récupérer. La syntaxe n’est pas facile à appréhender : c’est donc agréable d’avoir un exemple sous la main. Dans le code ci-dessous je ne récupère que les emails non lus

 // Add a restriction to get for example only emails that are unread
PathToUnindexedFieldType messageIsReadPath = new PathToUnindexedFieldType();
messageIsReadPath.FieldURI = UnindexedFieldURIType.messageIsRead;
IsEqualToType IsEqualForUnreadFlag = new IsEqualToType();
IsEqualForUnreadFlag.Item = messageIsReadPath;
FieldURIOrConstantType IsReadConstant = new FieldURIOrConstantType();
ConstantValueType IsReadConstantValue = new ConstantValueType();
IsReadConstantValue.Value = "0"; // "0" for false and "1" for true
IsReadConstant.Item = IsReadConstantValue;
IsEqualForUnreadFlag.FieldURIOrConstant = IsReadConstant;

// Create the restriction array
RestrictionType restriction = new RestrictionType();
AndType andType = new AndType();
andType.Items = new SearchExpressionType[] { IsEqualForUnreadFlag };
restriction.Item = andType;

// Add the restriction to the findItemRequest object using in the EWS call
findItemRequest.Restriction = restriction;

 

--

Voici le code complet dans une application console :

 static void Main(string[] args)
{
    // Create the proxy for Exchange Web services
    ExchangeServiceBinding esb = new EWS.ExchangeServiceBinding();
    // Give  the credentials of the current user as we are in a console application
    esb.Credentials = System.Net.CredentialCache.DefaultCredentials;
    // Give the production url to use
    esb.Url = "https://emea.mail.microsoft.com/EWS/exchange.asmx";
    esb.RequestServerVersionValue = new RequestServerVersion();
    esb.RequestServerVersionValue.Version = ExchangeVersionType.Exchange2010_SP1;

    // Call our methods using the proxy created

    Console.WriteLine("Get unread emails in the inbox");
    Console.WriteLine("------------------------------");
    FindItemsInInbox(esb);

    Console.WriteLine("Get recurring tasks between two dates");
    Console.WriteLine("------------------------------");
    FindReccursiveTasks(esb, DateTime.Parse("2009/09/01"), DateTime.Parse("2010/10/27"));


    Console.ReadKey();
}



static void FindItemsInInbox(ExchangeServiceBinding esb)
{
    // Form the FindItem request.
    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;

    // Add properties shape to the request.
    findItemRequest.ItemShape = itemProperties;

    // Identify which folders to search to find items.
    // In folderIDArray you can add several DistinguishedFolderIdType objects.
    // For each object you have to specify:
    //      .Id      --> referencing the folder you would like to use
    //      .Mailbox --> giving the email of the user mailbox 
    DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[1];

    folderIDArray[0] = new DistinguishedFolderIdType();
    folderIDArray[0].Id = DistinguishedFolderIdNameType.inbox;
    folderIDArray[0].Mailbox = new EmailAddressType();
    folderIDArray[0].Mailbox.EmailAddress = "sebastien.bovo@microsoft.com";


    // Add folders to the request.
    findItemRequest.ParentFolderIds = folderIDArray;



    // Add a restriction to get for example only emails that are unread
    PathToUnindexedFieldType messageIsReadPath = new PathToUnindexedFieldType();
    messageIsReadPath.FieldURI = UnindexedFieldURIType.messageIsRead;
    IsEqualToType IsEqualForUnreadFlag = new IsEqualToType();
    IsEqualForUnreadFlag.Item = messageIsReadPath;
    FieldURIOrConstantType IsReadConstant = new FieldURIOrConstantType();
    ConstantValueType IsReadConstantValue = new ConstantValueType();
    IsReadConstantValue.Value = "0"; // "0" for false and "1" for true
    IsReadConstant.Item = IsReadConstantValue;
    IsEqualForUnreadFlag.FieldURIOrConstant = IsReadConstant;

    // Create the restriction array
    RestrictionType restriction = new RestrictionType();
    AndType andType = new AndType();
    andType.Items = new SearchExpressionType[] { IsEqualForUnreadFlag };
    restriction.Item = andType;

    // Add the restriction to the findItemRequest object using in the EWS call
    findItemRequest.Restriction = restriction;




    try
    {
        // Send the request and get the response.
        Console.WriteLine("Connecting to EWS...");
        FindItemResponseType findItemResponse = esb.FindItem(findItemRequest);

        // Get the response messages.
        ResponseMessageType[] rmta = findItemResponse.ResponseMessages.Items;

        foreach (ResponseMessageType rmt in rmta)
        {
            // Cast to the correct response message type.
            if (((FindItemResponseMessageType)rmt).ResponseClass == ResponseClassType.Success)
            {
                FindItemResponseMessageType firmt = (FindItemResponseMessageType)rmt;
                ArrayOfRealItemsType aorit = (ArrayOfRealItemsType)firmt.RootFolder.Item;
                ItemType[] it = aorit.Items;
                Console.WriteLine("Items found. Nb = " + it.Length + ". Here is the list:");
                foreach (ItemType i in aorit.Items)
                {
                    Console.WriteLine("- " + i.Subject);
                }
            }
        }
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

 

A bientôt,

Sebastien.