Керування папками на сервері IMAP у Python

Список папок IMAP

Отримання інформації про папку з сервера IMAP просте за допомогою Aspose.Email. Дотримуйтесь наведених нижче кроків, щоб отримати та працювати з деталями папки:

  1. Використовуйте метод list_folders() з Aspose.Email ImapClient клас. Цей метод повертає екземпляр ImapFolderInfoCollection, який містить детальну інформацію про всі папки.
  2. Перебрати ImapFolderInfoCollection об’єкт для доступу до інформації про окремі папки.
  3. Отримати підпапки (за бажанням). Метод list_folders() перевантажений. Ви можете передати назву папки як параметр, щоб отримати колекцію підпапок для вказаної папки.

Нижче наведений фрагмент коду демонструє, як отримати інформацію про папку з сервера IMAP за допомогою методу Aspose.Email:

Перейменування та видалення папок

Aspose.Email надає методи ImapClient клас для керування папками на поштовому сервері через IMAP:

  • метод delete_folder — назавжди видаляє папку та всі листи, що містяться в ній.
  • метод rename_folder — змінює назву папки без зміни її вмісту.

Нижче наведений фрагмент коду показує, як програмно видаляти або перейменовувати папки на сервері IMAP:

# Delete a folder and Rename a folder
client.delete_folder("foldername")
client.rename_folder("foldername", "newfoldername")

Створення та додавання листів до конкретних папок

За допомогою API Aspose.Email можна скористатися MailMessage і ImapClient класи для додавання нового листа до папки. Спочатку створіть MailMessage об’єкт, вказавши тему, відправника та одержувача. Потім підпишіться на папку та додайте лист до неї. Нижче наведений фрагмент коду демонструє, як додати новий лист до папки:

  1. Ініціалізуйте IMAP‑клієнт за допомогою ImapClient клас для підключення до вашого поштового сервера. Вкажіть адресу сервера, порт, ім’я користувача та пароль.
  2. Виберіть цільову папку, у яку ви хочете додати новий лист, наприклад "Inbox", за допомогою методу select_folder.
  3. Створіть новий лист за допомогою MailMessage клас. Вкажіть відправника, одержувача, тему та вміст листа.
  4. Підпишіться на папку за допомогою методу subscribe_folder, вказавши назву папки.
  5. Додайте щойно створений лист до вибраної папки за допомогою методу append_message, вказавши назву папки та об’єкт листа.

Переміщення повідомлень між папками

Aspose.Email для .NET дозволяє переміщати листи з однієї папки поштової скриньки в іншу за допомогою ImapClient API. Метод move_message використовує унікальний ідентифікатор листа та назву цільової папки для переміщення листа до цільової папки. Нижче наведений фрагмент коду показує, як переміщувати листи між папками:

Копіювання листів між папками

API Aspose.Email дозволяє легко копіювати листи з однієї папки поштової скриньки в іншу. Ви можете копіювати один лист або декілька листів за допомогою методів copy_message та copy_messages. Метод copy_messages дозволяє перенести кілька листів з вихідної папки у цільову папку в межах скриньки. Нижче наведено фрагмент коду, який демонструє копіювання листів між папками:

Робота зі спеціалізованими поштовими папками

Спеціалізовані поштові ящики — це попередньо визначені папки в системі електронної пошти, створені для обробки певних типів повідомлень, таких як Надіслані, Чернетки, Спам, Видалені та Архів. Бібліотека Aspose.Email спрощує доступ до цих ящиків, асоціюючи атрибути з їх ролями та призначенням. Це дозволяє клієнтам автоматично знаходити та відображати ці папки без будь‑якого втручання користувача.

Нижче наведений фрагмент коду демонструє, як отримати інформацію про ключові спеціалізовані поштові ящики (Inbox, Drafts, Junk, Sent та Trash) за допомогою властивостей ImapMailBoxInfo клас і вивести деталі:

import aspose.email as ae

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

mailboxInfo = client.mailbox_info
print(mailboxInfo.inbox)
print(mailboxInfo.draft_messages)
print(mailboxInfo.junk_messages)
print(mailboxInfo.sent_messages)
print(mailboxInfo.trash)

Доступ до папок і рекурсивне читання листів

ImapClient використовує рекурсивний метод для отримання списку папок і підпапок з сервера IMAP. Цей метод також застосовується для читання та збереження листів на локальний диск у форматі MSG. Папки та листи створюються та зберігаються в тій самій ієрархічній структурі, що й на сервері IMAP. Нижче наведено фрагмент коду, який демонструє рекурсивне отримання папок і листів:

import aspose.email as ae
import os

# Recursive method to get messages from folders and sub-folders
def list_messages_in_folder(folder_info, root_folder, client):
    # Create the folder on disk (same name as on the IMAP server)
    current_folder = os.path.join(root_folder, folder_info.name)
    os.makedirs(current_folder, exist_ok=True)

    # Read the messages from the current folder, if it is selectable
    if folder_info.selectable:
        # Send a status command to get folder info
        folder_info_status = client.get_folder_info(folder_info.name)
        print(
            f"{folder_info_status.name} folder selected. New messages: {folder_info_status.new_message_count}, "
            f"Total messages: {folder_info_status.total_message_count}"
        )

        # Select the current folder and list messages
        client.select_folder(folder_info.name)
        msg_info_coll = client.list_messages()
        print("Listing messages....")
        for msg_info in msg_info_coll:
            # Get subject and other properties of the message
            print("Subject:", msg_info.subject)
            print(
                f"Read: {msg_info.is_read}, Recent: {msg_info.recent}, Answered: {msg_info.answered}"
            )

            # Get rid of characters like ? and :, which should not be included in a file name
            # Save the message in MSG format
            file_name = (
                msg_info.subject.replace(":", " ").replace("?", " ")
                + "-"
                + str(msg_info.sequence_number)
                + ".msg"
            )
            msg = client.fetch_message(msg_info.sequence_number)
            msg.save(
                os.path.join(current_folder, file_name),
                ae.SaveOptions.default_msg_unicode,
            )
        print("============================\n")
    else:
        print(f"{folder_info.name} is not selectable.")

    try:
        # If this folder has sub-folders, call this method recursively to get messages
        folder_info_collection = client.list_folders(folder_info.name)
        for subfolder_info in folder_info_collection:
            list_messages_in_folder(subfolder_info, root_folder, client)
    except Exception:
        pass



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

try:
    # The root folder (which will be created on disk) consists of host and username
    root_folder = f"{client.host}-{client.username}"

    # Create the root folder and list all the folders from the IMAP server
    os.makedirs(root_folder, exist_ok=True)
    folder_info_collection = client.list_folders()
    for folder_info in folder_info_collection:
        # Call the recursive method to read messages and get sub-folders
        list_messages_in_folder(folder_info, root_folder, client)
except Exception as ex:
        print("\n", ex)

print("\nDownloaded messages recursively from IMAP server.")

Використання MultiConnection для пакетних операцій з папками

Aspose.Email дозволяє налаштувати клієнт для встановлення кількох одночасних з’єднань з сервером IMAP. Це не обов’язково підвищує швидкість, проте є надійним рішенням для паралельних операцій. Це особливо корисно, коли клієнту потрібно виконувати кілька завдань одночасно, напр., отримувати різні папки, синхронізувати великі обсяги даних або обробляти багато листів одночасно.

Нижче наведений фрагмент коду показує, як встановити кілька з’єднань з сервером IMAP під час завантаження колекції листів за допомогою методу ‘append_messages’ класу ImapClient клас:

import aspose.email as ae

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

client.connections_quantity = 5
client.use_multi_connection = ae.clients.MultiConnectionMode.ENABLE
client.append_messages(messages)