Filtra messaggi dalla casella di posta Exchange

Filtrare i messaggi usando EWS

Il IEWSClient classe fornisce il listMessages() metodo che ottiene tutti i messaggi da una casella di posta. Per ottenere solo i messaggi che corrispondono a una certa condizione, usa il sovraccaricato listMessages() metodo che prende il MailQuery classe come argomento. Il MailQuery la classe fornisce varie proprietà per specificare le condizioni, ad esempio data, oggetto, mittente e destinatario. Inoltre, l’API consente di applicare filtri sensibili al maiuscolo/minuscolo per recuperare le email dalla casella di posta.

Filtrare i messaggi

Per ottenere messaggi filtrati da una casella:

  1. Connetti al server Exchange.
  2. Crea un’istanza di MailQuery e imposta le proprietà desiderate.
  3. Chiama il metodo IEWSClient.listMessages() e passa il MailQuery nei parametri per ottenere solo i messaggi filtrati.

Il seguente frammento di codice mostra come connettersi a una casella di posta IMAP e ottenere i messaggi che contengono la stringa "Newsletter" nell’oggetto e sono stati inviati oggi.

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());
}

Filtra i messaggi per criteri

Gli esempi di codice sopra filtrano i messaggi in base all’oggetto dell’email e alla data. Possiamo filtrare anche altre proprietà. Di seguito alcuni esempi di impostazione delle condizioni usando MailQuery.

Filtra i messaggi per la data di oggi

Il seguente frammento di codice mostra come filtrare tutte le email sulla base della data di oggi.

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

Filtra i messaggi per intervallo di date

Il seguente frammento di codice mostra come filtrare tutte le email in base all’intervallo di date.

// 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());

Filtra i messaggi per mittente specifico

Il seguente frammento di codice mostra come filtrare tutte le email in base a un mittente specifico.

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

Filtra i messaggi per dominio specifico

Il seguente frammento di codice mostra come filtrare tutte le email in base a un dominio specifico.

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

Filtra i messaggi per destinatario specifico

Il seguente frammento di codice mostra come filtrare tutte le email in base a un destinatario specifico.

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

Filtra i messaggi per MessageID

Il seguente frammento di codice mostra come filtrare tutte le email in base al MessageID.

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

Filtra i messaggi per tutte le notifiche di consegna della posta

Il seguente frammento di codice mostra come filtrare tutte le email in base a tutte le notifiche di consegna della posta.

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

Filtra i messaggi per dimensione

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

Filtra i messaggi per valore stringa

Il seguente frammento di codice mostra come filtrare tutte le email sulla base della stringa specificata nelle intestazioni (oggetto, da, a, cc). Il getText() il metodo restituisce il valore stringa insieme al corpo del messaggio.

 ExchangeQueryBuilder builder = new ExchangeQueryBuilder();

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

MailQuery query = builder.getQuery();

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

Filtra i messaggi in ordine ascendente/descendente

Aspose.Email fornisce il ComparisonField.orderBy(boolean ascending) metodo che imposta il valore che indica se il client utilizza ordinamento ascendente o discendente sul campo di ricerca. Permette di ordinare le email in ordine ascendente/descendente basandosi sui criteri specificati da MailQueryBuilder.

Il frammento di codice sotto dimostra come filtrare i messaggi in ordine 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());

Costruire Query Complesse

Se diversi MailQueryBuilder le proprietà sono impostate in una dichiarazione separata, tutte le condizioni sono soddisfatte. Ad esempio, per ottenere un messaggio in un intervallo di date specifico e da un host particolare, scrivi tre istruzioni:

Combinare Query con AND

Il seguente frammento di codice mostra come combinare query 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());

Combinare Query con OR

MailQueryBuilder fornisce il or() metodo che prende due MailQuery istanze come parametri. Ottiene i messaggi che corrispondono a una delle due condizioni specificate. L’esempio qui sotto filtra i messaggi che hanno la parola "test" nell’oggetto o "noreply@host.com" come mittente. Il seguente frammento di codice mostra come combinare query con OR.

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

Filtraggio Email Sensibile al Maiuscolo/Minuscolo

Le email possono essere filtrate in base a maiuscole/minuscole specificando il flag IgnoreCase nei criteri di filtro come mostrato nel seguente frammento di codice.

// 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();

Filtrare i messaggi con supporto alla paginazione

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();
}