Como usar GraphClient para Microsoft Graph

Trabalhando com GraphClient

Uma instância da classe IGraphClient gerencia a construção de solicitações, o envio delas para a API do Microsoft Graph e o processamento das respostas.

Criar um Objeto ITokenProvider

Para criar uma nova instância da classe IGraphClient, você precisa fornecer uma instância de ITokenProvider, que pode autenticar solicitações ao Microsoft Graph.

ITokenProvider tokenProvider = new ITokenProvider() {
    Date expirationDate = null;

    @Override
    public void dispose() {
    }

    @Override
    public OAuthToken getAccessToken(boolean ignoreExistingToken) {
        // Obtém o token de acesso oAuth.
        // Se ignoreExistingToken for verdadeiro, solicita um novo token a partir de um servidor. Caso contrário, o comportamento depende de o token existir ou não.
        // Se o token existir e sua data de expiração não estiver expirada, retorna o token atual, caso contrário, solicita um novo token a partir de um servidor.
        return null;
    }

    @Override
    public OAuthToken getAccessToken() {
        // Obtém o token de acesso oAuth.
        // Se o token existir e sua data de expiração não estiver expirada, retorna o token atual, caso contrário, solicita um novo token a partir de um servidor.
        return new OAuthToken("token", expirationDate);
    }
};

Obter um objeto GraphClient

Após definir o TokenProvider, você deve obter um objeto IGraphClient para fazer solicitações contra o serviço. Depois de ter um IGraphClient autenticado, você pode começar a fazer chamadas contra o serviço.

IGraphClient client = GraphClient.getClient(tokenProvider);

Trabalhar com Pastas usando Microsoft Graph

Listar Pastas

GraphFolderInfoCollection folders = client.listFolders();
for (GraphFolderInfo folderInfo : folders) {
    System.out.println(folderInfo.getDisplayName());
    for (KeyValuePair<Long, MapiProperty> prop : folderInfo.getProperties()) {
        System.out.println(prop.getValue().getDescriptor().toString() + " " + prop.getValue().getString());
    }
}

Listar Subpastas da Pasta de Entrada

GraphFolderInfoCollection inboxFolders = client.listFolders(GraphKnownFolders.Inbox);

Criar Pasta Raiz

GraphFolderInfo newFolder = client.createFolder("TEST_FOLDER");

Criar Subpasta

GraphFolderInfo inboxTestSubFolder1 = client.createFolder(GraphKnownFolders.Inbox, "TEST_SUBFOLDER_1");
GraphFolderInfo inboxTestSubFolder2 = client.createFolder(newFolder.getItemId(), "TEST_SUBFOLDER_2");

Obter Pasta

GraphFolderInfo sentItemsFolder = client.getFolder(GraphKnownFolders.SentItems);

Atualizar Pasta

GraphFolderInfo originalFolder = client.createFolder("TEST_FOLDER");
originalFolder.setDisplayName("NEW_TEST_FOLDER");
GraphFolderInfo updatedFolder = client.updateFolder(originalFolder);

Copiar Pasta e Conteúdo

GraphFolderInfo parentFolder = client.createFolder("PARENT_FOLDER");
GraphFolderInfo testFolder = client.createFolder("TEST_FOLDER");
GraphFolderInfo testSubFolder = client.createFolder(testFolder.getItemId(), "TEST_SUBFOLDER");

MapiMessage message = new MapiMessage();
message.setSubject("Test subject");
message.setBody("Test body");
message.setProperty(KnownPropertyList.DISPLAY_TO, "to@host.com");
message.setProperty(KnownPropertyList.SENDER_NAME, "from");
message.setProperty(KnownPropertyList.SENT_REPRESENTING_EMAIL_ADDRESS, "from@host.com");
MapiMessage createdMessage = client.createMessage(testSubFolder.getItemId(), message);

GraphFolderInfo folderCopy = client.copyFolder(parentFolder.getItemId(), testFolder.getItemId());

GraphFolderInfoCollection folderColl = client.listFolders(parentFolder.getItemId());
// TEST_FOLDER
System.out.println(folderColl.get(0).getDisplayName());

folderColl = client.listFolders(folderColl.get(0).getItemId());
// TEST_SUBFOLDER
System.out.println(folderColl.get(0).getDisplayName());

GraphMessageInfoCollection listMessages = client.listMessages(folderColl.get(0).getItemId());
// Test subject
System.out.println(listMessages.get(0).getSubject());

Mover Pasta e Conteúdo

GraphFolderInfo folder = client.moveFolder(parentFolder.getItemId(), testFolder.getItemId());

Deletar Pasta

client.delete(testFolder.getItemId());

Listar Mensagens usando Microsoft Graph

GraphMessageInfoCollection messageInfoColl = client.listMessages(GraphKnownFolders.Inbox);
for (GraphMessageInfo messageInfo : messageInfoColl) {
    MapiMessage message = client.fetchMessage(messageInfo.getItemId());
}

Listar Mensagens por Data de Envio

O recurso OrderBy é utilizado para indicar que as mensagens devem ser ordenadas em ordem crescente pela data de envio. Isso permite ao cliente recuperar a lista de mensagens da pasta GraphKnownFolders.Inbox em uma ordem específica, neste caso, com base na data de envio.

O seguinte exemplo de código demonstra como criar uma consulta que especifica a ordenação das mensagens pela data de envio e, em seguida, usar essa consulta para buscar uma página de mensagens da pasta de Entrada usando a API Graph:

// criar consulta orderby mensagens 'ASC'
GraphQueryBuilder builder = new GraphQueryBuilder();
builder.getSentDate().orderBy(true);
MailQuery query = builder.getQuery();

GraphMessagePageInfo pageInfo = client.listMessages(GraphKnownFolders.Inbox, new PageInfo(10), query);

Buscar Mensagem

GraphMessageInfo messageInfo = messageInfoColl.get(0);
MapiMessage fetchedMessage = client.fetchMessage(messageInfo.getItemId());

Paginação na Listagem de Mensagens

A API fornece suporte para paginação e filtragem na listagem de mensagens. Isso é muito útil quando uma caixa de entrada possui um grande número de mensagens e requer muito tempo para recuperar as informações resumidas sobre elas. O exemplo de código abaixo mostrará como usar a paginação para grandes conjuntos de mensagens ao listar mensagens do Exchange Server usando IGraphClient:

// enviar mensagens de teste de ping
for (int i = 0; i < 5; i++) {
    MailMessage eml = new MailMessage(user.EMail, user.EMail, "ping" + i, "corpo do teste");
    client.send(MapiMessage.fromMailMessage(eml));
}
// esperando pela caixa de entrada
Thread.sleep(10000);

// opção de paginação
int itemsPerPage = 2;
// criar filtro para mensagens não lidas
GraphQueryBuilder builder = new GraphQueryBuilder();
builder.isRead().equals(false);
MailQuery query = builder.getQuery();

// listar mensagens
GraphMessagePageInfo pageInfo = client.listMessages(GraphKnownFolders.Inbox, new PageInfo(itemsPerPage), query);
GraphMessageInfoCollection messages = pageInfo.getItems();
while (!pageInfo.getLastPage())
{
    pageInfo = client.listMessages(GraphKnownFolders.Inbox, pageInfo.getNextPage(), query);
    // adicionar itens da próxima página à coleção comum
    messages.addRange(pageInfo.getItems());
}

// definir estado das mensagens como lidas
for (GraphMessageInfo message : messages) {
    client.setRead(message.getItemId());
}

Criar Mensagem

MapiMessage message = new MapiMessage();
message.setSubject("Assunto");
message.setBody("Corpo");
message.setProperty(KnownPropertyList.DISPLAY_TO, "to@host.com");
message.setProperty(KnownPropertyList.SENDER_NAME, "de");
message.setProperty(KnownPropertyList.SENT_REPRESENTING_EMAIL_ADDRESS, "from@host.com");

MapiMessage createdMessage = client.createMessage(GraphKnownFolders.Inbox, message);

Atualizar Mensagem

fetchedMessage.setSubject("Atualizar mensagem");
MapiMessage updatedMessage = client.updateMessage(fetchedMessage);

Enviar Mensagem

client.send(message);

Enviar Mensagem de Rascunho

MapiMessage draftMessage = client.createMessage(GraphKnownFolders.Drafts, message);
client.send(draftMessage.getItemId());

Copiar Mensagem

MapiMessage copiedMessage = client.copyMessage(GraphKnownFolders.Inbox, draftMessage.getItemId());

Mover Mensagem

MapiMessage movedMessage = client.moveMessage(GraphKnownFolders.Inbox, draftMessage.getItemId());

Anexos de Mensagem

MapiAttachmentCollection attachments = client.listAttachments(fetchedMessage.getItemId());
for (MapiAttachment att : attachments) {
    client.deleteAttachment(att.getItemId());
}

Deletar Mensagem

client.delete(message.getItemId());

API de Categorias

String categoryName = "Categoria Teste";
int preset = CategoryPreset.Preset10;
OutlookCategory category = client.createCategory(categoryName, preset);
OutlookCategory fetchedCategory = client.fetchCategory(category.getId());

List<OutlookCategory> categories = client.listCategories();

fetchedCategory.setDisplayName("Atualizar Categoria");
fetchedCategory.setPreset(CategoryPreset.Preset11);
OutlookCategory updatedCategory = client.updateCategory(fetchedCategory);

client.delete(category.getId());

API de Sobrescritas

int focusedType = ClassificationType.Focused;
ClassificationOverride override = client.createOrUpdateOverride(new MailAddress("testUser@host.com", "testUser"), focusedType);

List<ClassificationOverride> list = client.listOverrides();
for (ClassificationOverride item : list)
    System.out.println(item.getSender().getAddress());

ClassificationOverride fetchedOverride = list.get(0);
fetchedOverride.setClassifyAs(ClassificationType.Other);
fetchedOverride.getSender().setDisplayName("testUser_1");

ClassificationOverride updatedOverride = client.createOrUpdateOverride(fetchedOverride);

fetchedOverride.setClassifyAs(ClassificationType.Focused);
updatedOverride = client.updateOverride(fetchedOverride);

client.delete(updatedOverride.getId());

API de Regras

InboxRule rule = new InboxRule();
rule.setDisplayName("Regra de Teste");
rule.setPriority(1);
rule.setEnabled(true);
rule.setConditions(new RulePredicates());
rule.getConditions().containsSenderStrings(new StringCollection());
rule.getConditions().containsSenderStrings().addItem("testUser");
rule.setActions(new RuleActions());
rule.getActions().setForwardToRecipients(new MailAddressCollection());
rule.getActions().getForwardToRecipients().addMailAddress(new MailAddress("testUser@host.com", "testUser", true));
rule.getActions().setStopProcessingRules(true);

InboxRule createdRule = client.createRule(rule);

List<InboxRule> listedRules = client.listRules();
for (InboxRule item : listedRules)
    System.out.println(item.getDisplayName());

InboxRule fetchedRule = client.fetchRule(createdRule.getRuleId());

createdRule.setDisplayName("Regra de Teste 1");
createdRule.setEnabled(false);
InboxRule updatedRule = client.updateRule(createdRule);

client.delete(createdRule.getRuleId());

Usando Recurso para Suportar Várias Caixas de Correio

сlient.setResource(ResourceType.Users);
сlient.setResourceId("mailbox");
сlient.listMessages("mailfolder")
// voltar para a caixa de correio atual
сlient.setResource(ResourceType.Me);