Funciones de utilidad

Enviando un mensaje con opción de votación

Microsoft Outlook permite a los usuarios crear una encuesta al redactar un nuevo mensaje. Esto se logra incluyendo opciones de votación como Sí, No, Tal vez, etc. La clase FollowUpOptions ofrecida por Aspose.Email proporciona la propiedad VotingButtons que puede usarse para establecer u obtener el valor de las opciones de votación. Este artículo brinda un ejemplo detallado de cómo crear un MapiMessage con opciones de votación para crear una encuesta y luego enviar el mensaje usando el cliente Exchange Web Service (EWS).

Crear y enviar un mensaje con opciones de votación

El siguiente fragmento de código muestra cómo crear un nuevo mensaje y luego enviarlo con opciones de votación.

String address = "firstname.lastname@aspose.com";

IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", "testUser", "pwd", "domain");
MailMessage message = createTestMessage(address);

// Set FollowUpOptions Buttons
FollowUpOptions options = new FollowUpOptions();
options.setVotingButtons("Yes;No;Maybe;Exactly!");

client.send(message, options);

Métodos de muestra usados en los ejemplos

El siguiente fragmento de código muestra cómo usar los métodos empleados en el ejemplo anterior.

private static MailMessage createTestMessage(String address) {
    MailMessage eml = new MailMessage(address, address, "Flagged message",
            "Make it nice and short, but descriptive. The description may appear in search engines' search results pages...");

    return eml;
}

Creando mensajes RE y FW a partir de archivos MSG

IEWSClient permite a los desarrolladores crear mensajes RE (Responder/Responder a todos) y FW (Reenviar) a partir de un mensaje fuente. El mensaje fuente se identifica seleccionando un ExchangeMessageInfo de ExchangeMessageInfoCollection obtenido por IEWSClient.listMessages(). El otro argumento es el real MailMessage para ser enviados como mensaje RE o FW. El siguiente fragmento de código muestra cómo crear una cuenta de muestra que se usa para enviar un mensaje y luego se demuestran las funciones de Responder y Reenviar sobre ese mensaje de muestra. Para realizar esta tarea:

  1. Inicialice el objeto IEWSClient proporcionando credenciales válidas.
  2. Enviar algunos mensajes de ejemplo.
  3. Llame a las funciones IEWSClient.reply(), IEWSClient.replyAll() y IEWSClient.forward() para enviar mensajes.
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);

try {
    MailMessage message = new MailMessage("user@domain.com", "user@domain.com", "TestMailRefw - " + UUID.randomUUID().toString(),
            "TestMailRefw Implement ability to create RE and FW messages from source MSG file");

    client.send(message);

    ExchangeMessageInfoCollection messageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());
    if (messageInfoCol.size() == 1)
        System.out.println("1 message in Inbox");
    else
        System.out.println("Error! No message in Inbox");

    MailMessage message1 = new MailMessage("user@domain.com", "user@domain.com", "TestMailRefw - " + UUID.randomUUID().toString(),
            "TestMailRefw Implement ability to create RE and FW messages from source MSG file");

    client.send(message1);
    messageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());

    if (messageInfoCol.size() == 2)
        System.out.println("2 messages in Inbox");
    else
        System.out.println("Error! No new message in Inbox");

    MailMessage message2 = new MailMessage("user@domain.com", "user@domain.com", "TestMailRefw - " + UUID.randomUUID().toString(),
            "TestMailRefw Implement ability to create RE and FW messages from source MSG file");
    message2.getAttachments().addItem(Attachment.createAttachmentFromString("Test attachment 1", "Attachment Name 1"));
    message2.getAttachments().addItem(Attachment.createAttachmentFromString("Test attachment 2", "Attachment Name 2"));

    // Reply, Replay All and forward Message
    client.reply(message2, messageInfoCol.get_Item(0));
    client.replyAll(message2, messageInfoCol.get_Item(0));
    client.forward(message2, messageInfoCol.get_Item(0));
} catch (java.lang.RuntimeException ex) {
    System.out.println("Error in program" + ex.getMessage());
}

Soporte OAuth para EWS con Office 365

La API Aspose.Email brinda soporte para Exchange Web Service (EWS) con Office 365. Las EWSClient la interfaz proporciona un método sobrecargado que ofrece el OAuthNetworkCredential como entrada para acceder a la cuenta Exchange vía OAuth. El usuario debe proporcionar los parámetros Authority, Client Id, Client App Uri y Resource para que funcione. El siguiente fragmento de código muestra el soporte OAuth para EWS con Office 365.

// token provider
/*ITokenProvider provider = new ITokenProvider() {

    @Override
    public void dispose() {
    }

    @Override
    public OAuthToken getAccessToken(boolean ignoreExistingToken) {
        return null;
    }

    @Override
    public OAuthToken getAccessToken() {
        return null;
    }
};

NetworkCredential credentials = new OAuthNetworkCredential(provider);*/

// accessToken
NetworkCredential credentials = new OAuthNetworkCredential("accessToken");

IEWSClient client = EWSClient.getEWSClient("https://outlook.office365.com/ews/exchange.asmx", credentials);
client.listMessages();

Soporte de registro en clientes Exchange

La API Aspose.Email brinda la capacidad de proporcionar una funcionalidad de registro para el cliente de Exchange Web Service.

Registro para cliente EWS

client.setLogFileName("logs/ews");
// OR
EWSClient.setCommonLogFileName("logs/ews");

Agregar encabezados en solicitudes EWS

La API Aspose.Email permite agregar encabezados a las solicitudes de Exchange. Esto puede usarse para añadir encabezados a las solicitudes EWS para diferentes propósitos. Un ejemplo de esto podría ser agregar el encabezado X-AnchorMailbox que se usa para gestionar problemas de limitación en el servidor Exchange. El método addHeader del IEWSClient se usa para agregar encabezados a las solicitudes EWS como se muestra en el siguiente fragmento de código.

final IEWSClient client = EWSClient.getEWSClient("exchange.domain.com/ews/Exchange.asmx", "username", "password", "");
try {
    client.addHeader("X-AnchorMailbox", "username@domain.com");
    ExchangeMessageInfoCollection messageInfoCol = client.listMessages(client.getMailboxInfo().getInboxUri());
} finally {
    client.dispose();
}

Devolver el ID de solicitud del cliente en el encabezado

El return-client-request-id El encabezado se envía en la solicitud y es usado por el servidor para determinar si el client-request-id El encabezado especificado por el cliente debe devolverse en la respuesta del servidor. Los siguientes métodos se usan en esta operación:

try (IEWSClient client = createEWSClient())
{
    // Client will create random id and pass it to the server.
    // The server should include this id in request-id header of all responses.
    client.setReturnClientRequestId(true);
    
    client.setLogFileName("ews.log");
    client.getMailboxInfo();
}

Trabajando con mensajería unificada

Aspose.Email puede recuperar información de mensajería unificada del Exchange Server 2010. Mensajería unificada como obtener información de configuración, iniciar una llamada saliente, recuperar información de llamadas telefónicas por ID de llamada y desconectar una llamada telefónica por ID está soportada actualmente. El siguiente ejemplo de código muestra cómo recuperar la información de configuración de mensajería unificada del Microsoft Exchange Server 2010.

IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);
UnifiedMessagingConfiguration umConf = client.getUMConfiguration();

Obteniendo consejos de correo

Microsoft Exchange Server añadió varias funciones nuevas con Exchange Server 2010 y 2013. Una de ellas permite a los usuarios obtener consejos de correo al redactar un mensaje de correo electrónico. Estos consejos son muy útiles ya que proporcionan información antes de enviar el correo. Por ejemplo, si una dirección de correo es incorrecta en la lista de destinatarios, se muestra un consejo para informarle que la dirección de correo es inválida. Los consejos de correo también permiten ver respuestas fuera de la oficina antes de enviar un correo: Exchange Server (2010 y 2013) envía el consejo de correo mientras se redacta el correo si uno o más destinatarios tienen respuestas fuera de la oficina configuradas. Se requiere Microsoft Exchange Server 2010 Service Pack 1 para todas las funciones demostradas en este artículo. El siguiente fragmento de código muestra cómo usar el EWSClient clase que usa Exchange Web Services, disponible en Microsoft Exchange Server 2007 y versiones posteriores.

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

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

// Display information about each Mail Tip
for (MailTips tip : tips) {
    // Display Out of office message, if present
    if (tip.getOutOfOffice() != null) {
        System.out.println("Out of office: " + tip.getOutOfOffice().getReplyBody().getMessage());
    }

    // Display the invalid email address in recipient, if present
    if (tip.getInvalidRecipient() == true) {
        System.out.println("The recipient address is invalid: " + tip.getRecipientAddress());
    }
}

Suplantación en Exchange

La suplantación en Exchange permite a alguien suplantar otra cuenta y realizar tareas y operaciones usando los permisos de la cuenta suplantada en lugar de los propios. Donde la delegación permite a los usuarios actuar en nombre de otros, la suplantación les permite actuar como otros usuarios. Aspose.Email admite la suplantación en Exchange. El EWSClient la clase proporciona los métodos ImpersonateUser y ResetImpersonation para facilitar esta función.

Para realizar esta tarea:

  1. Inicializar el ExchangeWebServiceClient para el usuario 1.
  2. Inicializar el ExchangeWebServiceClient para el usuario 2.
  3. Agregar mensajes de prueba a las cuentas.
  4. Habilitar suplantación.
  5. Restablecer suplantación.

El siguiente fragmento de código muestra cómo usar el EWSClient clase para implementar la función de suplantación.

// 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 {
        for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) client1.listMessages(folder))
            client1.deleteItem(messageInfo.getUniqueUri(), DeletionOptions.getDeletePermanently());
        String subj1 = "NETWORKNET_33354 User User1";
        client1.appendMessage(folder, new MailMessage("User1@exchange.conholdate.local", "To@aspsoe.com", subj1, ""));

        for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) client2.listMessages(folder))
            client2.deleteItem(messageInfo.getUniqueUri(), DeletionOptions.getDeletePermanently());
        String subj2 = "NETWORKNET_33354 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 {
            for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) client1.listMessages(folder))
                client1.deleteItem(messageInfo.getUniqueUri(), DeletionOptions.getDeletePermanently());
            for (ExchangeMessageInfo messageInfo : (Iterable<ExchangeMessageInfo>) client2.listMessages(folder))
                client2.deleteItem(messageInfo.getUniqueUri(), DeletionOptions.getDeletePermanently());
        } catch (java.lang.RuntimeException e) {
        }
    }
}

Funcionalidad Auto Discover usando EWS

La API Aspose.Email le permite descubrir la configuración del servidor Exchange usando el cliente EWS. 

AutodiscoverService svc = new AutodiscoverService();
svc.setCredentials(new NetworkCredential(email, password));

IGenericDictionary</* UserSettingName */Integer, Object> userSettings = svc.getUserSettings(email, UserSettingName.ExternalEwsUrl).getSettings();
String ewsUrl = (String) userSettings.get_Item(UserSettingName.ExternalEwsUrl);
System.out.println("Auto discovered EWS Url: " + ewsUrl);

Abortar restauración de PST a Exchange Server

La API Aspose.Email le permite restaurar un archivo PST en Exchange Server. Sin embargo, si la operación lleva mucho tiempo debido al gran tamaño del archivo PST, puede ser necesario especificar un criterio para abortar la operación. Esto se puede lograr usando la API como se muestra en el siguiente código de ejemplo.

final IEWSClient client = EWSClient.getEWSClient("https://exchange.office365.com/ews/exchange.asmx", "username", "password");
try {
    final long startTime = System.currentTimeMillis();
    final AtomicInteger processedItems = new AtomicInteger(0);
    final long S15 = 15 * 1000;

    BeforeItemCallback callback = new BeforeItemCallback() {
        public void invoke(ItemCallbackArgs item) {
            if (System.currentTimeMillis() - startTime > S15) {
                throw new AbortRestoreException();
            }

            processedItems.incrementAndGet();
        }
    };

    try {
        // create a test pst and add some test messages to it
        PersonalStorage pst = PersonalStorage.create(new ByteArrayOutputStream(), FileFormatVersion.Unicode);
        FolderInfo folder = pst.getRootFolder().addSubFolder("My test folder");
        for (int i = 0; i < 20; i++) {
            MapiMessage message = new MapiMessage("from@gmail.com", "to@gmail.com", "subj", "body");
            folder.addMessage(message);
        }
        RestoreSettings rs = new RestoreSettings();
        rs.setBeforeItemCallback(callback);

        // now restore the PST with callback
        client.restore(pst, rs);
        System.out.println("Success!");
    } catch (AbortRestoreException e) {
        System.out.println("Timeout! " + processedItems.get());
    }
} finally {
    client.dispose();
}