چگونگی برقراری اتصال IMAP در C#

فهرست‌کردن افزونه‌های سرور IMAP

Aspose.Email 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 خاصیت (property) کلاینت به 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

هر عملیات ایمیل بسته به عوامل متعددی (تاخیرهای شبکه، حجم داده، عملکرد سرور و غیره) مدتی طول می‌کشد. می‌توانید زمان انتظار (Timeout) را برای تمام عملیات ایمیل تنظیم کنید. مثال کد زیر نشان می‌دهد چگونه با استفاده از زمان انتظار ویژگی. نکته: نباید مقادیر بزرگ تنظیم کنید تا از انتظار طولانی در برنامه جلوگیری کنید.

پیکربندی زمان‌انتظار عملیات

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 صریح برقرار کند)، سرور رشته خوشامدگویی نمی‌فرستد و کاربر مدت زمان طولانی تا زمان timeout منتظر می‌ماند، سپس کلاینت به گزینه اتصال بعدی می‌رود. برای جلوگیری از این مشکل، ویژگی 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

Aspose.Email APIها ImapClient امکان باز کردن اتصال به سرور و انتظار برای رسیدن پیام ایمیل را فراهم می‌کند. این اجازه می‌دهد از پرس‌و‌جو (polling) مکرر سرور برای هر ایمیل ورودی جلوگیری شود. قطعه کد زیر نشان می‌دهد چگونه از کتابخانه 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

API Aspose.Email پشتیبانی از افزونه‌های IMAP را فراهم می‌کند. افزونه‌های IMAP زیر در حال حاضر توسط API پشتیبانی می‌شوند. این افزونه‌ها توسط همهٔ سرورها پشتیبانی نمی‌شوند.

// 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;
        }
    }
}