过滤 Exchange 邮箱中的邮件
使用 EWS 过滤消息
该 IEWSClient class 提供了 listMessages() 从邮箱获取所有消息的方法。若只想获取符合某些条件的消息,请使用重载的 listMessages() 接受以下参数的方法 MailQuery 类作为参数。该 MailQuery 该类提供了用于指定条件的各种属性,例如日期、主题、发件人和收件人。此外,API 还允许应用区分大小写的过滤器来检索邮箱中的电子邮件。
过滤消息
获取邮箱中已过滤的消息:
- 连接到 Exchange 服务器。
- 创建 MailQuery 实例并设置所需属性。
- 调用 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();
}