Filtrar mensajes del buzón de Exchange

Filtrado de mensajes mediante EWS

The IEWSClient la clase proporciona la listMessages() método que obtiene todos los mensajes de un buzón. Para recibir solo los mensajes que cumplen alguna condición, utilice el método sobrecargado listMessages() método que toma el MailQuery clase como argumento. El MailQuery La clase proporciona varias propiedades para especificar condiciones, por ejemplo, fecha, asunto, remitente y destinatario. Además, la API también permite aplicar filtros que distinguen mayúsculas y minúsculas para recuperar correos electrónicos del buzón.

Filtrado de mensajes

Para obtener los mensajes filtrados de un buzón:

  1. Conéctese al servidor Exchange.
  2. Crea una instancia de MailQuery y establece las propiedades deseadas.
  3. Llama al método iewsClient.listMessages () y pasa MailQuery a los parámetros para obtener solo los mensajes filtrados.

El siguiente fragmento de código muestra cómo conectarse a un buzón IMAP y recibir los mensajes que tengan la cadena «Boletín» en el asunto y que se hayan enviado 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 muestran algunos ejemplos de cómo configurar las condiciones utilizando MailQuery.

Filtrar mensajes por fecha de hoy

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

// 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 función del intervalo 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 función de 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 función de 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 función de 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 función de 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 función de 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 muestra cómo filtrar todos los correos electrónicos en función de la cadena especificada en los encabezados (asunto, de, a, cc). El getText() el método devuelve el valor de la 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 la ComparisonField.orderBy (booleano ascendente) método que establece el valor que indica que el cliente utiliza la clasificación ascendente o descendente en el campo de búsqueda. Le permite ordenar los mensajes de correo electrónico en orden ascendente/descendente según los criterios especificados por MailQueryBuilder.

El siguiente fragmento de código muestra cómo filtrar los 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());

Creación de consultas complejas

Si es diferente MailQueryBuilder las propiedades se establecen en una declaración separada, se cumplen todas las condiciones. Por ejemplo, para recibir un mensaje en un intervalo de fechas determinado y de un anfitrión específico, escribe tres afirmaciones:

Combinación de 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());

Combinación de consultas con OR

MailQueryBuilder proporciona la or() método que requiere dos MailQuery instancias como parámetros. Recibe mensajes que cumplen cualquiera de las dos condiciones especificadas. El ejemplo siguiente filtra los mensajes que tienen la palabra «test» en el asunto o "noreply@host.com" como remitente. En el siguiente fragmento de código, se 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 se pueden filtrar en función de la distinción entre mayúsculas y minúsculas especificando el indicador 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();
}