使用 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 属性,则所有条件都必须匹配。例如,要获取特定日期范围且来自特定主机的消息,请编写三条语句:

使用 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 提供 or() 方法,接受两个 MailQuery 实例作为参数。它获取匹配任一指定条件的消息。下面的示例过滤主题中含有“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();