使用 IMAP 客户端过滤服务器上的邮件

该 ImapClient class 提供了 listMessages() 方法获取邮箱中的所有邮件。若只获取符合某些条件的邮件,请使用重载的 listMessages() 方法接受 MailQuery 作为参数。 MailQuery 该类提供了用于指定条件的各种属性,例如日期、主题、发件人、收件人等。第一个示例演示了

从邮箱过滤消息

  1. 连接并登录 IMAP 服务器
  2. 创建该类的实例 MailQuery 并设置属性
  3. 调用 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。以下代码片段展示了如何对以下条件过滤邮件:

  1. 今天的日期。
  2. 日期范围。
  3. 来自特定发件人。
  4. 来自特定域。
  5. 来自特定收件人。

今天的日期

以下代码片段展示了如何按今天的日期过滤邮件。

// 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);