过滤 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);

按字符串值筛选消息

下面的代码片段演示了如何基于标题中指定的字符串(主题、发件人、收件人、抄送)来筛选所有电子邮件。 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 属性在单独的语句中设置时,所有条件都必须匹配。例如,要获取特定日期范围且来自特定主机的邮件,需要写三条语句:

使用 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() 接受两个 MailQuery 实例作为参数。它获取匹配任一指定条件的邮件。下面的示例过滤主题中包含“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();
}