实用功能
发送带投票选项的消息
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(转发)消息发送。以下代码片段展示了如何创建一个示例账户用于发送消息,然后演示对该示例消息的回复和转发功能。执行此任务的步骤如下:
- 通过提供有效凭据初始化 IEWSClient 对象。
- 发送几条示例消息。
- 调用 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 客户端指定的标头应在服务器响应中返回。此操作使用以下方法:
- getReturnClientRequestId()
- setReturnClientRequestId(boolean value) - 获取或设置标志,以指示客户端是否需要服务器返回请求 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 初始化 ExchangeWebServiceClient。
- 为用户 2 初始化 ExchangeWebServiceClient。
- 向账号追加测试消息。
- 启用模拟。
- 重置模拟。
下面的代码片段展示了如何使用 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();
}