Recursos Utilitários no Aspose.Email para .NET

Trabalhando com Mensagens Unificadas

Aspose.Email pode recuperar informações de mensagens unificadas do Exchange Server 2010. Mensagens unificadas, como obter informações de configuração, iniciar uma chamada de saída, recuperar informações de chamada telefônica por ID de chamada e desconectar uma chamada por ID, são suportadas atualmente. O exemplo de código a seguir mostra como recuperar informações de configuração de mensagens unificadas do Microsoft Exchange Server 2010.

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

Obtendo Dicas de Correio

O Microsoft Exchange Server adicionou vários recursos novos com o Exchange Server 2010 e 2013. Um deles permite que os usuários recebam dicas de correio ao compor uma mensagem de email. Essas dicas são muito úteis, pois fornecem informações antes do envio do email. Por exemplo, se um endereço de email estiver errado na lista de destinatários, uma dica é exibida informando que o endereço é inválido. As dicas de correio também permitem visualizar respostas de fora do escritório antes de enviar um email: o Exchange Server (2010 & 2013) envia a dica de correio enquanto o email está sendo composto se um ou mais destinatários tiverem configurado respostas de fora do escritório. O Microsoft Exchange Server 2010 Service Pack 1 é necessário para todos os recursos demonstrados neste artigo. O trecho de código a seguir mostra como usar o EWSClient classe que usa o Exchange Web Services, disponível no Microsoft Exchange Server 2007 e versões posteriores.

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

Impersonação no Exchange

A personificação no Exchange permite que alguém personifique outra conta e execute tarefas e operações usando as permissões da conta personificada em vez das próprias. Enquanto a delegação permite que usuários atuem em nome de outros usuários, a Personificação permite que eles atuem como outros usuários. O Aspose.Email oferece suporte à Personificação no Exchange. O EWSClient classe fornece o ImpersonateUser e ResetImpersonation métodos para facilitar esse recurso.

Para executar esta tarefa:

  1. Inicializar o ExchangeWebServiceClient para o usuário 1.
  2. Inicializar o ExchangeWebServiceClient para o usuário 2.
  3. Anexar mensagens de teste às contas.
  4. Habilitar Impersonação.
  5. Redefinir Impersonação.

O trecho de código a seguir mostra como usar o EWSClient classe para implementar o recurso de Impersonação.

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

Recurso Auto Discover usando EWS

A API Aspose.Email permite descobrir as configurações do Exchange Server usando o cliente 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);

Abortar operação de restauração de PST para Exchange Server

A API Aspose.Email permite restaurar um arquivo PST para o Exchange Server. Contudo, se a operação estiver demorando muito devido ao tamanho grande do arquivo PST, pode ser necessário especificar um critério para abortar a operação. Isso pode ser feito usando a API conforme mostrado no código de exemplo a seguir.

Nota: O exemplo também requer que a seguinte classe seja adicionada.


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