Quản lý Thư Mục trên Máy Chủ IMAP trong Python

Liệt Kê Thư Mục IMAP

Việc lấy thông tin thư mục từ máy chủ IMAP trở nên đơn giản với Aspose.Email. Thực hiện các bước dưới đây để lấy và làm việc với chi tiết thư mục:

  1. Sử dụng phương thức list_folders() từ Aspose.Email ImapClient lớp. Phương thức này trả về một thể hiện của ImapFolderInfoCollection, chứa thông tin chi tiết về tất cả các thư mục.
  2. Lặp qua ImapFolderInfoCollection đối tượng để truy cập thông tin về các thư mục riêng lẻ.
  3. Lấy các thư mục con (tùy chọn). Phương thức list_folders() được nạp lại. Bạn có thể truyền tên thư mục làm tham số để lấy tập hợp các thư mục con cho thư mục đã chỉ định.

Đoạn mã dưới đây minh họa cách lấy thông tin thư mục từ máy chủ IMAP bằng phương pháp Aspose.Email:

Đổi Tên và Xóa Thư Mục

Aspose.Email cung cấp các phương thức của ImapClient lớp để quản lý các thư mục trên máy chủ email qua IMAP:

  • phương thức delete_folder - xóa vĩnh viễn thư mục và tất cả các tin nhắn chứa trong đó.
  • phương thức rename_folder - thay đổi tên thư mục mà không làm thay đổi nội dung bên trong.

Đoạn mã dưới đây cho thấy cách xóa hoặc đổi tên thư mục trên máy chủ IMAP một cách lập trình:

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

Tạo và Thêm Tin Nhắn vào Các Thư Mục Cụ Thể

Với API Aspose.Email, bạn có thể sử dụng MailMessageImapClient các lớp để thêm một tin nhắn mới vào thư mục. Đầu tiên, tạo một MailMessage đối tượng bằng cách chỉ định tiêu đề, người gửi và người nhận. Sau đó, đăng ký một thư mục và thêm tin nhắn vào đó. Đoạn mã dưới đây minh họa cách thêm một tin nhắn mới vào thư mục:

  1. Khởi tạo client IMAP bằng cách sử dụng ImapClient lớp để kết nối tới máy chủ email của bạn. Cung cấp địa chỉ máy chủ, cổng, tên người dùng và mật khẩu.
  2. Chọn thư mục mục tiêu nơi bạn muốn thêm tin nhắn mới, chẳng hạn "Inbox", bằng phương thức select_folder.
  3. Tạo một email mới bằng cách sử dụng MailMessage lớp. Xác định người gửi, người nhận, tiêu đề và nội dung tin nhắn.
  4. Đăng ký thư mục bằng phương thức subscribe_folder với tên thư mục.
  5. Thêm tin nhắn mới tạo vào thư mục đã chọn bằng phương thức append_message, xác định tên thư mục và đối tượng tin nhắn.

Di chuyển Tin nhắn giữa Các Thư mục

Aspose.Email cho .NET cho phép di chuyển tin nhắn từ một thư mục hộp thư sang thư mục khác bằng cách sử dụng ImapClient API. Phương thức move_message sử dụng ID duy nhất của tin nhắn và tên thư mục đích để di chuyển tin nhắn tới thư mục đích. Đoạn mã dưới đây cho bạn thấy cách di chuyển tin nhắn giữa các thư mục:

Sao Chép Tin Nhắn Giữa Các Thư Mục

API Aspose.Email cho phép bạn sao chép tin nhắn từ một thư mục hộp thư sang thư mục khác một cách dễ dàng. Bạn có thể sao chép một tin nhắn hoặc nhiều tin nhắn bằng các phương thức copy_messagecopy_messages. Phương thức copy_messages cho phép bạn chuyển nhiều tin nhắn từ thư mục nguồn sang thư mục đích trong hộp thư. Dưới đây là đoạn mã minh họa cách sao chép tin nhắn giữa các thư mục:

Làm Việc với Các Thư Mục Hộp Thư Đặc Biệt

Các hộp thư đặc biệt là các thư mục được định nghĩa trước trong hệ thống email, được thiết kế để xử lý các loại tin nhắn cụ thể, chẳng hạn như Sent, Drafts, Junk, Trash và Archive. Thư viện Aspose.Email đơn giản hoá việc truy cập các hộp thư này bằng cách gán các thuộc tính với vai trò và mục đích của chúng. Điều này cho phép client tự động phát hiện và hiển thị các thư mục này mà không cần bất kỳ sự can thiệp nào của người dùng.

Đoạn mã dưới đây minh họa cách lấy thông tin về các hộp thư đặc biệt chủ chốt (Inbox, Drafts, Junk, Sent, và Trash) bằng cách sử dụng các thuộc tính của ImapMailBoxInfo lớp và in chi tiết:

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)

Truy Cập Thư Mục và Đọc Tin Nhắn Đệ Quy

ImapClient sử dụng phương pháp đệ quy để liệt kê các thư mục và thư mục con từ máy chủ IMAP. Phương pháp này cũng được dùng để đọc và lưu tin nhắn vào đĩa cục bộ ở định dạng MSG. Cả thư mục và tin nhắn đều được tạo và lưu trong cùng cấu trúc phân cấp như trên máy chủ IMAP. Dưới đây là đoạn mã minh họa cách lấy thư mục và tin nhắn một cách đệ quy:

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.")

Sử Dụng MultiConnection cho Các Thao Tác Thư Mục Hàng Loạt

Aspose.Email cho phép cấu hình client để thiết lập nhiều kết nối đồng thời tới máy chủ IMAP. Điều này không nhất thiết tăng hiệu suất, nhưng là giải pháp đáng tin cậy cho các hoạt động đồng thời. Điều này đặc biệt hữu ích nếu client cần thực hiện nhiều nhiệm vụ cùng lúc, chẳng hạn lấy các thư mục email khác nhau, đồng bộ dữ liệu lớn, hoặc xử lý nhiều tin nhắn đồng thời.

Đoạn mã dưới đây cho thấy cách thiết lập nhiều kết nối tới máy chủ IMAP trong khi tải lên một bộ sưu tập email bằng phương thức ‘append_messages’ của ImapClient lớp:

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)