实用功能

发送带投票选项的消息

Microsoft Outlook 允许用户在撰写新邮件时创建投票(投票)。通过包含诸如“是”“否”“也许”等投票选项实现。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(回复/回复全部)和 FW(转发)消息。通过选择特定的 ExchangeMessageInfo 来自 ExchangeMessageInfoCollection 通过 IEWSClient.listMessages() 获取。另一个参数是真实的 MailMessage 作为 RE(回复)或 FW(转发)消息发送。以下代码片段展示了如何创建一个示例账户用于发送消息,然后演示对该示例消息的回复和转发功能。执行此任务的步骤如下:

  1. 通过提供有效凭据初始化 IEWSClient 对象。
  2. 发送几条示例消息。
  3. 调用 IEWSClient.reply()、IEWSC client.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 请求添加不同用途的标头。例如,可添加 X-AnchorMailbox 标头以管理 Exchange 服务器的限流问题。如下代码片段所示,使用 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 在 2010 和 2013 版本中添加了多项新功能。其中之一是在撰写电子邮件时提供邮件提示。这些提示在邮件发送前提供有用信息。例如,如果收件人列表中的电子邮件地址错误,系统会显示提示告知地址无效。邮件提示还可以在发送邮件前查看外出办事回复:如果一个或多个收件人设置了外出办事回复,Exchange Server(2010 与 2013)在撰写邮件时会发送相应的提示。本文演示的所有功能均需 Microsoft Exchange Server 2010 Service Pack 1。以下代码片段展示了如何使用 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. 为用户 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);

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