Funzionalità di utilità

Invio di un messaggio con opzione di voto

Microsoft Outlook consente agli utenti di creare un sondaggio quando si compone un nuovo messaggio. Questo avviene includendo opzioni di voto come Sì, No, Forse, ecc. La classe FollowUpOptions offerta da Aspose.Email fornisce la proprietà VotingButtons che può essere usata per impostare o ottenere il valore delle opzioni di voto. Questo articolo fornisce un esempio dettagliato di creazione di un MapiMessage con opzioni di voto per creare un sondaggio e poi inviare il messaggio usando il client Exchange Web Service (EWS).

Creazione e invio di un messaggio con opzioni di voto

Il seguente frammento di codice mostra come creare un nuovo messaggio e poi inviarlo con opzioni di voto.

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

Metodi di esempio utilizzati negli esempi

Il seguente frammento di codice mostra come utilizzare i metodi usati nell’esempio sopra.

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

Creazione di messaggi RE e FW da file MSG

IEWSClient consente agli sviluppatori di creare messaggi RE (Reply/Reply All) e FW (Forward) da un messaggio sorgente. Il messaggio sorgente è identificato selezionando un particolare ExchangeMessageInfo da ExchangeMessageInfoCollection ottenuto da IEWSClient.listMessages(). L’altro argomento è il reale MailMessage da inviare come messaggio RE o FW. Il seguente frammento di codice mostra come creare un account di esempio usato per inviare un messaggio e poi le funzionalità di risposta e inoltro vengono dimostrate su quel messaggio di esempio. Per eseguire questa operazione:

  1. Inizializza l’oggetto IEWSClient fornendo credenziali valide.
  2. Invia alcuni messaggi di esempio.
  3. Chiama le funzioni IEWSClient.reply(), IEWSClient.replyAll() e IEWSClient.forward() per inviare messaggi.
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());
}

Supporto OAuth per EWS con Office 365

L’API Aspose.Email fornisce supporto per Exchange Web Service (EWS) con Office 365. L’API EWSClient l’interfaccia fornisce un metodo overload che fornisce il OAuthNetworkCredential come input per accedere all’account Exchange tramite OAuth. L’utente deve fornire Authority, Client Id, Client App Uri e i parametri Resource affinché funzioni. Il seguente frammento di codice mostra il supporto OAuth per 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();

Supporto alla registrazione nei client Exchange

L’API Aspose.Email offre la possibilità di fornire una funzionalità di registrazione per il client Exchange Web Service.

Registrazione per il client EWS

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

Aggiunta di header nelle richieste EWS

L’API Aspose.Email consente di aggiungere header alle richieste Exchange. Questo può essere usato per aggiungere header alle richieste EWS per diversi scopi. Un esempio è l’aggiunta dell’header X-AnchorMailbox, usato per gestire i problemi di throttling sul server Exchange. Il metodo addHeader di IEWSClient è usato per aggiungere header alle richieste EWS come mostrato nel seguente frammento di codice.

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

Restituisci l’ID della richiesta client nell’header

Il return-client-request-id l’header è inviato nella richiesta ed è usato dal server per determinare se il client-request-id l’header specificato dal client dovrebbe essere restituito nella risposta del server. I seguenti metodi sono utilizzati in questa operazione:

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

Lavorare con la messaggistica unificata

Aspose.Email può recuperare informazioni di messaggistica unificata da Exchange Server 2010. La messaggistica unificata, come il recupero delle informazioni di configurazione, l’avvio di una chiamata in uscita, il recupero delle informazioni di chiamata telefonica per ID chiamata e la disconnessione di una chiamata per ID, è attualmente supportata. Il seguente esempio di codice mostra come recuperare le informazioni di configurazione della messaggistica unificata da Microsoft Exchange Server 2010.

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

Ottenere suggerimenti di posta

Microsoft Exchange Server ha aggiunto diverse nuove funzionalità con Exchange Server 2010 e 2013. Una di queste consente agli utenti di ottenere suggerimenti di posta durante la composizione di un messaggio email. Questi suggerimenti sono molto utili poiché forniscono informazioni prima che l’email sia inviata. Ad esempio, se un indirizzo email è errato nella lista dei destinatari, viene mostrato un suggerimento per far sapere che l’indirizzo email non è valido. I suggerimenti di posta ti permettono anche di vedere le risposte fuori sede prima di inviare un’email: Exchange Server (2010 & 2013) invia il suggerimento di posta quando l’email è in fase di composizione se uno o più destinatari hanno impostato risposte fuori sede. È richiesto Microsoft Exchange Server 2010 Service Pack 1 per tutte le funzionalità illustrate in questo articolo. Il seguente frammento di codice mostra come utilizzare il EWSClient classe che utilizza Exchange Web Services, disponibile in Microsoft Exchange Server 2007 e versioni successive.

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

Impersonificazione di Exchange

L’impersonificazione di Exchange consente a qualcuno di impersonare un altro account ed eseguire attività e operazioni utilizzando i permessi dell’account impersonato invece dei propri. Dove la delega consente agli utenti di agire per conto di altri utenti, l’impersonificazione permette loro di agire come altri utenti. Aspose.Email supporta l’impersonificazione di Exchange. Il EWSClient classe fornisce i metodi ImpersonateUser e ResetImpersonation per facilitare questa funzionalità.

Per eseguire questa operazione:

  1. Inizializza ExchangeWebServiceClient per l’utente 1.
  2. Inizializza ExchangeWebServiceClient per l’utente 2.
  3. Aggiungi messaggi di test agli account.
  4. Abilita impersonificazione.
  5. Reimposta impersonificazione.

Il seguente frammento di codice mostra come utilizzare il EWSClient classe per implementare la funzionalità di impersonificazione.

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

Funzionalità Auto Discover tramite EWS

L’API Aspose.Email consente di scoprire le impostazioni del server Exchange utilizzando il client 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);

Annulla operazione di ripristino PST su Exchange Server

L’API Aspose.Email consente di ripristinare un file PST su Exchange Server. Tuttavia, se l’operazione richiede molto tempo a causa delle grandi dimensioni del file PST, potrebbe essere necessario specificare un criterio per annullare l’operazione. Questo può essere realizzato usando l’API come mostrato nel codice di esempio seguente.

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