Recursos Utilitários
Enviando uma Mensagem com Opção de Votação
Microsoft Outlook permite que os usuários criem uma pesquisa ao compor uma nova mensagem. Isso é feito incluíndo opções de votação como Sim, Não, Talvez, etc. A classe FollowUpOptions oferecida pela Aspose.Email fornece a propriedade VotingButtons que pode ser usada para definir ou obter o valor das opções de votação. Este artigo fornece um exemplo detalhado de como criar um MapiMessage com opções de votação para criar uma pesquisa e depois enviar a mensagem usando o cliente Exchange Web Service (EWS).
Criando e Enviando uma Mensagem com Opções de Votação
O trecho de código a seguir mostra como criar uma nova mensagem e enviá‑la com opções de votação.
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);
Métodos de Exemplo Usados em Exemplos
O trecho de código a seguir mostra como usar os métodos empregados no exemplo acima.
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;
}
Criando mensagens RE e FW a partir de arquivos MSG
IEWSClient permite que desenvolvedores criem mensagens RE (Responder/Responder a Todos) e FW (Encaminhar) a partir de uma mensagem de origem. A mensagem de origem é identificada ao selecionar um determinado ExchangeMessageInfo de ExchangeMessageInfoCollection obtido por IEWSClient.listMessages(). O outro argumento é o real MailMessage para ser enviado como mensagem RE ou FW. O trecho de código a seguir mostra como criar uma conta de exemplo usada para enviar uma mensagem e então as funcionalidades de Responder e Encaminhar são demonstradas nessa mensagem de exemplo. Para realizar esta tarefa:
- Inicialize o objeto IEWSClient fornecendo credenciais válidas.
- Envie algumas mensagens de exemplo.
- Chame as funções IEWSClient.reply(), IEWSClient.replyAll() e IEWSClient.forward() para enviar mensagens.
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());
}
Suporte OAuth para EWS com Office 365
A API Aspose.Email oferece suporte ao Exchange Web Service (EWS) com Office 365. O EWSClient interface fornece método sobrecarregado que fornece o OAuthNetworkCredential como entrada para acessar a conta Exchange via OAuth. O usuário precisa fornecer os parâmetros Authority, Client Id, Client App Uri e Resource para que isso funcione. O trecho de código a seguir mostra o Suporte OAuth para EWS com 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();
Suporte a Registro em Clientes Exchange
A API Aspose.Email fornece a capacidade de oferecer recursos de registro para o cliente Exchange Web Service.
Registro para Cliente EWS
client.setLogFileName("logs/ews");
// OR
EWSClient.setCommonLogFileName("logs/ews");
Adicionando Cabeçalhos nas Solicitações EWS
A API Aspose.Email permite adicionar cabeçalhos a solicitações do Exchange. Isso pode ser usado para acrescentar cabeçalhos às solicitações EWS para diferentes fins. Um exemplo seria adicionar o cabeçalho X-AnchorMailbox, que é usado para gerenciar problemas de limitação no servidor Exchange. O método addHeader do IEWSClient é usado para adicionar cabeçalhos às solicitações EWS conforme mostrado no trecho de código a seguir.
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();
}
Retornar o ID da Solicitação do Cliente no Cabeçalho
O return-client-request-id O cabeçalho é enviado na solicitação e usado pelo servidor para determinar se o client-request-id O cabeçalho especificado pelo cliente deve ser retornado na resposta do servidor. Os métodos a seguir são usados nessa operação:
- getReturnClientRequestId()
- setReturnClientRequestId(boolean value) - Obter ou definir um sinalizador para indicar se o cliente requer que o lado do servidor retorne o ID da solicitação.
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();
}
Trabalhando com Mensagens Unificadas
Aspose.Email pode recuperar informações de mensagens unificadas do Exchange Server 2010. Mensagens unificadas, como obter informações de configuração, iniciar uma chamada de saída, recuperar informações de chamada telefônica por ID de chamada e desconectar uma chamada por ID, são suportadas atualmente. O exemplo de código a seguir mostra como recuperar informações de configuração de mensagens unificadas do Microsoft Exchange Server 2010.
IEWSClient client = EWSClient.getEWSClient(mailboxUri, credential);
UnifiedMessagingConfiguration umConf = client.getUMConfiguration();
Obtendo Dicas de Correio
O Microsoft Exchange Server adicionou vários recursos novos nas versões Exchange Server 2010 e 2013. Um deles permite que os usuários obtenham dicas de correio ao compor uma mensagem de email. Essas dicas são muito úteis, pois fornecem informações antes do email ser enviado. Por exemplo, se um endereço de email estiver incorreto na lista de destinatários, uma dica é exibida informando que o endereço é inválido. Dicas de correio também permitem que você veja respostas de fora do escritório antes de enviar um email: o Exchange Server (2010 & 2013) envia a dica de correio enquanto o email está sendo composto se um ou mais destinatários tiverem configurado respostas de fora do escritório. O Service Pack 1 do Microsoft Exchange Server 2010 é necessário para todos os recursos demonstrados neste artigo. O trecho de código a seguir mostra como usar o EWSClient classe que usa o Exchange Web Services, disponível no Microsoft Exchange Server 2007 e versões posteriores.
// 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());
}
}
Impersonação no Exchange
A impersonação no Exchange permite que alguém se passe por outra conta e execute tarefas e operações usando as permissões da conta impersonificada em vez das próprias. Enquanto a delegação permite que usuários ajam em nome de outros usuários, a Impersonação permite que atuem como outros usuários. Aspose.Email suporta Impersonação no Exchange. O EWSClient classe fornece os métodos ImpersonateUser e ResetImpersonation para facilitar esse recurso.
Para executar esta tarefa:
- Inicializar o ExchangeWebServiceClient para o usuário 1.
- Inicializar o ExchangeWebServiceClient para o usuário 2.
- Anexar mensagens de teste às contas.
- Habilitar Impersonação.
- Redefinir Impersonação.
O trecho de código a seguir mostra como usar o EWSClient classe para implementar o recurso de Impersonação.
// 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) {
}
}
}
Recurso Auto Discover usando EWS
A API Aspose.Email permite descobrir as configurações do Exchange Server usando o cliente 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);
Abortar operação de restauração de PST para Exchange Server
A API Aspose.Email permite restaurar um arquivo PST para o Exchange Server. Contudo, se a operação estiver demorando muito devido ao tamanho grande do arquivo PST, pode ser necessário especificar um critério para abortar a operação. Isso pode ser feito usando a API conforme mostrado no código de exemplo a seguir.
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();
}