Поиск и фильтрация IMAP‑писем в Python

Чтобы получить все сообщения из почтового ящика, Aspose.Email предоставляет метод ’list_messages’ класса ImapClient класс. Чтобы получать только сообщения, удовлетворяющие определённым условиям, можно воспользоваться перегруженным методом ’list_messages’, который принимает MailQuery в качестве аргумента. The MailQuery класс предоставляет различные свойства для определения этих условий, такие как дата, тема, отправитель и получатель.

Первый пример кода демонстрирует, как отфильтровать сообщения по дате и теме. Дополнительные примеры показывают фильтрацию по другим критериям и построение более сложных запросов. Кроме того, API поддерживает чувствительные к регистру критерии поиска для точной фильтрации и позволяет указать кодировку строки поиска при фильтрации сообщений из почтового ящика.

Фильтрация и получение сообщений с IMAP сервера

Создать простой IMAP запрос

Используйте следующий фрагмент кода для подключения к IMAP‑почтовому ящику и получения сообщений, полученных сегодня и содержащих слово "newsletter" в теме.

  1. Подключитесь к IMAP серверу через порт 993, используя имя пользователя и пароль.
  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" — это дата и время, когда письмо было получено или добавлено на почтовый сервер, и её можно установить с помощью свойства ‘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

В следующем фрагменте кода показано, как комбинировать запросы с помощью И.

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" использует расширенный атрибут IMAP Gmail X-GM-RAW, позволяя применять мощный синтаксис поиска Gmail в запросах IMAP. Оператор has:attachment возвращает все письма, содержащие вложения.

Приведённый ниже фрагмент кода демонстрирует, как отфильтровать письма, чтобы получить все сообщения с вложениями:


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

mailQuery = builder.get_query()

Этот метод позволяет выполнять расширенную фильтрацию, специфичную для Gmail, чтобы получить нужные письма.