كيفية تنفيذ عمليات IMAP غير المتزامنة على رسائل البريد

عمليات غير متزامنة مع ImapClient

يمكن التعامل مع الرسائل بصورة غير متزامنة باستخدام Aspose.Email ImapClient. توضح هذه المقالة استرجاع الرسائل من صندوق بريد بشكل غير متزامن. كما توضح كيفية سرد الرسائل بتوفير معايير البحث باستخدام MailQuery. سيُظهر بشكل منفصل كيفية إيقاف عملية مع رسائل البريد الإلكتروني التي بدأت بنمط غير متزامن قائم على المهمة (TAP) طريقة.

استرجاع الرسائل بشكل غير متزامن

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

قائمة الرسائل بشكل غير متزامن باستخدام MailQuery

الـ MailQuery يمكن استخدام الفئة لتحديد معايير البحث لاسترجاع قائمة محددة من الرسائل بشكل غير متزامن كما هو موضح في مثال الشيفرة التالي.

إرسال الرسائل بشكل غير متزامن

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

الميزات التالية ستساعدك على تنفيذ الإرسال غير المتزامن في مشروعك:

  • IAsyncImapClient - يسمح للتطبيقات بالوصول إلى الرسائل ومعالجتها باستخدام بروتوكول الوصول إلى رسائل الإنترنت (IMAP).

  • ImapClient.CreateAsync - ينشئ مثالًا جديدًا من فئة Aspose.Email.Clients.Imap.ImapClient

توضح عينة الشيفرة أدناه كيفية سرد الرسائل في الخلفية:

// Authenticate the client to obtain necessary permissions
static readonly string tenantId = "YOU_TENANT_ID";
static readonly string clientId = "YOU_CLIENT_ID";
static readonly string redirectUri = "http://localhost";
static readonly string username = "username";
static readonly string[] scopes = { "https://outlook.office.com/IMAP.AccessAsUser.All" };

// Use the ImapAsync method for asynchronous operations
static async Task Main(string[] args)
{
    await ImapAsync();
    Console.ReadLine();
}

// Establish the connection with the server
// Create an instance of the ImapClient asynchronously using the CreateAsync method
// Select the Inbox folder using SelectFolderAsync method to complete and fetch the list of email messages asynchronously using the ListMessagesAsync method.
static async Task ImapAsync()
{
    var tokenProvider = new TokenProvider(clientId, tenantId, redirectUri, scopes);
    var client = ImapClient.CreateAsync("outlook.office365.com", username, tokenProvider, 993).GetAwaiter().GetResult();
    await client.SelectFolderAsync(ImapFolderInfo.InBox);
    var messages = await client.ListMessagesAsync();
    Console.WriteLine("Messages :" + messages.Count);
}

// Token provider implementation
public class TokenProvider : IAsyncTokenProvider
{
    private readonly PublicClientApplicationOptions _pcaOptions;
    private readonly string[] _scopes;

    public TokenProvider(string clientId, string tenantId, string redirectUri, string[] scopes)
    {
        _pcaOptions = new PublicClientApplicationOptions
        {
            ClientId = clientId,
            TenantId = tenantId,
            RedirectUri = redirectUri
        };

        _scopes = scopes;
    }

    public async Task<OAuthToken> GetAccessTokenAsync(bool ignoreExistingToken = false, CancellationToken cancellationToken = default)
    {

        var pca = PublicClientApplicationBuilder
            .CreateWithApplicationOptions(_pcaOptions).Build();

        try
        {
            var result = await pca.AcquireTokenInteractive(_scopes)
                .WithUseEmbeddedWebView(false)
                .ExecuteAsync(cancellationToken);

            return new OAuthToken(result.AccessToken);
        }
        catch (MsalException ex)
        {
            Console.WriteLine($"Error acquiring access token: {ex}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex}");
        }

        return null;
    }

    public void Dispose()
    {

    }
}

إدارة العمليات غير المتزامنة

إيقاف طريقة TAP

بدءًا من .NET Framework 4.5، يمكنك استخدام طرق غير متزامنة مطابقة لنموذج TAP. يوضح المقتطف البرمجي أدناه كيفية إلحاق العديد من الرسائل باستخدام طريقة نمط غير متزامن قائم على المهمة تسمى AppendMessagesAsync ثم قم بقطع هذه العملية بعد فترة.

// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET

List<MailMessage> mailMessages = new List<MailMessage>();

// create mail messages
for (int i = 0; i < 100; i++)
    mailMessages.Add(new MailMessage(senderEmail, receiverEmail, $"Message #{i}", "Text"));

using (ImapClient client = new ImapClient(host, 993, senderEmail, password, SecurityOptions.SSLImplicit))
{
    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    AutoResetEvent autoResetEvent = new AutoResetEvent(false);
    Exception exception = null;

    ThreadPool.QueueUserWorkItem(delegate
    {
        try
        {
            // start uploading the messages
            var task = client.AppendMessagesAsync(mailMessages, cancellationTokenSource.Token);
            AppendMessagesResult appendMessagesResult = task.GetAwaiter().GetResult();
            Console.WriteLine("All messages have been appended.");
        }
        catch (Exception e)
        {
            exception = e;
        }
        finally
        {
            autoResetEvent.Set();
        }
    });

    Thread.Sleep(5000);

    // stop uploading the messages
    cancellationTokenSource.Cancel();
    autoResetEvent.WaitOne();

    foreach (MailMessage mailMessage in mailMessages)
        mailMessage.Dispose();

    if (exception is OperationCanceledException)
        Console.WriteLine("Operation has been interrupted: " + exception.Message);
}

إلغاء العمليات غير المتزامنة

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

لتمكين الإلغاء، تحتاج أولًا إلى إنشاء مثال CancellationTokenSource الذي يوفر CancellationToken. ثم، مرّر CancellationToken إلى الطريقة غير المتزامنة، مما يسمح لها بالتحقق من طلبات الإلغاء أثناء التنفيذ.

إليك مثال يوضح الإلغاء باستخدام CancellationToken:

CancellationTokenSource tokenSource = new CancellationTokenSource();
AppendMessagesResult appendMessagesResult = null;
AutoResetEvent autoResetEvent = new AutoResetEvent(false);
ThreadPool.QueueUserWorkItem(delegate(object state)
    {
        try
        {
            appendMessagesResult = imapClient.AppendMessagesAsync(mmList, tokenSource.Token).GetAwaiter().GetResult();
        }
        catch (Exception ex)
        {

        }
        finally
        {
            autoResetEvent.Set();
        }
    });

tokenSource.Cancel();
autoResetEvent.WaitOne();