在 Python 中搜索和过滤 IMAP 邮件

要检索邮箱中的所有邮件,Aspose.Email 提供了 ImapClient 类。要仅获取满足特定条件的邮件,可以使用接受 MailQuery 作为参数。 MailQuery 类提供了多种属性来定义这些条件,例如日期、主题、发件人和收件人。

第一个代码示例演示了如何根据日期和主题同时过滤邮件。其他示例展示了按其他条件过滤以及构建更复杂查询。此外,API 支持区分大小写的搜索条件以实现精确过滤,并允许在过滤邮箱中的邮件时指定搜索字符串的编码。

过滤并获取 IMAP 服务器的邮件

构建简单的 IMAP 查询

使用下面的代码片段连接到 IMAP 邮箱,获取今天收到且主题包含 “newsletter” 的邮件。

  1. 使用端口 993 并提供用户名和密码连接到 IMAP 服务器。
  2. 选择 “Inbox” 文件夹以处理收件邮件。
  3. 创建以下实例: ImapQueryBuilder 用于构建搜索查询。
  4. 指定搜索条件,例如邮件主题应包含"Newsletter",且内部日期应匹配今天的日期。
  5. 从构建器获取并生成搜索查询。
  6. 使用查询列出符合条件的邮件。
  7. 打印符合搜索条件的邮件总数。

构建复杂搜索条件

Aspose.Email 还可以构建复杂的搜索条件,用于查询和过滤电子邮件,例如投递日期、范围内、特定发件人、特定域或特定收件人。为此,请使用 MailQueryBuilder 类及其属性。下面的代码示例将向您展示如何按特定条件获取邮件。

按今天的日期过滤电子邮件

要按投递日期获取邮件,请使用 ‘internal_date’ 属性的 MailQueryBuilder 类,如以下代码示例所示:

import aspose.email as ae
from datetime import datetime

builder = ae.tools.search.MailQueryBuilder()
builder.internal_date.on(datetime.now())

按日期范围过滤邮件

要在日期范围内获取邮件,请使用相同的 ‘internal_date’ 属性并在下面的代码示例中指定日期范围:

import aspose.email as ae
from datetime import datetime, timedelta

builder = ae.tools.search.MailQueryBuilder()
# Emails that arrived in last 7 days
builder.internal_date.before(datetime.now())
builder.internal_date.since(datetime.today() - timedelta(days=7))

按特定发件人过滤电子邮件

要获取来自特定发件人的邮件,请使用该类的 ‘from_address’ 属性 MailQueryBuilder 类,如以下代码示例所示:

import aspose.email as ae

builder = ae.tools.search.MailQueryBuilder()
builder.from_address.contains("saqib.razzaq@127.0.0.1")

按特定域过滤邮件

要获取发送自特定域的邮件,请使用下面代码示例中的 ‘from_address’ 属性:

import aspose.email as ae

builder = ae.tools.search.MailQueryBuilder()
builder.from_address.contains("SpecificHost.com")

按特定收件人过滤邮件

要获取发送给特定收件人的邮件,请使用下面代码示例中的 ’to’ 属性:

import aspose.email as ae

builder = ae.tools.search.MailQueryBuilder()
builder.to.contains("recipient")

按内部日期过滤邮件

基于指定条件(如 “internal date” 和 “subject contains”)构建查询。“internal date” 是指邮件在服务器上接收或加入的日期时间,可使用 ImapQueryBuilder 类。下面的代码示例演示了如何根据主题和日期条件从收件箱获取特定邮件:

import aspose.email as ae
from datetime import datetime

client = ae.clients.imap.ImapClient("imap.domain.com", 993, "user@domain.com", "pwd")
client.select_folder("Inbox")

# Set conditions, Subject contains "Newsletter", Emails that arrived today
builder = ae.clients.imap.ImapQueryBuilder()
builder.subject.contains("Newsletter")
builder.internal_date.on(datetime.now())

# Build the query and Get list of messages
query = builder.get_query()
messages = client.list_messages(query)
for info in messages:
    print(f"Internal Date: {info.internal_date}")

按自定义关键字标记过滤邮件

创建查询,以在 IMAP 邮箱中搜索包含自定义关键字标记(如 "custom1" 和 "custom2")的邮件。要构建查询,请使用 ImapQueryBuilder 类,在从 IMAP 服务器检索邮件时进行过滤。

首先,创建查询构建器的实例。使用 has_flags 方法,添加条件,仅包括携带指定 IMAP 关键字标记的邮件。IMAP 中的自定义关键字,也称为用户定义标记,允许用户对邮件进行标记或分类以实现各种目的,例如标记状态。

下面的代码片段说明了如何创建查询,以根据自定义关键字标记检索邮件:


builder = ae.clients.imap.ImapQueryBuilder()
builder.has_flags(ae.clients.imap.ImapMessageFlags.keyword("custom1"))
builder.has_flags(ae.clients.imap.ImapMessageFlags.keyword("custom2"))

构建复杂查询

有时需要满足多个查询。Aspose.Email 通过在多个语句中组合查询实现此目的。创建一个 MailQueryBuilder 对象并使用其属性构建特定查询。

使用 AND 组合查询

下面的代码片段展示了如何使用 AND 组合查询。

import aspose.email as ae
from datetime import datetime, timedelta

builder = ae.tools.search.MailQueryBuilder()
builder.internal_date.before(datetime.now())
builder.internal_date.since(datetime.today() - timedelta(days=7))
builder.from_address.contains("SpecificHost.com")

使用 OR 组合查询

以下代码片段展示了如何使用 OR 合并查询。


builder.either(builder.subject.contains("test"), builder.from_address.contains("noreply@host.com"))

应用区分大小写的过滤器

API 还提供了基于区分大小写条件过滤邮箱中电子邮件的能力。以下方法属于 StringComparisonField 类提供了使用区分大小写标志搜索电子邮件的功能。

  • StringComparisonField.contains(value, ignore_case)
  • StringComparisonField.equals(value, ignore_case)
  • StringComparisonField.not_contains(value, ignore_case)
  • StringComparisonField.not_equals(value, ignore_case)

以下代码片段展示了如何在项目中实现此功能:


builder = ae.tools.search.MailQueryBuilder()
builder.from_address.contains("noreply@host.com", True)

执行自定义搜索查询

为 IMAP 邮箱创建搜索查询,以基于自定义 Gmail 搜索条件过滤邮件 —— 即具有附件的邮件。

首先创建一个 ImapQueryBuilder,帮助构建复杂的 IMAP 搜索查询。使用 custom_search 向查询构建器添加 Gmail 特定搜索字符串的方法。

搜索字符串 X-GM-RAW "has:attachment" 利用了 Gmail 扩展的 IMAP 属性 X-GM-RAW,使得在 IMAP 查询中可以使用 Gmail 强大的网络邮件搜索语法。这里,has:attachment 运算符返回所有包含附件的邮件。

下面的代码片段演示了如何过滤邮件以获取所有带附件的邮件:


builder = ae.clients.imap.ImapQueryBuilder()
builder.custom_search("X-GM-RAW \"has:attachment\"")

mailQuery = builder.get_query()

此方法支持高级 Gmail 特定过滤,以获取目标邮件。