إدارة المجلدات على خادم IMAP في بايثون

قائمة مجلدات 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 فئات لإضافة رسالة جديدة إلى مجلد. أولاً، أنشئ MailMessage كائن عن طريق تحديد الموضوع، المرسل، والمستلم. ثم اشترك في مجلد وأضف الرسالة إليه. يوضح مقتطف الشيفرة أدناه كيفية إضافة رسالة جديدة إلى مجلد:

  1. تهيئة عميل IMAP باستخدام ImapClient فئة للاتصال بخادم البريد الإلكتروني الخاص بك. قدم عنوان الخادم، المنفذ، اسم المستخدم، وكلمة المرور.
  2. حدد المجلد المستهدف حيث تريد إضافة الرسالة الجديدة، مثل "Inbox"، باستخدام طريقة select_folder.
  3. إنشاء بريد إلكتروني جديد باستخدام MailMessage فئة. حدد المرسل، المستلم، الموضوع، ومحتوى الرسالة.
  4. اشترك في المجلد باستخدام طريقة subscribe_folder مع اسم المجلد.
  5. أضف الرسالة التي تم إنشاؤها حديثًا إلى المجلد المحدد باستخدام طريقة append_message، مع تحديد اسم المجلد وكائن الرسالة.

نقل الرسائل بين المجلدات

تتيح Aspose.Email ل .NET نقل الرسائل من مجلد صندوق بريد إلى آخر باستخدام ImapClient API. طريقة move_message تستخدم المعرف الفريد للرسالة واسم المجلد الوجهة لنقل الرسالة إلى المجلد المستهدف. يوضح مقتطف الشيفرة التالي كيفية نقل الرسائل بين المجلدات:

نسخ الرسائل بين المجلدات

تمكنك Aspose.Email API من نسخ الرسائل من مجلد صندوق بريد إلى آخر بسهولة. يمكنك نسخ رسالة واحدة أو عدة رسائل باستخدام طريقتي 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)