Утиліти в Aspose.Email для .NET

Робота з уніфікованими повідомленнями

Aspose.Email може отримувати інформацію про уніфіковані повідомлення з Exchange Server 2010. Уніфіковані повідомлення, такі як отримання інформації про конфігурацію, ініціація вихідного виклику, отримання інформації про телефонний виклик за ID виклику та завершення виклику за ID, наразі підтримуються. Наведений приклад коду показує, як отримати конфігураційну інформацію уніфікованих повідомлень з Microsoft Exchange Server 2010.

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

Отримання підказок електронної пошти

Microsoft Exchange Server додав кілька нових функцій у Exchange Server 2010 та 2013. Одна з них дозволяє користувачам отримувати поради щодо листів під час складання повідомлення електронної пошти. Ці підказки дуже корисні, оскільки надають інформацію ще до відправки листа. Наприклад, якщо електронна адреса недійсна у списку отримувачів, відображається підказка про недійсність адреси. Підказки також дозволяють бачити відповіді "не в офісі" перед відправкою листа: Exchange Server (2010 та 2013) надсилає підказку під час складання листа, якщо один або кілька отримувачів встановили відповіді "не в офісі". Для всіх функцій, продемонстрованих у цій статті, потрібен Microsoft Exchange Server 2010 Service Pack 1. Нижче наведений приклад коду, який показує, як використовувати EWSClient клас, який використовує Exchange Web Services, доступний у Microsoft Exchange Server 2007 та пізніших версіях.

// 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);
    }
}

Імперсонація Exchange

Імперсонація в Exchange дозволяє комусь діяти від імені іншого облікового запису та виконувати завдання та операції, використовуючи дозволи імперсонованого облікового запису замість власних. У той час як делегування дозволяє користувачам діяти від імені інших користувачів, імперсонація дозволяє їм діяти як інші користувачі. Aspose.Email підтримує імперсонацію Exchange. EWSClient class надає ImpersonateUser і ResetImpersonation методи для впровадження цієї функції.

Щоб виконати це завдання:

  1. Ініціалізувати ExchangeWebServiceClient для користувача 1.
  2. Ініціалізувати ExchangeWebServiceClient для користувача 2.
  3. Додати тестові повідомлення до облікових записів.
  4. Увімкнути імперсонацію.
  5. Скинути імперсонацію.

Наступний фрагмент коду показує, як використовувати EWSClient клас для реалізації функції імперсонації.

// 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 { }
    }
}

Функція Auto Discover за допомогою EWS

Aspose.Email API дозволяє виявити налаштування сервера Exchange за допомогою клієнта 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);

Переривання відновлення PST на сервер Exchange

Aspose.Email API дозволяє відновити файл PST на сервер Exchange. Однак, якщо операція триває довго через великий розмір PST‑файлу, може знадобитися задати критерій для переривання операції. Це можна реалізувати за допомогою API, як показано у наведеному прикладі коду.

Примітка: У прикладі також потрібно додати наступний клас.


 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}");
    }