Exchangeメールボックスからメッセージをフィルタリング

EWS を使用したメッセージのフィルタリング

この IEWSClient class は以下を提供します listMessages() メールボックスからすべてのメッセージを取得するメソッドです。条件に合致するメッセージだけを取得するには、オーバーロードされた listMessages() メソッドは次を受け取ります MailQuery クラスを引数として使用します。 MailQuery クラスは、日付、件名、送信者、受信者などの条件を指定するためのさまざまなプロパティを提供します。また、API はメールボックスからメールを取得する際に大文字小文字を区別するフィルタを適用することも可能です。

メッセージのフィルタリング

メールボックスからフィルタされたメッセージを取得するには:

  1. Exchangeサーバーに接続します。
  2. MailQuery のインスタンスを作成し、必要なプロパティを設定します。
  3. IEWSClient.listMessages() メソッドを呼び出し、パラメータに MailQuery を渡すことで、フィルタリングされたメッセージだけを取得します。

以下のコードスニペットは、IMAPメールボックスに接続し、件名に「Newsletter」という文字列が含まれ、かつ本日送信されたメッセージを取得する方法を示しています。

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

条件でメッセージをフィルタリング

上記のコードサンプルは、メールの 件名 と 日付 に基づいてメッセージをフィルタリングします。他のプロパティでもフィルタリングできます。以下は、条件設定に 使用する例です。 MailQuery.

本日の日付でメッセージをフィルタリング

以下のコードスニペットは、本日の日付に基づいてすべてのメールをフィルタリングする方法を示しています。

// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.getInternalDate().on(new 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());

特定の送信者でメッセージをフィルタリング

以下のコードスニペットは、特定の送信者に基づいてすべてのメールをフィルタリングする方法を示します。

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

特定のドメインでメッセージをフィルタリング

以下のコードスニペットは、特定のドメインに基づいてすべてのメールをフィルタリングする方法を示します。

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

特定の受信者でメッセージをフィルタリング

以下のコードスニペットは、特定の受信者に基づいてすべてのメールをフィルタリングする方法を示します。

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

MessageIDでメッセージをフィルタリング

以下のコードスニペットは、MessageID に基づいてすべてのメールをフィルタリングする方法を示します。

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

すべてのメール配信通知でメッセージをフィルタリング

以下のコードスニペットは、すべてのメール配信通知に基づいてすべてのメールをフィルタリングする方法を示します。

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

サイズでメッセージをフィルタリング

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

文字列値でメッセージをフィルタリング

以下のコードスニペットは、ヘッダー(件名、送信者、受信者、CC)に指定された文字列に基づいてすべてのメールをフィルタリングする方法を示しています。 getText() メソッドは文字列の値とメッセージ本文を返します。

 ExchangeQueryBuilder builder = new ExchangeQueryBuilder();

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

MailQuery query = builder.getQuery();

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

メッセージを昇順/降順でフィルタリング

Aspose.Email は以下を提供します ComparisonField.orderBy(boolean ascending) 検索フィールドでクライアントが昇順または降順のソートを使用することを示す値を設定するメソッドです。これにより、指定された基準に基づいてメールメッセージを昇順または降順にソートできます。 MailQueryBuilder.

以下のコードスニペットは、メッセージを昇順/降順にフィルタリングする方法を示しています:

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

複雑なクエリの構築

異なる場合 MailQueryBuilder プロパティを別々のステートメントで設定すると、すべての条件が一致します。たとえば、特定の日付範囲かつ特定のホストからのメッセージを取得するには、次のように3つのステートメントを書きます:

AND を使用したクエリの組み合わせ

以下のコードスニペットは、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());

OR を使用したクエリの組み合わせ

MailQueryBuilder 提供します or() 2つを受け取るメソッド MailQuery インスタンスをパラメータとして受け取ります。指定された2つの条件のいずれかに一致するメッセージを取得します。以下の例は、件名に「test」という語が含まれるか、送信者が「noreply@host.com」のメッセージをフィルタリングします。以下のコードスニペットは、ORでクエリを組み合わせる方法を示しています。

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

大文字小文字を区別したメールフィルタリング

以下のコードスニペットに示すように、フィルタ条件でIgnoreCaseフラグを指定することで、大小文字の区別に基づいてメールをフィルタリングできます。

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

ページングサポート付きメッセージフィルタリング

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