Търсене и филтриране на IMAP имейли в Python

За извличане на всички съобщения от пощенска кутия Aspose.Email предоставя метода ’list_messages’ на ImapClient клас. За извличане само на съобщения, които отговарят на конкретни условия, можете да използвате претоварения метод ’list_messages’, който приема MailQuery като аргумент. 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

Следният кодов откъс показва как да комбинирате заявки с 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, за извличане на целеви имейли.