كيفية إنشاء اتصالات IMAP في C#

قائمة امتدادات خادم IMAP

Aspose.Email’s ImapClient يتيح لك استرجاع امتدادات الخادم التي يدعمها مثل IDLE، UNSELECT، QUOTA، إلخ. يساعد ذلك في التعرف على توفر امتداد قبل استخدام العميل لتلك الوظيفة. الـ GetCapabilities() طريقة تُرجع أنواع الامتدادات المدعومة في شكل مصفوفة نصية. يُظهر مقتطف الشيفرة التالي كيفية استرجاع الامتدادات.

اتصال IMAP قياسي

الـ ImapClient تتيح الفئة للتطبيقات إدارة صناديق بريد IMAP باستخدام بروتوكول IMAP. الـ ImapClient تُستخدم الفئة للاتصال بخوادم بريد IMAP وإدارة الرسائل في مجلدات بريد IMAP. للاتصال بخادم IMAP

  1. إنشاء مثيل من الـ ImapClient فئة.
  2. حدد اسم المضيف، اسم المستخدم، وكلمة المرور في الـ منشئ ImapClient.

ملاحظة، يجب أن تتوافق قيود كلمة المرور مع متطلبات الخادم. عميل البريد لا يضيف قيود كلمة مرور.

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create an imapclient with host, user and password
ImapClient client = new ImapClient("localhost", "user", "password");

اتصال IMAP مع تمكين SSL

الاتصال بخادم IMAP وصف كيفية الاتصال بخادم IMAP في أربع خطوات بسيطة:

  1. إنشاء مثيل من الـ ImapClient فئة.
  2. حدد اسم المضيف، اسم المستخدم، وكلمة المرور.
  3. حدد المنفذ.
  4. حدد خيارات الأمان.

العملية للاتصال بخادم IMAP مُمكّن بـ SSL مشابهة ولكنها تتطلب تعيين بعض الخصائص الأخرى:

يوضح المقتطف البرمجي التالي كيفية

  1. عيّن اسم مستخدم، كلمة مرور، ومنفذ.
  2. حدد خيار الأمان.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create an instance of the ImapClient class
ImapClient client = new ImapClient("imap.domain.com", 993, "user@domain.com", "pwd");
            
// Set the security mode to implicit
client.SecurityOptions = SecurityOptions.SSLImplicit;

إعداد اتصال الوكيل

الاتصال بالخادم عبر وكيل

عادةً ما تُستخدم خوادم البروكسي للتواصل مع العالم الخارجي. في مثل هذه الحالات، لا يستطيع عملاء البريد التواصل عبر الإنترنت دون تحديد عنوان البروكسي. يوفر Aspose.Email دعمًا لإصدارات 4 و4a و5 من بروتوكول بروكسي SOCKS. يقدم هذا المقال مثالًا عمليًا للوصول إلى صندوق البريد باستخدام خادم بريد بروكسي. للوصول إلى صندوق البريد عبر خادم بروكسي:

  1. تهيئة SocksProxy مع المعلومات المطلوبة، أي عنوان البروكسي، المنفذ، وإصدار SOCKS.
  2. تهيئة ImapClient مع عنوان المضيف، اسم المستخدم، كلمة المرور، وأي إعدادات أخرى.
  3. ضبط عميل الـ SocksProxy خاصية العميل إلى SocksProxy الكائن الذي تم إنشاؤه أعلاه.

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

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Connect and log in to IMAP and set SecurityOptions
ImapClient client = new ImapClient("imap.domain.com", "username", "password");
client.SecurityOptions = SecurityOptions.Auto;
            
string proxyAddress = "192.168.203.142"; // proxy address
int proxyPort = 1080; // proxy port
SocksProxy proxy = new SocksProxy(proxyAddress, proxyPort, SocksVersion.SocksV5);

// Set the proxy
client.Proxy = proxy;
           
try
{
    client.SelectFolder("Inbox");
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

الاتصال بالخادم عبر بروكسي HTTP

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
HttpProxy proxy = new HttpProxy("18.222.124.59", 8080);
using (ImapClient client = new ImapClient("imap.domain.com", "username", "password"))
{
    client.Proxy = proxy;
    client.SelectFolder("Inbox");
}

اتصال بوضع القراءة فقط

الـ ImapClient الصف يوفر ReadOnly خاصية التي عند تعيينها إلى true، تشير إلى عدم إجراء أي تغييرات على الحالة الدائمة لصندوق البريد. يوضح مثال الشيفرة التالي استخدام ImapClient.ReadOnly خاصية. يحصل على عدد الرسائل غير المقروءة، ثم يجلب رسالة واحدة ثم يحصل مرة أخرى على عدد الرسائل غير المقروءة في وضع القراءة فقط. يظل عدد الرسائل غير المقروءة كما هو مما يدل على أن الحالة الدائمة لصندوق البريد لم تتغير.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;

ImapQueryBuilder imapQueryBuilder = new ImapQueryBuilder();
imapQueryBuilder.HasNoFlags(ImapMessageFlags.IsRead); /* get unread messages. */
MailQuery query = imapQueryBuilder.GetQuery();

imapClient.ReadOnly = true;
imapClient.SelectFolder("Inbox");
ImapMessageInfoCollection messageInfoCol = imapClient.ListMessages(query);
Console.WriteLine("Initial Unread Count: " + messageInfoCol.Count());
if (messageInfoCol.Count() > 0)
{
    imapClient.FetchMessage(messageInfoCol[0].SequenceNumber);

    messageInfoCol = imapClient.ListMessages(query);
    // This count will be equal to the initial count
    Console.WriteLine("Updated Unread Count: " + messageInfoCol.Count());
}
else
{
    Console.WriteLine("No unread messages found");
}

إعداد مصادقة CRAM-MD5

للمصادقة الآمنة والوصول إلى خادم البريد الإلكتروني، يوفر Aspose.Email لـ .NET طريقة مصادقة CRAM-MD5. سيُظهر لك مقتطف الشيفرة التالي كيف تعمل مع ImapClient:

imapClient.AllowedAuthentication = ImapKnownAuthenticationType.CramMD5;

ضبط مهلات لعمليات IMAP

كل عملية بريد تستغرق بعض الوقت اعتمادًا على عوامل عديدة (تأخيرات الشبكة، حجم البيانات، أداء الخادم، إلخ). يمكنك ضبط مهلة لجميع عمليات البريد. يُظهر مثال الشيفرة أدناه كيفية القيام بذلك باستخدام الـ مهلة الخاصية. ملاحظة: لا ينبغي ضبط قيم كبيرة لتجنب الانتظار الطويل في تطبيقك.

تكوين مهلة العملية

using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
    imapClient.Timeout = 60000; // 60 seconds

    // some code...
}

تقييد مهلة الترحيب

قد يستخدم عميل IMAP الوضع التلقائي لإنشاء اتصال. في هذا الوضع، يمر عميل IMAP عبر جميع معاملات الاتصال الممكنة حتى يتم إنشاء الاتصال. يرسل خادم IMAP عند نجاح الاتصال سلسلة ترحيب إلى العميل. قد تستخدم الخوادم بدء اتصال SSL/TLS صريح (START TLS) أو ضمني. إذا كان وضع الاتصال غير متطابق (على سبيل المثال، ينتظر الخادم اتصال SSL ضمني لكن العميل يحاول إنشاء اتصال غير مؤمن أو SSL صريح)، فإن الخادم لن يرسل سلسلة الترحيب وسينتظر المستخدم لفترة طويلة حتى ينتهي مهلة الترحيب، ثم ينتقل العميل إلى خيار الاتصال التالي. لتجنب هذه المشكلة، تم تقديم خاصية GreetingTimeout. تتيح لك هذه الخاصية ضبط مهلة سلسلة الترحيب، وتقليل زمن إنشاء الاتصال التلقائي.

using (ImapClient client = new ImapClient("localhost", 993, "username", "password"))
{
    client.GreetingTimeout = 4000;
    client.SelectFolder(ImapFolderInfo.InBox);
}

استخدام بروتوكولات التشفير مع IMAP

يدعم Aspose.Email بروتوكولات التشفير SSL (قديمة) وTLS لتوفير أمان الاتصالات. يمكنك تمكين تشفير التشفير لحماية تبادل البيانات بين تطبيقك وخوادم البريد.

ملاحظة: يجب عليك تحديد الإصدارات فقط من البروتوكول التي يدعمها .NET Framework. إذا كانت بعض إصدارات بروتوكول التشفير غير مدعومة من نسختك الحالية من .NET Framework، فسيتم تجاهلها وتجاوزها. في هذه الحالة، لن تُنشأ استثناءات. يرجى استخدام SetSupportedEncryptionUnsafe الطريقة إذا كنت تريد تعيين البروتوكولات دون أي فحوصات توافق.

يوضح لك مثال الشيفرة أدناه كيفية تعيين TLS 1.3 لـ ImapClient مثيل الفئة.

using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
    imapClient.SupportedEncryption = EncryptionProtocols.Tls13;

    // some code...
}

في حالة عدم دعم بروتوكول تشفير محدد في النسخة الحالية من .NET Framework، يختلف السلوك بين SetSupportedEncryptionUnsafe طريقة و SupportedEncryption الخاصية هي كما يلي:

  • إذا SupportedEncryption عند استخدام الخاصية، يقوم عميل البريد بخفض بروتوكول التشفير إلى مستوى مدعوم.
  • إذا SetSupportedEncryptionUnsafe عند استخدام الطريقة، يرمي عميل البريد استثناءات.

استخدام أمر IMAP IDLE

واجهات برمجة تطبيقات Aspoe.Email ImapClient يوفر القدرة على فتح اتصال بالخادم وانتظار وصول رسالة بريد إلكتروني. يسمح ذلك بتجنب استدعاء الخادم مرارًا وتكرارًا للتحقق من أي بريد وارد. يوضح مقتطف الشيفرة التالي كيفيّة استخدام مكتبة Aspose.Email لمراقبة صندوق بريد IMAP للرسائل الجديدة والرسائل المحذوفة، ثم تنفيذ إجراءات محددة بناءً على هذه الأحداث:

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Connect and log in to IMAP 
ImapClient client = new ImapClient("imap.domain.com", "username", "password");

ManualResetEvent manualResetEvent = new ManualResetEvent(false);
ImapMonitoringEventArgs eventArgs = null;
client.StartMonitoring(delegate(object sender, ImapMonitoringEventArgs e)
{
    eventArgs = e;
    manualResetEvent.Set();
});
Thread.Sleep(2000);
SmtpClient smtpClient = new SmtpClient("exchange.aspose.com", "username", "password");
smtpClient.Send(new MailMessage("from@aspose.com", "to@aspose.com", "EMAILNET-34875 - " + Guid.NewGuid(), "EMAILNET-34875 Support for IMAP idle command"));
manualResetEvent.WaitOne(10000);
manualResetEvent.Reset();
Console.WriteLine(eventArgs.NewMessages.Length);
Console.WriteLine(eventArgs.DeletedMessages.Length);
client.StopMonitoring("Inbox");
smtpClient.Send(new MailMessage("from@aspose.com", "to@aspose.com", "EMAILNET-34875 - " + Guid.NewGuid(), "EMAILNET-34875 Support for IMAP idle command"));
manualResetEvent.WaitOne(5000);

يوضح عينة الشيفرة التالية كيفية إعداد مراقبة غير متزامنة للرسائل البريدية الجديدة:

var client = = new ImapClient("imap.domain.com", "username", "password");

//anySuccess is a flag to prevent infinite Client.ResumeMonitoring calls
var anySuccess = false;
await client.StartMonitoringAsync(OnNewMessagesCallback, OnErrorCallback);

void OnErrorCallback(object eventSender, ImapMonitoringErrorEventArgs errorEventArguments)
{
    //The exception can be handled here
    Logger.Debug.Write(
        $"An error occured while folder monitoring: {errorEventArguments.FolderName}",
        errorEventArguments.Error);
    //IMAP folder monitoring is stopped on any error. Here is an example
    //of resuming after that.
    if (!anySuccess) return;
    anySuccess = false;
    //Make sure you use ResumeMonitoring instead of StartMonitoring here
    //to prevent missing any emails between the error handling and resuming.
    client.ResumeMonitoring(OnNewMessagesCallback, OnErrorCallback,
        errorEventArguments.MonitoringState);
}

void OnNewMessagesCallback(object sender, ImapMonitoringEventArgs successEventArgs)
{
    anySuccess = true;
    //Use successEventArgs.NewMessages to handle new messages
    //Use successEventArgs.DeletedMessages to handle deleted messages
}

دعم إضافات IMAP

يوفر Aspose.Email API دعمًا لإضافات IMAP. الإضافات التالية للـ IMAP مدعومة حاليًا من قبل API. هذه الإضافات للـ IMAP غير مدعومة من جميع الخوادم.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
using (ImapClient client = new ImapClient("imap.gmail.com", 993, "username", "password"))
{
    // Set SecurityOptions
    client.SecurityOptions = SecurityOptions.Auto;
    Console.WriteLine(client.IdSupported.ToString());

    ImapIdentificationInfo serverIdentificationInfo1 = client.IntroduceClient();
    ImapIdentificationInfo serverIdentificationInfo2 = client.IntroduceClient(ImapIdentificationInfo.DefaultValue);

    // Display ImapIdentificationInfo properties
    Console.WriteLine(serverIdentificationInfo1.ToString(), serverIdentificationInfo2);
    Console.WriteLine(serverIdentificationInfo1.Name);
    Console.WriteLine(serverIdentificationInfo1.Vendor);
    Console.WriteLine(serverIdentificationInfo1.SupportUrl);
    Console.WriteLine(serverIdentificationInfo1.Version);
}

أمر القائمة الموسعة IMAP4

يظهر مقطع الشيفرة التالي كيفية استخدام أمر القائمة الموسعة IMAP4.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
using (ImapClient client = new ImapClient("imap.gmail.com", 993, "username", "password"))
{
    ImapFolderInfoCollection folderInfoCol = client.ListFolders("*");
    Console.WriteLine("Extended List Supported: " + client.ExtendedListSupported);
    foreach (ImapFolderInfo folderInfo in folderInfoCol)
    {
        switch (folderInfo.Name)
        {
            case "[Gmail]/All Mail":
                Console.WriteLine("Has Children: " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Bin":
                Console.WriteLine("Bin has children? " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Drafts":
                Console.WriteLine("Drafts has children? " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Important":
                Console.WriteLine("Important has Children? " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Sent Mail":
                Console.WriteLine("Sent Mail has Children? " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Spam":
                Console.WriteLine("Spam has Children? " + folderInfo.HasChildren);
                break;
            case "[Gmail]/Starred":
                Console.WriteLine("Starred has Children? " + folderInfo.HasChildren);
                break;
        }
    }
}