ユーティリティ機能

投票オプション付きメッセージの送信

Microsoft Outlookは、新規メッセージ作成時に投票(アンケート)を作成できるようにします。これは、Yes、No、Maybeなどの投票オプションを含めることで実現します。Aspose.Emailが提供するFollowUpOptionsクラスは、投票オプションの値を設定または取得できる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;
}

MSGファイルからREおよびFWメッセージを作成

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

Office 365向けEWSのOAuthサポート

Aspose.Email APIは、Office 365向けのExchange Web Service(EWS)をサポートしています。APIの EWSClient インターフェイスは、オーバーロードメソッドを提供し、 OAuthNetworkCredential OAuthを介してExchangeアカウントにアクセスするための入力として。ユーザーはAuthority、Client Id、Client App Uri、Resourceパラメータを提供する必要があります。以下のコードスニペットは、Office 365でのEWS向けOAuthサポートを示しています。

// 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リクエストに追加できます。例として、Exchangeサーバーのスロットリング問題を管理するために使用されるX-AnchorMailboxヘッダーの追加があります。以下のコードスニペットに示すように、IEWSClientのaddHeaderメソッドを使用して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();
}

ヘッダーにクライアントリクエストIDを返す

この 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)は、受信者のうち一人以上が外出先応答を設定している場合、メール作成中にチップを送信します。本記事で示すすべての機能には、Microsoft Exchange Server 2010 Service Pack 1が必要です。以下のコードスニペットは、これを使用する方法を示しています。 EWSClient Microsoft Exchange Server 2007以降で利用可能なExchange Web Servicesを使用するクラスです。

// 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. ユーザー1用にExchangeWebServiceClientを初期化。
  2. ユーザー2用にExchangeWebServiceClientを初期化。
  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) {
        }
    }
}

EWSによる自動検出機能

Aspose.Email APIを使用すると、EWSクライアントでExchangeサーバーの設定を検出できます。 

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

ExchangeサーバーへのPST復元操作を中止

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