ניהול תיקיות בשרת IMAP ב‑Python

רשימת תיקיות IMAP

קבלת מידע על תיקייה משרת IMAP היא פשוטה עם Aspose.Email. פעלו לפי הצעדים שלהלן כדי לקבל ולעבוד עם פרטי תיקייה:

  1. השתמשו בשיטה list_folders() מ‑Aspose.Email ImapClient מחלקה. שיטה זו מחזירה מופע של אוסף מידע תיקייה Imap, המכיל פרטים על כל התיקיות.
  2. לולאה על ה- אוסף מידע תיקייה Imap אובייקט לגישה למידע על תיקיות בודדות.
  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)