Корисні функції

Надсилання повідомлення з варіантом голосування

Microsoft Outlook дозволяє користувачам створювати опитування під час складання нового повідомлення. Це здійснюється шляхом включення варіантів голосування, таких як Так, Ні, Можливо тощо. Клас FollowUpOptions, пропонований Aspose.Email, надає властивість VotingButtons, яку можна використовувати для встановлення або отримання значення варіантів голосування. У цій статті наведено детальний приклад створення MapiMessage з варіантами голосування для створення опитування та надсилання повідомлення за допомогою клієнта Exchange Web Service (EWS).

Створення та надсилання повідомлення з варіантами голосування

Наступний фрагмент коду показує, як створити нове повідомлення та надіслати його з варіантами голосування.

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

Прикладні методи, використані у прикладах

Наступний фрагмент коду показує, як використовувати методи, застосовані у наведеному вище прикладі.

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

Створення RE та FW повідомлень з файлів MSG

IEWSClient дозволяє розробникам створювати RE (Reply/Reply All) та FW (Forward) повідомлення з вихідного повідомлення. Вихідне повідомлення ідентифікується шляхом вибору певного ExchangeMessageInfo з ExchangeMessageInfoCollection отримано за допомогою IEWSClient.listMessages(). Інший аргумент — це фактичний MailMessage для надсилання як RE або FW повідомлення. Наступний фрагмент коду показує, як створити тестовий аккаунт, який використовується для надсилання повідомлення, після чого демонструються функції Reply та Forward щодо цього повідомлення. Щоб виконати це завдання:

  1. Ініціалізуйте об’єкт IEWSClient, надавши дійсні облікові дані.
  2. Надіслати кілька прикладних повідомлень.
  3. Викличте функції IEWSClient.reply(), IEWSClient.replyAll() і IEWSClient.forward() для надсилання повідомлень.
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());
}

Підтримка OAuth для EWS з Office 365

Aspose.Email API забезпечує підтримку Exchange Web Service (EWS) з Office 365. API‑ EWSClient інтерфейс надає перегружений метод, який забезпечує OAuthNetworkCredential як вхідні дані для доступу до облікового запису Exchange через OAuth. Користувач має вказати Authority, Client Id, Client App Uri та параметри Resource, щоб це працювало. Наступний фрагмент коду демонструє підтримку OAuth для EWS з 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();

Підтримка журналювання в клієнтах Exchange

Aspose.Email API надає можливість забезпечити журналювання клієнта Exchange Web Service.

Логування для клієнта EWS

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

Додавання заголовків у запити EWS

Aspose.Email API дозволяє додавати заголовки до запитів Exchange. Це можна використати для додавання різних заголовків до запитів EWS з різними цілями. Прикладом може бути додавання заголовка X-AnchorMailbox, який використовується для управління проблемами обмеження (throttling) на сервері Exchange. Метод addHeader інтерфейсу IEWSClient використовується для додавання заголовків до запитів EWS, як показано у наведеному фрагменті коду.

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

Повернути ідентифікатор запиту клієнта у заголовку

The return-client-request-id заголовок надсилається у запиті і використовується сервером для визначення, чи client-request-id заголовок, зазначений клієнтом, має бути повернутий у відповіді сервера. У цій операції використовуються такі методи:

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

Робота з уніфікованими повідомленнями

Aspose.Email може отримувати інформацію про уніфіковані повідомлення з 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) надсилає підказку під час складання, якщо один або кілька отримувачів встановили автоматичні відповіді. Для всіх функцій, продемонстрованих у цій статті, потрібен Service Pack 1 для Microsoft Exchange Server 2010. Наступний фрагмент коду показує, як використовувати 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");
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());
    }
}

Імперсонація Exchange

Імперсонація в Exchange дозволяє комусь діяти від імені іншого облікового запису та виконувати завдання і операції, використовуючи дозволи імперсонованого аккаунту замість своїх. У той час як делегування дозволяє користувачам діяти від імені інших, імперсонація дозволяє їм діяти як інші користувачі. Aspose.Email підтримує імперсонацію Exchange. EWSClient клас надає методи ImpersonateUser і ResetImpersonation для реалізації цієї функції.

Щоб виконати це завдання:

  1. Ініціалізувати ExchangeWebServiceClient для користувача 1.
  2. Ініціалізувати ExchangeWebServiceClient для користувача 2.
  3. Додати тестові повідомлення до облікових записів.
  4. Увімкнути імперсонацію.
  5. Скинути імперсонацію.

Наступний фрагмент коду показує, як використовувати EWSClient клас для реалізації функції імперсонації.

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

Функція Auto Discover за допомогою EWS

Aspose.Email API дозволяє виявити налаштування сервера Exchange за допомогою клієнта 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);

Переривання відновлення PST на сервер Exchange

Aspose.Email API дозволяє відновити файл PST на сервер Exchange. Однак, якщо операція триває довго через великий розмір PST‑файлу, може знадобитися задати критерій для переривання операції. Це можна реалізувати за допомогою API, як показано у наведеному прикладі коду.

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