WebDav を使用して Exchange メールボックスからメッセージをフィルタリング

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

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

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

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

ExchangeClient client = new ExchangeClient("http://MachineName/exchange/Username", "username", "password", "domain");
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

// Query building by means of ExchangeQueryBuilder class
ExchangeQueryBuilder builder = new ExchangeQueryBuilder();
// Subject contains "Newsletter"
builder.getSubject().contains("Newsletter");

// Emails that arrived today
try {
	builder.getInternalDate().on(sdf.parse("10/05/2016 10:00:00"));
} catch (ParseException e) {
	e.printStackTrace();
}

// Build the query
MailQuery query = builder.getQuery();

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

特定の条件を満たすメッセージの取得

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

フィルタ条件:本日の日付

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

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

フィルタ条件:日付範囲

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

MailQueryBuilder builder = new MailQueryBuilder();
builder.getInternalDate().beforeOrEqual(new Date());
builder.getInternalDate().since(new Date(new Date().getTime() + TimeUnit.DAYS.toDays(1)));

フィルタ条件:特定の送信者

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

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

フィルタ条件:特定のドメイン

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

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

フィルタ条件:特定の受信者

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

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

フィルタ条件:MessageID による

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

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

フィルタ条件:すべてのメール配信通知

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

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

複雑なクエリの構築

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

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

MailQueryBuilder builder = new MailQueryBuilder();

// Emails from specific host
builder.getFrom().contains("SpecificHost.com");
// AND all emails that arrived before today
builder.getInternalDate().before(new Date());
// AND all emails that arrived since 7 days ago
builder.getInternalDate().since(new Date(new Date().getTime() + TimeUnit.DAYS.toDays(-7)));

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

QueryBuilder は、2 つの MailQuery インスタンスをパラメータとして受け取る or() メソッドを提供します。指定された 2 つの条件のいずれかに一致するメッセージを取得します。以下の例は、件名に「test」という単語が含まれるか、送信者が "noreply@host.com" のメッセージをフィルタリングします。

MailQueryBuilder builder = new MailQueryBuilder();
		
// Specify OR condition
builder.or(builder.getSubject().contains("test"), builder.getFrom().contains("noreply@host.com"));

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

以下の例のように、フィルタ条件で IgnoreCase フラグを指定することで、大文字小文字を区別してメールをフィルタリングできます。

//IgnoreCase is True
MailQueryBuilder builder1 = new MailQueryBuilder();
builder1.getFrom().contains("tesT", true);
MailQuery query1 = builder1.getQuery();