استرجاع وقائمة رسائل البريد من خادم IMAP

استرجاع وقائمة الرسائل

كيفية الحصول على معلومات تعريفية للرسائل في صندوق البريد

عند استرجاع ومعالجة رسائل البريد الإلكتروني، يمكنك الحصول على معلومات تعريفية مفصلة، مثل أرقام التسلسل والمعرفات الفريدة، باستخدام الميزات التالية التي توفرها أحدث نسخة من Aspose.Email لـ .NET:

Aspose.Email.ImapMessageInfo فئة: تمثل المعلومات التعريفية حول رسالة في صندوق بريد IMAP.

ImapMessageInfo.SequenceNumber خاصية: تسترجع رقم تسلسل الرسالة.

ImapMessageInfo.UniqueId خاصية: تسترجع المعرف الفريد للرسالة.

Aspose.Email.MailMessage.ItemId خاصية: تمثل معلومات تعريفية إضافية حول الرسالة داخل صندوق البريد.

يوضح مقتطف الشيفرة التالي كيفية الحصول على معلومات تعريفية للرسائل في صندوق بريد IMAP:

  1. إنشاء مثيل من الـ ImapClient فئة من خلال توفير المعلمات الضرورية مثل مضيف خادم IMAP، المنفذ، عنوان البريد الإلكتروني، كلمة المرور، وخيارات الأمان.
  2. استخدم الـ ListMessages طريقة لاسترجاع قائمة رسائل من المجلد "INBOX". قصر القائمة على أول خمس رسائل باستخدام طريقة Take(5).
  3. استخراج أرقام التسلسل للرسائل المدرجة باستخدام SequenceNumber خاصية لكل رسالة.
  4. استخدم الـ FetchMessages طريقة لاسترجاع التفاصيل الكاملة للرسائل من الخادم، باستخدام أرقام التسلسلية التي تم الحصول عليها في الخطوة السابقة.
  5. تكرار عبر الرسائل المسترجعة ولكل رسالة، استرجع واعرض المعلومات التالية:
  • رقم تسلسل الرسالة.
  • خاصية ItemId.SequenceNumber.
  • موضوع الرسالة.
using (var client = new ImapClient(imapHost, port, emailAddress, password, securityOption))
{
    // List the first 5 messages from the inbox
    var msgs = client.ListMessages("INBOX").Take(5);
    
    // Get sequence numbers of the messages
    var seqIds = msgs.Select(t => t.SequenceNumber);
    
    // Fetch messages based on sequence numbers
    var msgsViaFetch = client.FetchMessages(seqIds);
    
    for (var i = 0; i < 5; i++)
    {
        var thisMsg = msgsViaFetch[i];
        Console.WriteLine($"Message ID: {seqIds.ElementAt(i)} SequenceNumber: {thisMsg.ItemId.SequenceNumber} Subject: {thisMsg.Subject}");
    }
}

قائمة معرفات رسائل MIME من الخادم

ImapMessageInfo يوفر الـ MIME MessageId لتحديد الرسائل دون استخراج الرسالة كاملة. يوضح المقتطف البرمجي التالي كيفية سرد معرف MIME للرسالة.

ImapClient client = new ImapClient();
client.Host = "domain.com";
client.Username = "username";
client.Password = "password";
    
try
{
    ImapMessageInfoCollection messageInfoCol = client.ListMessages("Inbox");
    foreach (ImapMessageInfo info in messageInfoCol)
    {
        // Display MIME Message ID
        Console.WriteLine("Message Id = " + info.MessageId);
    }
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

قائمة الرسائل من الخادم

يوفر Aspose.Email نسخة محملة بمتغيرين من ListMessages() لاسترجاع عدد محدد من الرسائل بناءً على استعلام. يوضح مقتطف الشيفرة التالي كيفية سرد الرسائل.


imapClient.SelectFolder("Inbox");
ImapQueryBuilder builder = new ImapQueryBuilder();
MailQuery query =
	builder.Or(
	builder.Or(
	builder.Or(
	builder.Or(
	builder.Subject.Contains(" (1) "),
	builder.Subject.Contains(" (2) ")),
	builder.Subject.Contains(" (3) ")),
	builder.Subject.Contains(" (4) ")),
	builder.Subject.Contains(" (5) "));
ImapMessageInfoCollection messageInfoCol4 = imapClient.ListMessages(query, 4);
Console.WriteLine((messageInfoCol4.Count == 4) ? "Success" : "Failure");

إدراج الرسائل بشكل متكرر

يدعم بروتوكول IMAP سرد الرسائل بصورة متكررة من مجلد صندوق بريد. هذا يساعد في سرد الرسائل من المجلدات الفرعية كذلك. يوضح المقتطف البرمجي التالي كيفية سرد الرسائل بصورة متكررة.

// Create an imapclient with host, user and password
ImapClient client = new ImapClient();
client.Host = "domain.com";
client.Username = "username";
client.Password = "password";
client.SelectFolder("InBox");
ImapMessageInfoCollection msgsColl = client.ListMessages(true);
Console.WriteLine("Total Messages: " + msgsColl.Count);

إدراج الرسائل مع MultiConnection

ImapClient يوفر UseMultiConnection خاصية يمكن استخدامها لإنشاء اتصالات متعددة للعمليات الثقيلة. يمكنك أيضًا تحديد عدد الاتصالات التي ستُستخدم أثناء وضع متعدد الاتصالات باستخدام ImapClient.ConnectionsQuantity. يوضح المقتطف البرمجي التالي استعمال وضع الاتصال المتعدد لسرد الرسائل ويقارن أدائه مع وضع الاتصال الفردي.

ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;

imapClient.SelectFolder("Inbox");
imapClient.ConnectionsQuantity = 5;
imapClient.UseMultiConnection = MultiConnectionMode.Enable;
DateTime multiConnectionModeStartTime = DateTime.Now;
ImapMessageInfoCollection messageInfoCol1 = imapClient.ListMessages(true);
TimeSpan multiConnectionModeTimeSpan = DateTime.Now - multiConnectionModeStartTime;

imapClient.UseMultiConnection = MultiConnectionMode.Disable;
DateTime singleConnectionModeStartTime = DateTime.Now;
ImapMessageInfoCollection messageInfoCol2 = imapClient.ListMessages(true);
TimeSpan singleConnectionModeTimeSpan = DateTime.Now - singleConnectionModeStartTime;
            
double performanceRelation = singleConnectionModeTimeSpan.TotalMilliseconds / multiConnectionModeTimeSpan.TotalMilliseconds;
Console.WriteLine("Performance Relation: " + performanceRelation);

إدراج الرسائل مع دعم التجزئة

في السيناريوهات التي يحتوي فيها خادم البريد على عدد كبير من الرسائل في صندوق البريد، غالبًا ما يكون من المطلوب سرد الرسائل أو استرجاعها مع دعم الصفحات. Aspose.Email API’s ImapClient يسمح لك بجلب الرسائل من الخادم مع دعم الصفحات.

///<summary>
/// This example shows the paging support of ImapClient for listing messages from the server
/// Available in Aspose.Email for .NET 6.4.0 and onwards
///</summary>
using (ImapClient client = new ImapClient("host.domain.com", 993, "username", "password"))
{
    try
    {
        int messagesNum = 12;
        int itemsPerPage = 5;
        MailMessage message = null;
        // Create some test messages and append these to server's inbox
        for (int i = 0; i < messagesNum; i++)
        {
            message = new MailMessage(
                "from@domain.com",
                "to@domain.com",
                "EMAILNET-35157 - " + Guid.NewGuid(),
                "EMAILNET-35157 Move paging parameters to separate class");
            client.AppendMessage(ImapFolderInfo.InBox, message);
        }

        // List messages from inbox
        client.SelectFolder(ImapFolderInfo.InBox);
        ImapMessageInfoCollection totalMessageInfoCol = client.ListMessages();
        // Verify the number of messages added
        Console.WriteLine(totalMessageInfoCol.Count);

        ////////////////// RETREIVE THE MESSAGES USING PAGING SUPPORT////////////////////////////////////

        List<ImapPageInfo> pages = new List<ImapPageInfo>();
        PageSettings pageSettings = new PageSettings();
        ImapPageInfo pageInfo = client.ListMessagesByPage(itemsPerPage, 0, pageSettings);
        Console.WriteLine(pageInfo.TotalCount);
        pages.Add(pageInfo);
        while (!pageInfo.LastPage)
        {
            pageInfo = client.ListMessagesByPage(itemsPerPage, pageInfo.NextPage.PageOffset, pageSettings);
            pages.Add(pageInfo);
        }
        int retrievedItems = 0;
        foreach (ImapPageInfo folderCol in pages)
            retrievedItems += folderCol.Items.Count;
        Console.WriteLine(retrievedItems);
    }
    finally
    {
    }
}

قائمة مرفقات الرسائل

للحصول على معلومات حول المرفقات مثل الاسم والحجم دون جلب بيانات المرفق، جرّب واجهات برمجة التطبيقات التالية:

  • Aspose.Email.Clients.Imap.ImapAttachmentInfo - تمثل معلومات مرفق.
  • Aspose.Email.Clients.Imap.ImapAttachmentInfoCollection - تمثل مجموعة من الـ ImapAttachmentInfo فئة.
  • Aspose.Email.Clients.Imap.ListAttachments(int sequenceNumber) - يحصل على معلومات لكل مرفق في الرسالة.

ستظهر لك عينة الشيفرة مع الخطوات أدناه كيفية استخدام واجهات برمجة التطبيقات:

  1. استدعِ الـ ListMessages() طريقة على كائن imapClient. ستُرجع هذه الطريقة ImapMessageInfoCollection التي تحتوي على معلومات حول الرسائل في صندوق البريد.
  2. تكرار عبر كل رسالة في messageInfoCollection باستخدام حلقة foreach.
  3. استدعِ الـ ListAttachments() طريقة على كائن imapClient، مع تمرير خاصية SequenceNumber لكائن الرسالة كمعامل. ستُرجع هذه الطريقة ImapAttachmentInfoCollection التي تحتوي على معلومات عن المرفقات في الرسالة.
  4. تكرار عبر كل مرفق في attachmentInfoCollection باستخدام حلقة foreach.
  5. داخل الحلقة الداخلية، يمكنك الوصول إلى معلومات كل مرفق باستخدام خصائص كائن attachmentInfo.
var messageInfoCollection = imapClient.ListMessages();
    
foreach (var message in messageInfoCollection)
{
    var attachmentInfoCollection = imapClient.ListAttachments(message.SequenceNumber);

    foreach (var attachmentInfo in attachmentInfoCollection)
    {
        Console.WriteLine("Attachment: {0} (size: {1})", attachmentInfo.Name, attachmentInfo.Size);
    }
}

استرجاع الرسائل وحفظها

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

الـ ImapClient الفئة يمكنها جلب الرسائل من خادم IMAP وحفظها بصيغة EML على قرص محلي. الخطوات التالية مطلوبة لحفظ الرسائل على القرص:

  1. إنشاء مثيل من الـ ImapClient فئة.
  2. حدد اسم المضيف، المنفذ، اسم المستخدم، وكلمة المرور في ImapClient constructor.
  3. اختر المجلد باستخدام SelectFolder() طريقة.
  4. استدعِ الـ ListMessages طريقة للحصول على الـ ImapMessageInfoCollection الكائن.
  5. التكرار عبر الـ ImapMessageInfoCollection مجموعة، استدعِ الـ SaveMessage() طريقة وتزويد مسار الإخراج واسم الملف.

يُظهر مقتطف الشيفرة التالي كيفية جلب رسائل البريد الإلكتروني من خادم وحفظها.

// Select the inbox folder and Get the message info collection
client.SelectFolder(ImapFolderInfo.InBox);
ImapMessageInfoCollection list = client.ListMessages();

// Download each message
for (int i = 0; i < list.Count; i++)
{
    // Save the EML file locally
    client.SaveMessage(list[i].UniqueId, dataDir + list[i].UniqueId + ".eml");
}

جلب الرسائل بترتيب تنازلي

يوفر Aspose.Email ImapClient.ListMessagesByPage طريقة تقوم بسرد الرسائل بدعم الصفحات. بعض التحميلات الزائدة لـ ImapClient.ListMessagesByPage accept PageSettings كمعامل. PageSettings يوفر AscendingSorting خاصية، عندما تُضَبط على false، تُعيد الرسائل بترتيب تنازلي.

يُظهر مثال الشيفرة التالي كيفية استخدام AscendingSorting خاصية الـ PageSettings فئة لتغيير ترتيب الرسائل.

ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;

PageSettings pageSettings = new PageSettings { AscendingSorting = false };
ImapPageInfo pageInfo = imapClient.ListMessagesByPage(5, pageSettings);
ImapMessageInfoCollection messages = pageInfo.Items;

foreach (ImapMessageInfo message in messages)
{
    Console.WriteLine(message.Subject + " -> " + message.Date.ToString());
}

حفظ الرسائل بصيغة MSG

لحفظ الرسائل بصيغة MSG، الـ ImapClient.FetchMessage() يجب استدعاء الطريقة. تُعيد الرسالة ككائن من النوع MailMessage الفئة. الـ MailMessage.Save() يمكن بعد ذلك استدعاء الطريقة لحفظ الرسالة بصيغة MSG. يوضح مقتطف الشيفرة التالي كيفية حفظ الرسائل بصيغة MSG.

// The path to the file directory.
string dataDir = RunExamples.GetDataDir_IMAP();

// Create an imapclient with host, user and password
ImapClient client = new ImapClient("localhost", "user", "password");

// Select the inbox folder and Get the message info collection
client.SelectFolder(ImapFolderInfo.InBox);
ImapMessageInfoCollection list = client.ListMessages();

// Download each message
for (int i = 0; i < list.Count; i++)
{
    // Save the message in MSG format
    MailMessage message = client.FetchMessage(list[i].UniqueId);
    message.Save(dataDir + list[i].UniqueId + "_out.msg", SaveOptions.DefaultMsgUnicode);
}

تجميع الرسائل المستخرجة

ImapClient يوفر FetchMessages طريقة التي تقبل iterable من أرقام التسلسل أو المعرف الفريد وتُعيد قائمة بـ MailMessage. يوضح المقتطف البرمجي التالي كيفية استخدام الـ FetchMessages طريقة لجلب الرسائل حسب أرقام التسلسل والمعرف الفريد.

ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;

ImapMessageInfoCollection messageInfoCol = imapClient.ListMessages();
Console.WriteLine("ListMessages Count: " + messageInfoCol.Count);
int[] sequenceNumberAr = messageInfoCol.Select((ImapMessageInfo mi) => mi.SequenceNumber).ToArray();
string[] uniqueIdAr = messageInfoCol.Select((ImapMessageInfo mi) => mi.UniqueId).ToArray();

IList<MailMessage> fetchedMessagesBySNumMC = imapClient.FetchMessages(sequenceNumberAr);
Console.WriteLine("FetchMessages-sequenceNumberAr Count: " + fetchedMessagesBySNumMC.Count);

IList<MailMessage> fetchedMessagesByUidMC = imapClient.FetchMessages(uniqueIdAr);
Console.WriteLine("FetchMessages-uniqueIdAr Count: " + fetchedMessagesByUidMC.Count);

جلب المجلدات وقراءة الرسائل بصورة متكررة

في هذه المقالة، معظم ImapClient تُستخدم الميزات لإنشاء تطبيق يسرد جميع المجلدات والمجلدات الفرعية بصورة متكررة من خادم IMAP. كما يقوم بحفظ الرسائل في كل مجلد ومجلد فرعي بصيغة MSG على قرص محلي. على القرص، تُنشأ المجلدات والرسائل وتُحفظ بنفس الهيكل الهرمي الموجود على خادم IMAP. يوضح المقتطف البرمجي التالي كيفية الحصول على رسائل ومعلومات المجلدات الفرعية بصورة متكررة.

public static void Run()
{
    // Create an instance of the ImapClient class
    ImapClient client = new ImapClient();

    // Specify host, username, password, Port and SecurityOptions for your client
    client.Host = "imap.gmail.com";
    client.Username = "your.username@gmail.com";
    client.Password = "your.password";
    client.Port = 993;
    client.SecurityOptions = SecurityOptions.Auto;
    try
    {
        // The root folder (which will be created on disk) consists of host and username
        string rootFolder = client.Host + "-" + client.Username;

        // Create the root folder and List all the folders from IMAP server
        Directory.CreateDirectory(rootFolder);
        ImapFolderInfoCollection folderInfoCollection = client.ListFolders();
        foreach (ImapFolderInfo folderInfo in folderInfoCollection)
        {
            // Call the recursive method to read messages and get sub-folders
            ListMessagesInFolder(folderInfo, rootFolder, client);
        }
        // Disconnect to the remote IMAP server
        client.Dispose();
    }
    catch (Exception ex)
    {
        Console.Write(Environment.NewLine + ex);
    }

    Console.WriteLine(Environment.NewLine + "Downloaded messages recursively from IMAP server.");
}

/// Recursive method to get messages from folders and sub-folders
private static void ListMessagesInFolder(ImapFolderInfo folderInfo, string rootFolder, ImapClient client)
{
    // Create the folder in disk (same name as on IMAP server)
    string currentFolder = RunExamples.GetDataDir_IMAP();
    Directory.CreateDirectory(currentFolder);

    // Read the messages from the current folder, if it is selectable
    if (folderInfo.Selectable)
    {
        // Send status command to get folder info
        ImapFolderInfo folderInfoStatus = client.GetFolderInfo(folderInfo.Name);
        Console.WriteLine(folderInfoStatus.Name + " folder selected. New messages: " + folderInfoStatus.NewMessageCount + ", Total messages: " + folderInfoStatus.TotalMessageCount);

        // Select the current folder and List messages
        client.SelectFolder(folderInfo.Name);
        ImapMessageInfoCollection msgInfoColl = client.ListMessages();
        Console.WriteLine("Listing messages....");
        foreach (ImapMessageInfo msgInfo in msgInfoColl)
        {
            // Get subject and other properties of the message
            Console.WriteLine("Subject: " + msgInfo.Subject);
            Console.WriteLine("Read: " + msgInfo.IsRead + ", Recent: " + msgInfo.Recent + ", Answered: " + msgInfo.Answered);

            // Get rid of characters like ? and :, which should not be included in a file name and Save the message in MSG format
            string fileName = msgInfo.Subject.Replace(":", " ").Replace("?", " ");
            MailMessage msg = client.FetchMessage(msgInfo.SequenceNumber);
            msg.Save(currentFolder + "\\" + fileName + "-" + msgInfo.SequenceNumber + ".msg", SaveOptions.DefaultMsgUnicode);
        }
        Console.WriteLine("============================\n");
    }
    else
    {
        Console.WriteLine(folderInfo.Name + " is not selectable.");
    }

    try
    {
        // If this folder has sub-folders, call this method recursively to get messages
        ImapFolderInfoCollection folderInfoCollection = client.ListFolders(folderInfo.Name);
        foreach (ImapFolderInfo subfolderInfo in folderInfoCollection)
        {
            ListMessagesInFolder(subfolderInfo, rootFolder, client);
        }
    }
    catch (Exception) { }            
}

معالجة معلومات الرسائل الخاصة

استرجاع المعلمات الإضافية كمعلومات ملخص

using (ImapClient client = new ImapClient("host.domain.com", "username", "password"))
{
    MailMessage message = new MailMessage("from@domain.com", "to@doman.com", "EMAILNET-38466 - " + Guid.NewGuid().ToString(), "EMAILNET-38466 Add extra parameters for UID FETCH command");

    // append the message to the server
    string uid = client.AppendMessage(message);

    // wait for the message to be appended
    Thread.Sleep(5000);

    // Define properties to be fetched from server along with the message
    string[] messageExtraFields = new string[] { "X-GM-MSGID", "X-GM-THRID" };

    // retreive the message summary information using it's UID
    ImapMessageInfo messageInfoUID = client.ListMessage(uid, messageExtraFields);

    // retreive the message summary information using it's sequence number
    ImapMessageInfo messageInfoSeqNum = client.ListMessage(1, messageExtraFields);

    // List messages in general from the server based on the defined properties
    ImapMessageInfoCollection messageInfoCol = client.ListMessages(messageExtraFields);

    ImapMessageInfo messageInfoFromList = messageInfoCol[0];

    // verify that the parameters are fetched in the summary information
    foreach (string paramName in messageExtraFields)
    {
        Console.WriteLine(messageInfoFromList.ExtraParameters.ContainsKey(paramName));
        Console.WriteLine(messageInfoUID.ExtraParameters.ContainsKey(paramName));
        Console.WriteLine(messageInfoSeqNum.ExtraParameters.ContainsKey(paramName));
    }
}

الحصول على معلومات رأس List-Unsubscribe

رأس List-Unsubscribe يحتوي على عنوان URL لإلغاء الاشتراك من القوائم البريدية مثل الإعلانات والنشرات الإخبارية، إلخ. للحصول على رأس List-Unsubscribe، استخدم ListUnsubscribe خاصية الـ ImapMessageInfo فئة. يُظهر المثال التالي استخدام ListUnsubscribe خاصية للحصول على رأس List-Unsubscribe.

ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;

ImapMessageInfoCollection messageInfoCol = imapClient.ListMessages();
foreach (ImapMessageInfo imapMessageInfo in messageInfoCol)
{
    Console.WriteLine("ListUnsubscribe Header: " + imapMessageInfo.ListUnsubscribe);
}