Cómo usar GraphClient para Microsoft Graph
Trabajando con GraphClient
Una instancia de la clase IGraphClient se encarga de construir solicitudes, enviarlas a la API de Microsoft Graph y procesar las respuestas.
Crear un objeto ITokenProvider
Para crear una nueva instancia de la clase IGraphClient, necesitas proporcionar una instancia de ITokenProvider, que puede autenticar solicitudes a Microsoft Graph.
ITokenProvider tokenProvider = new ITokenProvider() {
Date expirationDate = null;
@Override
public void dispose() {
}
@Override
public OAuthToken getAccessToken(boolean ignoreExistingToken) {
// Obtiene el token de acceso oAuth.
// Si ignoreExistingToken es verdadero, solicita un nuevo token desde el servidor. De lo contrario, el comportamiento depende de si el token existe o no.
// Si el token existe y su fecha de expiración no ha caducado, devuelve el token actual; de lo contrario, solicita un nuevo token desde el servidor.
return null;
}
@Override
public OAuthToken getAccessToken() {
// Obtiene el token de acceso oAuth.
// Si el token existe y su fecha de expiración no ha caducado, devuelve el token actual; de lo contrario, solicita un nuevo token desde el servidor.
return new OAuthToken("token", expirationDate);
}
};
Obtener un objeto GraphClient
Después de haber configurado el TokenProvider, debes obtener un objeto IGraphClient para hacer solicitudes al servicio. Después de tener un IGraphClient que esté autenticado, puedes comenzar a hacer llamadas al servicio.
IGraphClient client = GraphClient.getClient(tokenProvider);
Trabajar con carpetas usando Microsoft Graph
Listar carpetas
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 subcarpetas de la carpeta de entrada
GraphFolderInfoCollection inboxFolders = client.listFolders(GraphKnownFolders.Inbox);
Crear carpeta raíz
GraphFolderInfo newFolder = client.createFolder("TEST_FOLDER");
Crear subcarpeta
GraphFolderInfo inboxTestSubFolder1 = client.createFolder(GraphKnownFolders.Inbox, "TEST_SUBFOLDER_1");
GraphFolderInfo inboxTestSubFolder2 = client.createFolder(newFolder.getItemId(), "TEST_SUBFOLDER_2");
Obtener carpeta
GraphFolderInfo sentItemsFolder = client.getFolder(GraphKnownFolders.SentItems);
Actualizar carpeta
GraphFolderInfo originalFolder = client.createFolder("TEST_FOLDER");
originalFolder.setDisplayName("NEW_TEST_FOLDER");
GraphFolderInfo updatedFolder = client.updateFolder(originalFolder);
Copiar carpeta y contenido
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 carpeta y contenido
GraphFolderInfo folder = client.moveFolder(parentFolder.getItemId(), testFolder.getItemId());
Eliminar carpeta
client.delete(testFolder.getItemId());
Listar mensajes usando Microsoft Graph
GraphMessageInfoCollection messageInfoColl = client.listMessages(GraphKnownFolders.Inbox);
for (GraphMessageInfo messageInfo : messageInfoColl) {
MapiMessage message = client.fetchMessage(messageInfo.getItemId());
}
Listar mensajes por fecha de envío
La función OrderBy se usa para indicar que los mensajes deben ordenarse en orden ascendente por su fecha de envío. Esto permite al cliente recuperar la lista de mensajes de la carpeta GraphKnownFolders.Inbox en un orden específico, en este caso, basado en la fecha de envío.
El siguiente ejemplo de código muestra cómo crear una consulta que especifica el orden de los mensajes por fecha de envío, y luego usar esta consulta para recuperar una página de mensajes de la carpeta de entrada usando la API de Graph:
// crear consulta de mensajes ordenada 'ASC'
GraphQueryBuilder builder = new GraphQueryBuilder();
builder.getSentDate().orderBy(true);
MailQuery query = builder.getQuery();
GraphMessagePageInfo pageInfo = client.listMessages(GraphKnownFolders.Inbox, new PageInfo(10), query);
Recuperar mensaje
GraphMessageInfo messageInfo = messageInfoColl.get(0);
MapiMessage fetchedMessage = client.fetchMessage(messageInfo.getItemId());
Paginación en la lista de mensajes
La API proporciona soporte de paginación y filtrado para listar mensajes. Esto es muy útil cuando un buzón tiene un gran número de mensajes y requiere mucho tiempo para recuperar la información resumida sobre ellos. El siguiente ejemplo de código te mostrará cómo usar la paginación para conjuntos de mensajes grandes al listar mensajes desde Exchange Server usando IGraphClient:
// enviar mensajes de prueba de ping
for (int i = 0; i < 5; i++) {
MailMessage eml = new MailMessage(user.EMail, user.EMail, "ping" + i, "cuerpo de prueba");
client.send(MapiMessage.fromMailMessage(eml));
}
// esperando por la bandeja de entrada
Thread.sleep(10000);
// opción de paginación
int itemsPerPage = 2;
// crear filtro de mensajes no leídos
GraphQueryBuilder builder = new GraphQueryBuilder();
builder.isRead().equals(false);
MailQuery query = builder.getQuery();
// listar mensajes
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);
// agregar elementos de la siguiente página a la colección común
messages.addRange(pageInfo.getItems());
}
// establecer el estado de los mensajes como leídos
for (GraphMessageInfo message : messages) {
client.setRead(message.getItemId());
}
Crear mensaje
MapiMessage message = new MapiMessage();
message.setSubject("Asunto");
message.setBody("Cuerpo");
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(GraphKnownFolders.Inbox, message);
Actualizar mensaje
fetchedMessage.setSubject("Actualizar mensaje");
MapiMessage updatedMessage = client.updateMessage(fetchedMessage);
Enviar mensaje
client.send(message);
Enviar mensaje borrador
MapiMessage draftMessage = client.createMessage(GraphKnownFolders.Drafts, message);
client.send(draftMessage.getItemId());
Copiar mensaje
MapiMessage copiedMessage = client.copyMessage(GraphKnownFolders.Inbox, draftMessage.getItemId());
Mover mensaje
MapiMessage movedMessage = client.moveMessage(GraphKnownFolders.Inbox, draftMessage.getItemId());
Adjuntos de mensaje
MapiAttachmentCollection attachments = client.listAttachments(fetchedMessage.getItemId());
for (MapiAttachment att : attachments) {
client.deleteAttachment(att.getItemId());
}
Eliminar mensaje
client.delete(message.getItemId());
API de categorías
String categoryName = "Categoría de prueba";
int preset = CategoryPreset.Preset10;
OutlookCategory category = client.createCategory(categoryName, preset);
OutlookCategory fetchedCategory = client.fetchCategory(category.getId());
List<OutlookCategory> categories = client.listCategories();
fetchedCategory.setDisplayName("Actualizar categoría");
fetchedCategory.setPreset(CategoryPreset.Preset11);
OutlookCategory updatedCategory = client.updateCategory(fetchedCategory);
client.delete(category.getId());
API de sobrescrituras
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 reglas
InboxRule rule = new InboxRule();
rule.setDisplayName("Regla de prueba");
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("Regla de prueba 1");
createdRule.setEnabled(false);
InboxRule updatedRule = client.updateRule(createdRule);
client.delete(createdRule.getRuleId());
Usando recurso para soportar múltiples buzones
сlient.setResource(ResourceType.Users);
сlient.setResourceId("mailbox");
сlient.listMessages("mailfolder")
// volver al buzón actual
сlient.setResource(ResourceType.Me);