Filtrar mensajes del buzón Exchange

Filtrado de mensajes usando EWS

El IEWSClient class proporciona el listMessages() método que obtiene todos los mensajes de un buzón. Para obtener solo los mensajes que coincidan con alguna condición, use la sobrecarga listMessages() método que toma el MailQuery clase como argumento. El MailQuery la clase proporciona diversas propiedades para especificar condiciones, por ejemplo, fecha, asunto, remitente y destinatario. Además, la API también permite aplicar filtros de distinción entre mayúsculas y minúsculas para recuperar correos electrónicos del buzón.

Filtrado de mensajes

Para obtener mensajes filtrados de un buzón:

  1. Conéctese al servidor Exchange.
  2. Cree una instancia de MailQuery y establezca las propiedades deseadas.
  3. Llame al método IEWSClient.listMessages() y pase el MailQuery en los parámetros para obtener solo los mensajes filtrados.

El siguiente fragmento de código le muestra cómo conectarse a un buzón IMAP y obtener mensajes que tengan la cadena "Newsletter" en el asunto y que fueron enviados hoy.

try {
    // Connect to EWS
    final String mailboxUri = "https://outlook.office365.com/ews/exchange.asmx";
    final String username = "username";
    final String password = "password";
    final String domain = "domain";

    IEWSClient client = EWSClient.getEWSClient(mailboxUri, username, password, domain);

    // Query building by means of ExchangeQueryBuilder class
    ExchangeQueryBuilder builder = new ExchangeQueryBuilder();

    // Set Subject and Emails that arrived today
    builder.getSubject().contains("Newsletter");
    builder.getInternalDate().on(new Date());

    MailQuery query = builder.getQuery();

    // Get list of messages
    ExchangeMessageInfoCollection messages = client.listMessages(client.getMailboxInfo().getInboxUri(), query, false);
    System.out.println("EWS: " + messages.size() + " message(s) found.");

    // Disconnect from EWS
    client.dispose();
} catch (java.lang.RuntimeException ex) {
    System.out.println(ex.getMessage());
}

Filtrar mensajes por criterios

Los ejemplos de código anteriores filtran los mensajes según el asunto y la fecha del correo electrónico. También podemos filtrar por otras propiedades. A continuación se presentan algunos ejemplos de configuración de condiciones usando MailQuery.

Filtrar mensajes por la fecha de hoy

El siguiente fragmento de código le muestra cómo filtrar todos los correos electrónicos en función de la fecha de hoy.

// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.getInternalDate().on(new Date());

Filtrar mensajes por rango de fechas

El siguiente fragmento de código muestra cómo filtrar todos los correos electrónicos en base al rango de fechas.

// Emails that arrived in last 7 days
Calendar cal = Calendar.getInstance();
builder.getInternalDate().before(cal.getTime());
cal.add(Calendar.DATE, -7);
builder.getInternalDate().since(cal.getTime());

Filtrar mensajes por remitente específico

El siguiente fragmento de código muestra cómo filtrar todos los correos electrónicos en base a un remitente específico.

// Get emails from specific sender
builder.getFrom().contains("saqib.razzaq@127.0.0.1");

Filtrar mensajes por dominio específico

El siguiente fragmento de código muestra cómo filtrar todos los correos electrónicos en base a un dominio específico.

// Get emails from specific domain
builder.getFrom().contains("SpecificHost.com");

Filtrar mensajes por destinatario específico

El siguiente fragmento de código muestra cómo filtrar todos los correos electrónicos en base a un destinatario específico.

// Get emails sent to specific recipient
builder.getTo().contains("recipient");

Filtrar mensajes por MessageID

El siguiente fragmento de código muestra cómo filtrar todos los correos electrónicos en base al MessageID.

// Get email with specific MessageId
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
builder.getMessageId().equals("MessageID");

Filtrar mensajes por todas las notificaciones de entrega de correo

El siguiente fragmento de código muestra cómo filtrar todos los correos electrónicos en base a todas las notificaciones de entrega de correo.

// Get Mail Delivery Notifications
builder = new ExchangeQueryBuilder();
builder.getContentClass().equals(ContentClassType.getMDN().toString());

Filtrar mensajes por tamaño

builder = new ExchangeQueryBuilder();
builder.getItemSize().greater(80000);

Filtrar mensajes por valor de cadena

El siguiente fragmento de código le muestra cómo filtrar todos los correos electrónicos en función de la cadena especificada en los encabezados (asunto, de, para, cc). El getText() el método devuelve el valor de cadena junto con el cuerpo del mensaje.

 ExchangeQueryBuilder builder = new ExchangeQueryBuilder();

builder.getText().equals("SomeText");

MailQuery query = builder.getQuery();

ExchangeMessageInfoCollection messages = ewsClient.listMessages("InboxUri", query, false);

Filtrar mensajes en orden ascendente/descendente

Aspose.Email proporciona el ComparisonField.orderBy(boolean ascending) método que establece el valor que indica que el cliente usa ordenación ascendente o descendente en el campo de búsqueda. Permite ordenar los mensajes de correo en orden ascendente/descendente según los criterios especificados por MailQueryBuilder.

El siguiente fragmento de código demuestra cómo filtrar mensajes en orden ascendente/descendente:

MailQueryBuilder builder = new MailQueryBuilder();
builder.getSubject().contains("Report");
builder.getInternalDate().since(sinceDate);
builder.getSubject().orderBy(true); // sort the subject ascending
builder.getInternalDate().orderBy(false); // sort the date descending  

ExchangeMessageInfoCollection miColl = client.listMessages(client.getMailboxInfo().getInboxUri(), builder.getQuery());

Construir consultas complejas

Si diferentes MailQueryBuilder las propiedades se establecen en una sentencia separada, todas las condiciones se cumplen. Por ejemplo, para obtener un mensaje en un rango de fechas específico y de un host concreto, escriba tres sentencias:

Combinar consultas con AND

El siguiente fragmento de código muestra cómo combinar consultas con AND.

// Emails from specific host, get all emails that arrived before today and all emails that arrived since 7 days ago
builder.getFrom().contains("SpecificHost.com");
Calendar cal = Calendar.getInstance();
builder.getInternalDate().before(cal.getTime());
cal.add(Calendar.DATE, -7);
builder.getInternalDate().since(cal.getTime());

Combinar consultas con OR

MailQueryBuilder proporciona el or() método que toma dos MailQuery instancias como parámetros. Obtiene mensajes que coinciden con cualquiera de las dos condiciones especificadas. El siguiente ejemplo filtra mensajes que tengan la palabra "test" en el asunto o "noreply@host.com" como remitente. El siguiente fragmento de código muestra cómo combinar consultas con OR.

builder.or(builder.getSubject().contains("test"), builder.getFrom().contains("noreply@host.com"));

Filtrado de correo electrónico sensible a mayúsculas

Los correos electrónicos pueden filtrarse según la sensibilidad a mayúsculas especificando la bandera IgnoreCase en los criterios de filtro, como se muestra en el siguiente fragmento de código.

// Query building by means of ExchangeQueryBuilder class
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
builder.getSubject().contains("Newsletter", true);
builder.getInternalDate().on(new Date());
MailQuery query = builder.getQuery();

Filtrado de mensajes con soporte de paginación

int itemsPerPage = 5;
String sGuid = UUID.randomUUID().toString();
String str1 = sGuid + " - " + "Query 1";
String str2 = sGuid + " - " + "Query 2";

MailQueryBuilder queryBuilder1 = new MailQueryBuilder();
queryBuilder1.getSubject().contains(str1);
MailQuery query1 = queryBuilder1.getQuery();
List<ExchangeMessagePageInfo> pages = new ArrayList<ExchangeMessagePageInfo>();
ExchangeMessagePageInfo pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), query1, itemsPerPage);
pages.add(pageInfo);
int str1Count = pageInfo.getItems().size();
while (!pageInfo.getLastPage()) {
    pageInfo = client.listMessagesByPage(client.getMailboxInfo().getInboxUri(), query1, itemsPerPage, pageInfo.getPageOffset() + 1);
    pages.add(pageInfo);
    str1Count += pageInfo.getItems().size();
}