Funkcje narzędziowe

Wysyłanie wiadomości z opcją głosowania

Microsoft Outlook umożliwia użytkownikom tworzenie ankiet podczas komponowania nowej wiadomości. Odbywa się to poprzez dołączenie opcji głosowania, takich jak Tak, Nie, Może itp. Klasa FollowUpOptions oferowana przez Aspose.Email dostarcza właściwość VotingButtons, którą można ustawić lub odczytać, aby określić opcje głosowania. Ten artykuł zawiera szczegółowy przykład tworzenia MapiMessage z opcjami głosowania w celu stworzenia ankiety oraz wysłania wiadomości przy użyciu klienta Exchange Web Service (EWS).

Tworzenie i wysyłanie wiadomości z opcjami głosowania

Poniższy fragment kodu pokazuje, jak utworzyć nową wiadomość i następnie wysłać ją z opcjami głosowania.

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

Przykładowe metody użyte w przykładach

Poniższy fragment kodu pokazuje, jak używać metod zastosowanych w powyższym przykładzie.

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

Tworzenie wiadomości RE i FW z plików MSG

IEWSClient pozwala programistom tworzyć wiadomości RE (Reply/Reply All) i FW (Forward) z wiadomości źródłowej. Wiadomość źródłowa jest identyfikowana poprzez wybranie określonego ExchangeMessageInfo z ExchangeMessageInfoCollection uzyskane przez IEWSClient.listMessages(). Drugi argument to faktyczny MailMessage do wysłania jako wiadomość RE lub FW. Poniższy fragment kodu pokazuje, jak utworzyć przykładowe konto używane do wysyłania wiadomości, a następnie zademonstrować funkcje Odpowiedź i Prześlij dalej względem tej przykładowej wiadomości. Aby wykonać to zadanie:

  1. Zainicjalizuj obiekt IEWSClient, podając prawidłowe poświadczenia.
  2. Wyślij kilka przykładowych wiadomości.
  3. Wywołaj funkcje IEWSClient.reply(), IEWSClient.replyAll() i IEWSClient.forward(), aby wysłać wiadomości.
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());
}

Obsługa OAuth dla EWS z Office 365

Aspose.Email API zapewnia wsparcie dla Exchange Web Service (EWS) w połączeniu z Office 365. API‑ EWSClient interfejs udostępnia przeciążoną metodę, która zapewnia OAuthNetworkCredential jako dane wejściowe do uzyskania dostępu do konta Exchange za pomocą OAuth. Użytkownik musi podać parametry Authority, Client Id, Client App Uri oraz Resource, aby to zadziałało. Poniższy fragment kodu pokazuje obsługę OAuth dla EWS z 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();

Obsługa logowania w klientach Exchange

Aspose.Email API zapewnia możliwość korzystania z funkcji logowania klienta Exchange Web Service.

Logowanie dla klienta EWS

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

Dodawanie nagłówków w żądaniach EWS

Aspose.Email API umożliwia dodawanie nagłówków do żądań Exchange. Można to wykorzystać do dodawania nagłówków do żądań EWS, które mogą służyć różnym celom. Przykładem może być dodanie nagłówka X-AnchorMailbox, używanego do zarządzania problemami z ograniczeniami (throttling) na serwerze Exchange. Metoda addHeader interfejsu IEWSClient jest używana do dodawania nagłówków do żądań EWS, jak pokazano w poniższym fragmencie kodu.

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

Zwróć identyfikator żądania klienta w nagłówku

Ten return-client-request-id nagłówek jest wysyłany w żądaniu i używany przez serwer do określenia, czy client-request-id nagłówek określony przez klienta powinien zostać zwrócony w odpowiedzi serwera. W tej operacji używane są następujące metody:

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

Praca z jednolitym systemem wiadomości

Aspose.Email może pobierać informacje o jednolitym systemie wiadomości z Exchange Server 2010. Obecnie obsługiwane jest jednolite wiadomościowanie, takie jak uzyskiwanie informacji konfiguracyjnych, inicjowanie połączenia wychodzącego, pobieranie informacji o połączeniach telefonicznych po ID połączenia oraz rozłączanie połączenia po ID. Poniższy przykład kodu pokazuje, jak pobrać informacje konfiguracyjne jednolitego systemu wiadomości z Microsoft Exchange Server 2010.

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

Uzyskiwanie wskazówek pocztowych

Microsoft Exchange Server dodał kilka nowych funkcji w wersjach Exchange Server 2010 i 2013. Jedną z nich jest możliwość wyświetlania wskazówek pocztowych podczas komponowania wiadomości e‑mail. Wskazówki te są bardzo przydatne, ponieważ dostarczają informacji przed wysłaniem wiadomości. Na przykład, jeśli adres e‑mail jest nieprawidłowy na liście odbiorców, wyświetlana jest wskazówka informująca o nieważnym adresie. Wskazówki pocztowe umożliwiają także podgląd odpowiedzi automatycznych „poza biurem” przed wysłaniem wiadomości: Exchange Server (2010 i 2013) wysyła wskazówkę, gdy wiadomość jest tworzona, jeśli jeden lub więcej odbiorców ma włączone odpowiedzi poza biurem. Microsoft Exchange Server 2010 Service Pack 1 jest wymagany dla wszystkich funkcji pokazanych w tym artykule. Poniższy fragment kodu pokazuje, jak używać EWSClient klasa używająca Exchange Web Services, dostępna w Microsoft Exchange Server 2007 i nowszych wersjach.

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

Impersonacja Exchange

Impersonacja w Exchange pozwala osobie na udawanie innego konta i wykonywanie zadań oraz operacji z uprawnieniami udawanego konta zamiast własnych. Gdzie delegowanie pozwala użytkownikom działać w imieniu innych, impersonacja pozwala im działać jako inni użytkownicy. Aspose.Email obsługuje impersonację w Exchange. EWSClient klasa udostępnia metody ImpersonateUser i ResetImpersonation ułatwiające tę funkcję.

Aby wykonać to zadanie:

  1. Zainicjuj ExchangeWebServiceClient dla użytkownika 1.
  2. Zainicjuj ExchangeWebServiceClient dla użytkownika 2.
  3. Dodaj testowe wiadomości do kont.
  4. Włącz impersonację.
  5. Resetuj impersonację.

Poniższy fragment kodu pokazuje, jak używać EWSClient klasa implementująca funkcję Impersonacji.

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

Funkcja Auto Discover przy użyciu EWS

Aspose.Email API pozwala odkrywać ustawienia serwera Exchange przy użyciu klienta 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);

Anulowanie przywracania PST na serwer Exchange

Aspose.Email API umożliwia przywrócenie pliku PST na serwer Exchange. Jednak jeśli operacja trwa długo z powodu dużego rozmiaru pliku PST, może być konieczne określenie kryteriów przerwania operacji. Można to osiągnąć przy użyciu API, jak pokazano w poniższym przykładzie kodu.

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