Jak provádět asynchronní IMAP operace s e‑maily

Asynchronní operace s ImapClient

Práce se zprávami může být prováděna asynchronně pomocí Aspose.Email ImapClient. Tento článek ukazuje asynchronní načítání zpráv z poštovní schránky. Také ukazuje, jak vypsat zprávy zadáním kritérií vyhledávání pomocí MailQuery. Bude zvlášť ukázáno, jak přerušit operaci se zprávami e‑mailu spuštěnou asynchronním vzorem založeným na úlohách (TAP) metoda.

Asynchronní načítání zpráv

Následující úryvek kódu ukazuje, jak asynchronně načíst zprávy.

Seznam zpráv asynchronně s MailQuery

The MailQuery class can be used to specify search criteria for retrieving a specified list of messages asynchronously as is shown in the following code sample.

Odesílat zprávy asynchronně

Asynchronní odesílání e‑mailů je velmi pohodlné, protože proces neblokuje provádění programu ani vlákna. Místo čekání, až bude e‑mail odeslán, než se přejde k dalším úkolům, může program pokračovat v běhu, zatímco e‑mail se odesílá na pozadí.

Následující funkce vám pomohou implementovat asynchronní odesílání ve vašem projektu:

  • IAsyncImapClient - Umožňuje aplikacím přistupovat k zprávám a manipulovat s nimi pomocí protokolu Internet Message Access Protocol (IMAP).

  • ImapClient.CreateAsync - Vytvoří novou instanci třídy Aspose.Email.Clients.Imap.ImapClient

Níže uvedený ukázkový kód demonstruje, jak vypsat zprávy na pozadí:

// 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()
    {

    }
}

Správa asynchronních operací

Přerušit TAP metodu

Od .NET Framework 4.5 můžete používat asynchronní metody implementované podle modelu TAP. Níže uvedený úryvek kódu ukazuje, jak přidat mnoho zpráv pomocí asynchronní metody založené na úlohách s názvem AppendMessagesAsync a poté po chvíli tento proces přerušte.

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

Zrušit asynchronní operace

Někdy můžete potřebovat zastavit asynchronní operace. Za tímto účelem naše knihovna nabízí zrušení asynchronních operací pomocí parametru CancellationToken. Při volání asynchronní metody podporující zrušení můžete jako parametr předat instanci CancellationToken. Tento token slouží k signalizaci a řízení zrušení operace.

Pro povolení zrušení musíte nejprve vytvořit instanci CancellationTokenSource, která poskytuje CancellationToken. Poté předáte tento token asynchronní metodě, aby mohla během provádění kontrolovat požadavky na zrušení.

Zde je příklad, který demonstruje zrušení pomocí 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();