Вспомогательные функции в Aspose.Email для .NET

Работа с Unified Messaging

Aspose.Email может получать информацию о едином обмене сообщениями (Unified Messaging) с сервера 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. The EWSClient class предоставляет ImpersonateUser и ResetImpersonation методы для реализации этой функции.

Для выполнения этой задачи:

  1. Инициализировать ExchangeWebServiceClient для пользователя 1.
  2. Инициализировать ExchangeWebServiceClient для пользователя 2.
  3. Добавить тестовые сообщения к учетным записям.
  4. Включить имитацию.
  5. Сбросить имитацию.

Следующий фрагмент кода показывает, как использовать EWSClient класс для реализации функции имитации (Impersonation).

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