จัดการโฟลเดอร์บนเซิร์ฟเวอร์ 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")

สร้างและเพิ่มข้อความไปยังโฟลเดอร์เฉพาะ

ด้วย Aspose.Email API คุณสามารถใช้ MailMessage และ ImapClient คลาสเพื่อเพิ่มข้อความใหม่ลงในโฟลเดอร์ ก่อนอื่นสร้าง a MailMessage อ็อบเจกต์โดยระบุหัวเรื่อง, ผู้ส่ง และผู้รับ จากนั้นสมัครสมาชิกโฟลเดอร์และเพิ่มข้อความลงในนั้น ตัวอย่างโค้ดด้านล่างแสดงวิธีเพิ่มข้อความใหม่ลงในโฟลเดอร์:

  1. เริ่มต้นไคลเอนต์ IMAP ด้วย ImapClient คลาสเพื่อเชื่อมต่อกับเซิร์ฟเวอร์อีเมลของคุณ ระบุที่อยู่เซิร์ฟเวอร์, พอร์ต, ชื่อผู้ใช้, และรหัสผ่าน
  2. เลือกโฟลเดอร์เป้าหมายที่คุณต้องการเพิ่มข้อความใหม่ เช่น "Inbox" โดยใช้วิธี select_folder
  3. สร้างอีเมลใหม่โดยใช้ MailMessage คลาส ระบุผู้ส่ง, ผู้รับ, เรื่อง, และเนื้อหาข้อความ.
  4. สมัครสมาชิกโฟลเดอร์โดยใช้วิธี subscribe_folder พร้อมชื่อโฟลเดอร์
  5. เพิ่มข้อความที่สร้างใหม่ลงในโฟลเดอร์ที่เลือกโดยใช้วิธี append_message ระบุชื่อโฟลเดอร์และอ็อบเจกต์ของข้อความ

การย้ายข้อความระหว่างโฟลเดอร์

Aspose.Email สำหรับ .NET อนุญาตให้ย้ายข้อความจากโฟลเดอร์กล่องจดหมายหนึ่งไปยังอีกโฟลเดอร์โดยใช้ ImapClient API วิธี move_message ใช้ id ที่ไม่ซ้ำของข้อความและชื่อโฟลเดอร์ปลายทางเพื่อย้ายข้อความไปยังโฟลเดอร์ปลายทาง ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการย้ายข้อความระหว่างโฟลเดอร์:

คัดลอกข้อความระหว่างโฟลเดอร์

API ของ Aspose.Email ช่วยให้คุณคัดลอกข้อความจากโฟลเดอร์กล่องจดหมายหนึ่งไปยังอีกโฟลเดอร์ได้อย่างง่ายดาย คุณสามารถคัดลอกข้อความเดี่ยวหรือหลายข้อความด้วยวิธี copy_message และ copy_messages วิธี copy_messages ช่วยให้คุณถ่ายโอนหลายข้อความจากโฟลเดอร์ต้นทางไปยังโฟลเดอร์ปลายทางภายในกล่องจดหมาย ด้านล่างเป็นตัวอย่างโค้ดที่แสดงวิธีคัดลอกข้อความระหว่างโฟลเดอร์:

ทำงานกับโฟลเดอร์กล่องจดหมายพิเศษ

กล่องจดหมายพิเศษเป็นโฟลเดอร์ที่กำหนดล่วงหน้าในระบบอีเมลที่ออกแบบมาเพื่อจัดการประเภทข้อความเฉพาะ เช่น Sent, Drafts, Junk, Trash, และ Archive ไลบรารี 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)