Як виконувати асинхронні операції IMAP з листами

Асинхронні операції з ImapClient

Робота з листами може виконуватись асинхронно за допомогою Aspose.Email ImapClient. У цій статті показано асинхронне отримання листів з поштової скриньки. У статті також показано, як вивести листи, вказавши критерії пошуку за допомогою MailQuery. Буде окремо показано, як перервати операцію з листами, запущену за допомогою асинхронного патерну на базі завдань (TAP) метод.

Отримання повідомлень асинхронно

Нижче наведений фрагмент коду показує, як отримати повідомлення асинхронно.

Список повідомлень асинхронно за допомогою MailQuery

The MailQuery клас може бути використаний для зазначення критеріїв пошуку при отриманні вказаного списку повідомлень асинхронно, як показано у наведеному нижче прикладі коду.

Надсилати повідомлення асинхронно

Надсилання листів асинхронно дуже зручне, оскільки процес не блокує виконання програми або потоку. Замість очікування завершення надсилання листа перед виконанням інших задач, програма може продовжувати працювати, поки лист надсилається у фоновому режимі.

Наступні можливості допоможуть вам реалізувати асинхронне надсилання у вашому проєкті:

  • IAsyncImapClient - Дозволяє застосункам отримувати доступ і маніпулювати повідомленнями за допомогою протоколу Internet Message Access Protocol (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();