نحوه انجام عملیات‌های غیرهمزمان IMAP روی ایمیل‌ها

عملیات‌های غیرهمزمان با ImapClient

کار با پیام‌ها می‌تواند به صورت غیرهمزمان با استفاده از Aspose.Email انجام شود ImapClient. این مقاله بازیابی پیام‌ها از یک صندوق‌پست به صورت غیرهمزمان را نشان می‌دهد. همچنین این مقاله نشان می‌دهد چگونه با استفاده از معیارهای جستجو، پیام‌ها را لیست کنیم با استفاده از MailQuery. به طور جداگانه نشان داده خواهد شد که چگونه یک عملیات را با پیام‌های ایمیلی که توسط الگوی غیرهمزمان مبتنی بر تسک آغاز شده است، قطع کنیم ( TAP) متد.

بازیابی پیام‌ها به صورت ناهمزمان

کد زیر نشان می‌دهد چگونه پیام‌ها را به صورت ناهمزمان بازیابی کنیم.

فهرست‌کردن پیام‌ها به‌صورت ناهمزمان با MailQuery

این MailQuery کلاسی که می‌توان برای تعیین معیارهای جستجو برای بازیابی یک فهرست مشخص از پیام‌ها به صورت ناهمزمان استفاده کرد، همان‌طور که در نمونه کد زیر نشان داده شده است.

ارسال پیام‌ها به صورت ناهمزمان

ارسال ایمیل‌ها به صورت غیرهمزمان بسیار راحت است، زیرا این فرآیند اجرای برنامه یا رشته را مسدود نمی‌کند. به جای انتظار برای دریافت ایمیل قبل از ارسال برنامه می‌تواند به کارهای دیگر ادامه دهد، در حالی که ایمیل در پس‌زمینه ارسال می‌شود.

ویژگی‌های زیر به شما کمک می‌کنند تا ارسال غیرهمزمان را در پروژه خود پیاده‌سازی کنید:

  • IAsyncImapClient - به برنامه‌ها اجازه می‌دهد تا با استفاده از پروتکل IMAP (Internet Message Access Protocol) به پیام‌ها دسترسی داشته و آن‌ها را دست‌کاری کنند.

  • 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();