Fonctionnalités utilitaires dans Aspose.Email pour .NET

Travailler avec la messagerie unifiée

Aspose.Email peut récupérer les informations de messagerie unifiée depuis Exchange Server 2010. La messagerie unifiée tel que l’obtention d’informations de configuration, l’initiation d’un appel sortant, la récupération d’informations d’appel téléphonique par ID d’appel et la déconnexion d’un appel par ID est actuellement prise en charge. L’exemple de code suivant montre comment récupérer les informations de configuration de messagerie unifiée depuis Microsoft Exchange Server 2010.

IEWSClient client = EWSClient.GetEWSClient(mailboxUri, credential);
UnifiedMessagingConfiguration umConf = client.GetUMConfiguration();

Obtention des astuces de messagerie

Microsoft Exchange Server a ajouté plusieurs nouvelles fonctionnalités avec Exchange Server 2010 et 2013. L’une d’elles permet aux utilisateurs d’obtenir des astuces de messagerie lors de la rédaction d’un e‑mail. Ces astuces sont très utiles car elles fournissent des informations avant l’envoi du courriel. Par exemple, si une adresse e‑mail est erronée dans la liste des destinataires, une astuce s’affiche pour vous indiquer que l’adresse est invalide. Les astuces de messagerie permettent également de voir les réponses d’absence avant d’envoyer un e‑mail : Exchange Server (2010 & 2013) envoie l’astuce pendant la rédaction si un ou plusieurs destinataires ont activé les réponses d’absence. Le Service Pack 1 d’Exchange Server 2010 est requis pour toutes les fonctionnalités présentées dans cet article. Le fragment de code suivant montre comment utiliser le EWSClient classe qui utilise les services Web Exchange, disponibles dans Microsoft Exchange Server 2007 et versions ultérieures.

// Create instance of EWSClient class by giving credentials
IEWSClient client = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
Console.WriteLine("Connected to Exchange server...");
// Provide mail tips options
MailAddressCollection addrColl = new MailAddressCollection();
addrColl.Add(new MailAddress("test.exchange@ex2010.local", true));
addrColl.Add(new MailAddress("invalid.recipient@ex2010.local", true));
GetMailTipsOptions options = new GetMailTipsOptions("administrator@ex2010.local", addrColl, MailTipsType.All);

// Get Mail Tips
MailTips[] tips = client.GetMailTips(options);

// Display information about each Mail Tip
foreach (MailTips tip in tips)
{
    // Display Out of office message, if present
    if (tip.OutOfOffice != null)
    {
        Console.WriteLine("Out of office: " + tip.OutOfOffice.ReplyBody.Message);
    }

    // Display the invalid email address in recipient, if present
    if (tip.InvalidRecipient == true)
    {
        Console.WriteLine("The recipient address is invalid: " + tip.RecipientAddress);
    }
}

Imitation Exchange

L’imitation Exchange permet à quelqu’un d’usurper l’identité d’un autre compte et d’effectuer des tâches et opérations en utilisant les autorisations du compte usurpé au lieu des siennes. Alors que la délégation permet aux utilisateurs d’agir au nom d’autres utilisateurs, l’imitation leur permet d’agir comme d’autres utilisateurs. Aspose.Email prend en charge l’imitation Exchange. Le EWSClient classe fournit le ImpersonateUser et ResetImpersonation méthodes pour faciliter cette fonctionnalité.

Pour effectuer cette tâche :

  1. Initialiser le ExchangeWebServiceClient pour l’utilisateur 1.
  2. Initialiser le ExchangeWebServiceClient pour l’utilisateur 2.
  3. Ajouter des messages de test aux comptes.
  4. Activer l’imitation.
  5. Réinitialiser l’imitation.

L’extrait de code suivant montre comment utiliser le EWSClient classe pour implémenter la fonctionnalité d’imitation.

// Create instance's of EWSClient class by giving credentials
IEWSClient client1 = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser1", "pwd", "domain");
IEWSClient client2 = EWSClient.GetEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser2", "pwd", "domain");
{
    string folder = "Drafts";
    try
    {
        foreach (ExchangeMessageInfo messageInfo in client1.ListMessages(folder))
            client1.DeleteItem(messageInfo.UniqueUri, DeletionOptions.DeletePermanently);
        string subj1 = string.Format("NETWORKNET_33354 {0} {1}", "User", "User1");
        client1.AppendMessage(folder, new MailMessage("User1@exchange.conholdate.local", "To@aspsoe.com", subj1, ""));

        foreach (ExchangeMessageInfo messageInfo in client2.ListMessages(folder))
            client2.DeleteItem(messageInfo.UniqueUri, DeletionOptions.DeletePermanently);
        string subj2 = string.Format("NETWORKNET_33354 {0} {1}", "User", "User2");
        client2.AppendMessage(folder, new MailMessage("User2@exchange.conholdate.local", "To@aspose.com", subj2, ""));

        ExchangeMessageInfoCollection messInfoColl = client1.ListMessages(folder);
        //Assert.AreEqual(1, messInfoColl.Count);
        //Assert.AreEqual(subj1, messInfoColl[0].Subject);

        client1.ImpersonateUser(ItemChoice.PrimarySmtpAddress, "User2@exchange.conholdate.local");
        ExchangeMessageInfoCollection messInfoColl1 = client1.ListMessages(folder);
        //Assert.AreEqual(1, messInfoColl1.Count);
        //Assert.AreEqual(subj2, messInfoColl1[0].Subject);

        client1.ResetImpersonation();
        ExchangeMessageInfoCollection messInfoColl2 = client1.ListMessages(folder);
        //Assert.AreEqual(1, messInfoColl2.Count);
        //Assert.AreEqual(subj1, messInfoColl2[0].Subject);
    }
    finally
    {
        try
        {
            foreach (ExchangeMessageInfo messageInfo in client1.ListMessages(folder))
                client1.DeleteItem(messageInfo.UniqueUri, DeletionOptions.DeletePermanently);
            foreach (ExchangeMessageInfo messageInfo in client2.ListMessages(folder))
                client2.DeleteItem(messageInfo.UniqueUri, DeletionOptions.DeletePermanently);
        }
        catch { }
    }
}

Fonction Auto Discover avec EWS

L’API Aspose.Email vous permet de découvrir les paramètres du serveur Exchange en utilisant le client EWS. 

string email = "asposeemail.test3@aspose.com";
string password = "Aspose@2017";
AutodiscoverService svc = new AutodiscoverService();
svc.Credentials = new NetworkCredential(email, password);

IDictionary<UserSettingName, object> userSettings = svc.GetUserSettings(email, UserSettingName.ExternalEwsUrl).Settings;
string ewsUrl = (string)userSettings[UserSettingName.ExternalEwsUrl];
Console.WriteLine("Auto discovered EWS Url: "  + ewsUrl);

Abandonner la restauration PST sur le serveur Exchange

L’API Aspose.Email vous permet de restaurer un fichier PST sur le serveur Exchange. Cependant, si l’opération prend du temps en raison de la grande taille du fichier PST, il peut être nécessaire de spécifier un critère d’annulation de l’opération. Cela peut être réalisé en utilisant l’API comme indiqué dans le code d’exemple suivant.

Note : L’exemple nécessite également l’ajout de la classe suivante.


 public class CustomAbortRestoreException : Exception { }
using (IEWSClient client = EWSClient.GetEWSClient("https://exchange.office365.com/ews/exchange.asmx", "username", "password"))
{
    DateTime startTime = DateTime.Now;
    TimeSpan maxRestoreTime = TimeSpan.FromSeconds(15);
    int processedItems = 0;

    BeforeItemCallback callback = delegate
    {
        if (DateTime.Now >= startTime.Add(maxRestoreTime))
        {
            throw new CustomAbortRestoreException();
        }

        processedItems++;
    };

    try
    {
        //create a test pst and add some test messages to it
        var pst = PersonalStorage.Create(new MemoryStream(), FileFormatVersion.Unicode);
        var folder = pst.RootFolder.AddSubFolder("My test folder");
        for (int i = 0; i < 20; i++)
        {
            var message = new MapiMessage("from@gmail.com", "to@gmail.com", "subj", new string('a', 10000));
            folder.AddMessage(message);
        }

        //now restore the PST with callback
        client.Restore(pst, new Aspose.Email.Clients.Exchange.WebService.RestoreSettings
        {
            BeforeItemCallback = callback
        });
        Console.WriteLine("Success!");
    }
    catch (CustomAbortRestoreException)
    {
        Console.WriteLine($"Timeout! {processedItems}");
    }