使用 IMAP 客户端过滤服务器上的邮件
该 ImapClient class 提供了 listMessages() 方法获取邮箱中的所有邮件。若只获取符合某些条件的邮件,请使用重载的 listMessages() 方法接受 MailQuery 作为参数。 MailQuery 该类提供了用于指定条件的各种属性,例如日期、主题、发件人、收件人等。第一个示例演示了
从邮箱过滤消息
- 连接并登录 IMAP 服务器
- 创建该类的实例 MailQuery 并设置属性
- 调用 ImapClient.listMessages(MailQuery query) 方法并传递 MailQuery 使用参数仅获取过滤后的邮件。
以下代码片段展示了如何连接到 IMAP 邮箱并获取今天到达且主题中包含 "newsletter" 的邮件。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Connect and log in to IMAP
final String host = "host";
final int port = 143;
final String username = "user@host.com";
final String password = "password";
ImapClient client = new ImapClient(host, port, username, password);
client.selectFolder("Inbox");
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.getSubject().contains("Newsletter");
builder.getInternalDate().on(new Date());
// Build the query and Get list of messages
MailQuery query = builder.getQuery();
ImapMessageInfoCollection messages = client.listMessages(query);
System.out.println("Imap: " + messages.size() + " message(s) found.");
// Disconnect from IMAP
client.dispose();
获取符合特定条件的消息
上述代码示例 根据邮件主题和日期过滤邮件。我们还可以使用其他属性设置其他支持的条件。以下是使用 … 设置条件的一些示例 MailQuery。以下代码片段展示了如何对以下条件过滤邮件:
- 今天的日期。
- 日期范围。
- 来自特定发件人。
- 来自特定域。
- 来自特定收件人。
今天的日期
以下代码片段展示了如何按今天的日期过滤邮件。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Emails that arrived today
MailQueryBuilder builder = new MailQueryBuilder();
builder.getInternalDate().on(new Date());
~~
### **Date Range*
The following code snippet shows you how to filter emails on the date range.
~~~Java
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// 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());
特定发送者
以下代码片段展示了如何按特定发件人过滤邮件。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails from specific sender
builder.getFrom().contains("saqib.razzaq@127.0.0.1");
特定域
以下代码片段展示了如何按特定域过滤邮件。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails from specific domain
builder.getFrom().contains("SpecificHost.com");
特定收件人
以下代码片段展示了如何按特定收件人过滤邮件。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Get emails sent to specific recipient
builder.getTo().contains("recipient");
构建复杂查询
如果不同 MailQueryBuilder 属性在独立的语句中设置时,所有条件都会被匹配。例如,如果我们想获取特定日期范围内且来自特定主机的邮件,需要编写三条语句。
使用 AND 组合查询
下面的代码片段展示了如何使用 AND 组合查询。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// 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 组合查询。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Specify OR condition
builder.or(builder.getSubject().contains("test"), builder.getFrom().contains("noreply@host.com"));
基于 InternalDate 的过滤
可以根据 InternalDate 从服务器提取邮件,但有时服务器不会返回收件箱中可见的所有邮件。原因可能是服务器时区,因为并非所有服务器都是 UTC,例如 Gmail。Aspose 按照以下内容发送类似 008 SEARCH ON 4-May-2014 的命令。 IMAP 协议 然而,由于服务器时区设置,结果可能会有所不同。已在以下位置添加了新成员: ImapMessageInfo as InternalDate 这进一步有助于过滤邮件。以下代码片段展示了如何使用 InternalDate 用于过滤邮件。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Connect and log in to IMAP
final String host = "host";
final int port = 143;
final String username = "user@host.com";
final String password = "password";
ImapClient client = new ImapClient(host, port, username, password);
client.selectFolder("Inbox");
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.getSubject().contains("Newsletter");
builder.getInternalDate().on(new Date());
// Build the query and Get list of messages
MailQuery query = builder.getQuery();
ImapMessageInfoCollection messages = client.listMessages(query);
for (ImapMessageInfo info : messages) {
System.out.println("Internal Date: " + info.getInternalDate());
}
// Disconnect from IMAP
client.dispose();
区分大小写的邮件过滤
以下代码片段展示了如何使用区分大小写的邮件过滤。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Set conditions, Subject contains "Newsletter", Emails that arrived today
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.getSubject().contains("Newsletter", true);
builder.getInternalDate().on(new Date());
MailQuery query = builder.getQuery();
为查询构建器指定编码
API 的 ImapQueryBuilder 构造函数可用于为搜索字符串指定编码。也可以使用以下方式进行设置。 DefaultEncoding MailQueryBuilder 的属性。以下代码片段展示了如何为查询构建器指定编码。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
// Set conditions
ImapQueryBuilder builder = new ImapQueryBuilder(Charset.forName("utf-8"));
builder.getSubject().contains("ğüşıöç", true);
MailQuery query = builder.getQuery();
使用分页支持过滤邮件
该 ImapClient 提供从邮箱搜索邮件并分页列出的功能。以下代码片段展示了如何使用分页支持过滤邮件。
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
/// <summary>
/// This example shows how to search for messages using ImapClient of the API with paging support
/// Introduced in Aspose.Email for .NET 6.4.0
/// </summary>
final ImapClient client = new ImapClient("host.domain.com", 84, "username", "password");
try {
try {
// Append some test messages
int messagesNum = 12;
int itemsPerPage = 5;
MailMessage message = null;
for (int i = 0; i < messagesNum; i++) {
message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35128 - " + UUID.randomUUID(), "111111111111111");
client.appendMessage(ImapFolderInfo.IN_BOX, message);
}
String body = "2222222222222";
for (int i = 0; i < messagesNum; i++) {
message = new MailMessage("from@domain.com", "to@domain.com", "EMAILNET-35128 - " + UUID.randomUUID(), body);
client.appendMessage(ImapFolderInfo.IN_BOX, message);
}
client.selectFolder("Inbox");
ImapQueryBuilder iqb = new ImapQueryBuilder();
iqb.getBody().contains(body);
MailQuery query = iqb.getQuery();
client.selectFolder(ImapFolderInfo.IN_BOX);
ImapMessageInfoCollection totalMessageInfoCol = client.listMessages(query);
System.out.println(totalMessageInfoCol.size());
//////////////////////////////////////////////////////
List<ImapPageInfo> pages = new ArrayList<ImapPageInfo>();
PageSettings ps = new PageSettings();
ps.setFolderName(ImapFolderInfo.IN_BOX);
PageInfo pi = new PageInfo(itemsPerPage);
ImapPageInfo pageInfo = client.listMessagesByPage(query, pi, ps);
pages.add(pageInfo);
while (!pageInfo.getLastPage()) {
pageInfo = client.listMessagesByPage(query, pageInfo.getNextPage(), ps);
pages.add(pageInfo);
}
int retrievedItems = 0;
// foreach to while statements conversion
for (ImapPageInfo folderCol : pages) {
retrievedItems += folderCol.getItems().size();
}
} finally {
}
} finally {
if (client != null)
client.dispose();
}
使用自定义标志过滤邮件
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-Java
ImapQueryBuilder queryBuilder = new ImapQueryBuilder();
queryBuilder.hasFlags(ImapMessageFlags.keyword("custom1"));
queryBuilder.hasNoFlags(ImapMessageFlags.keyword("custom2"));
使用自定义搜索过滤邮件
例如,RFC 3501 标准不允许基于邮件中是否存在附件进行搜索。但 Gmail 提供了 IMAP 扩展 允许执行此类搜索。Aspose.Email 提供了 customSearch 方法的 ImapQueryBuilder 类用于创建相应的查询。
下面的代码示例展示了如何使用 IMAP 协议和自定义搜索条件检索服务器上带有附件的电子邮件列表:
ImapQueryBuilder builder = new ImapQueryBuilder();
builder.customSearch("X-GM-RAW \"has:attachment\"");
MailQuery query = builder.getQuery();
messageInfoCol = client.listMessages(query);