Filtrowanie wiadomości ze skrzynki Exchange

Filtrowanie wiadomości przy użyciu EWS

Ten IEWSClient klasa udostępnia listMessages() metoda, która pobiera wszystkie wiadomości ze skrzynki pocztowej. Aby uzyskać tylko wiadomości spełniające określony warunek, użyj przeciążonej listMessages() metoda, która przyjmuje MailQuery klasę jako argument. Ta MailQuery klasa udostępnia różne właściwości do określania warunków, takich jak data, temat, nadawca i odbiorca. Ponadto API umożliwia stosowanie filtrów wrażliwych na wielkość liter przy pobieraniu e-maili ze skrzynki pocztowej.

Filtrowanie wiadomości

Aby uzyskać filtrowane wiadomości ze skrzynki:

  1. Połącz się z serwerem Exchange.
  2. Utwórz instancję MailQuery i ustaw żądane właściwości.
  3. Wywołaj metodę IEWSClient.listMessages() i przekaż MailQuery w parametrach, aby otrzymać wyłącznie przefiltrowane wiadomości.

Poniższy fragment kodu pokazuje, jak połączyć się ze skrzynką pocztową IMAP i pobrać wiadomości, które w temacie zawierają ciąg "Newsletter" i zostały wysłane dzisiaj.

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

Filtrowanie wiadomości według kryteriów

Powyższe przykłady kodu filtrują wiadomości na podstawie tematu e‑maila i daty. Możemy również filtrować według innych właściwości. Poniżej znajdują się przykłady ustalania warunków przy użyciu MailQuery.

Filtrowanie wiadomości według dzisiejszej daty

Poniższy fragment kodu pokazuje, jak filtrować wszystkie e-maile na podstawie dzisiejszej daty.

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

Filtrowanie wiadomości według zakresu dat

Poniższy fragment kodu pokazuje, jak filtrować wszystkie e‑maile na podstawie zakresu dat.

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

Filtrowanie wiadomości według konkretnego nadawcy

Poniższy fragment kodu pokazuje, jak filtrować wszystkie e‑maile na podstawie konkretnego nadawcy.

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

Filtrowanie wiadomości według konkretnej domeny

Poniższy fragment kodu pokazuje, jak filtrować wszystkie e‑maile na podstawie konkretnej domeny.

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

Filtrowanie wiadomości według konkretnego odbiorcy

Poniższy fragment kodu pokazuje, jak filtrować wszystkie e‑maile na podstawie określonego odbiorcy.

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

Filtrowanie wiadomości według MessageID

Poniższy fragment kodu pokazuje, jak filtrować wszystkie e‑maile na podstawie MessageID.

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

Filtrowanie wiadomości według wszystkich powiadomień o dostawie poczty

Poniższy fragment kodu pokazuje, jak filtrować wszystkie e‑maile na podstawie powiadomień o dostawie poczty.

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

Filtrowanie wiadomości według rozmiaru

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

Filtrowanie wiadomości według wartości ciągu znaków

Poniższy fragment kodu pokazuje, jak filtrować wszystkie e-maile na podstawie określonego ciągu znaków w nagłówkach (temat, od, do, cc). getText() metoda zwraca wartość ciągu znaków wraz z treścią wiadomości.

 ExchangeQueryBuilder builder = new ExchangeQueryBuilder();

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

MailQuery query = builder.getQuery();

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

Filtrowanie wiadomości w kolejności rosnącej/malejącej

Aspose.Email udostępnia ComparisonField.orderBy(boolean ascending) metoda ustawiająca wartość wskazującą, że klient używa sortowania rosnącego lub malejącego w polu wyszukiwania. Umożliwia sortowanie wiadomości e‑mail w kolejności rosnącej/malejącej według kryteriów określonych przez MailQueryBuilder.

Poniższy fragment kodu demonstruje, jak filtrować wiadomości w kolejności rosnącej/malejącej:

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

Budowanie złożonych zapytań

Jeśli różne MailQueryBuilder właściwości są ustawiane w osobnym wyrażeniu, wszystkie warunki są spełnione. Na przykład, aby uzyskać wiadomość w określonym przedziale dat i od konkretnego hosta, napisz trzy instrukcje:

Łączenie zapytań przy użyciu AND

Poniższy fragment kodu pokazuje, jak łączyć zapytania za pomocą 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());

Łączenie zapytań przy użyciu OR

MailQueryBuilder udostępnia or() metoda przyjmująca dwa MailQuery instancje jako parametry. Pobiera wiadomości spełniające dowolny z dwóch określonych warunków. Przykład poniżej filtruje wiadomości, które mają w temacie słowo "test" lub nadawcą "noreply@host.com". Poniższy fragment kodu pokazuje, jak łączyć zapytania za pomocą OR.

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

Filtrowanie e‑maili z rozróżnieniem wielkości liter

E‑maile mogą być filtrowane z uwzględnieniem wielkości liter poprzez określenie flagi IgnoreCase w kryteriach filtrowania, jak pokazano w poniższym fragmencie kodu.

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

Filtrowanie wiadomości z obsługą stronicowania

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