Управление папками на IMAP-сервере в Python
Список папок IMAP
Получение информации о папке с IMAP‑сервера простое с Aspose.Email. Следуйте шагам ниже, чтобы получить и работать с деталями папок:
- Используйте метод list_folders() из Aspose.Email ImapClient класс. Этот метод возвращает экземпляр ImapFolderInfoCollection, который содержит детали обо всех папках.
- Переберите ImapFolderInfoCollection объект для доступа к информации об отдельных папках.
- Получить вложенные папки (необязательно). Метод 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")
Создание и добавление сообщений в определённые папки
С помощью Aspose.Email API вы можете использовать MailMessage и ImapClient классы для добавления нового сообщения в папку. Сначала создайте MailMessage объект, указав тему, отправителя и получателя. Затем подпишитесь на папку и добавьте в неё сообщение. Приведённый ниже фрагмент кода демонстрирует, как добавить новое сообщение в папку:
- Инициализируйте IMAP‑клиент, используя ImapClient класс для подключения к вашему почтовому серверу. Укажите адрес сервера, порт, имя пользователя и пароль.
- Выберите целевую папку, в которую хотите добавить новое сообщение, например "Inbox", используя метод select_folder.
- Создайте новое электронное письмо с помощью MailMessage класс. Укажите отправителя, получателя, тему и содержание сообщения.
- Подпишитесь на папку, используя метод subscribe_folder с именем папки.
- Добавьте только что созданное сообщение в выбранную папку, используя метод 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)