Cara Melakukan Operasi IMAP Asinkron pada Email

Operasi Asinkron dengan ImapClient

Bekerja dengan pesan dapat dilakukan secara asinkron dengan menggunakan Aspose.Email ImapClient. Artikel ini menunjukkan cara mengambil pesan dari kotak surat secara asinkron. Artikel ini juga menunjukkan cara menampilkan pesan dengan memberikan kriteria pencarian menggunakan MailQuery. Akan ditunjukkan secara terpisah bagaimana menghentikan operasi dengan pesan email yang dimulai oleh pola asinkron berbasis tugas (TAP) metode.

Mengambil Pesan Secara Asinkron

Potongan kode berikut menunjukkan cara mengambil pesan secara asinkron.

Daftar Pesan secara Asinkron dengan MailQuery

The MailQuery kelas dapat digunakan untuk menentukan kriteria pencarian untuk mengambil daftar pesan tertentu secara asinkron seperti yang ditunjukkan dalam contoh kode berikut.

Kirim Pesan Secara Asinkron

Mengirim email secara asinkron sangat nyaman, karena proses tidak menghalangi eksekusi program atau thread. Alih-alih menunggu email terkirim sebelum melanjutkan tugas lain, program dapat terus berjalan sementara email dikirim di latar belakang.

Fitur berikut akan membantu Anda mengimplementasikan pengiriman asinkron ke dalam proyek Anda:

  • IAsyncImapClient - Memungkinkan aplikasi mengakses dan memanipulasi pesan dengan menggunakan Internet Message Access Protocol (IMAP).

  • ImapClient.CreateAsync - Membuat instance baru dari kelas Aspose.Email.Clients.Imap.ImapClient

Contoh kode di bawah ini mendemonstrasikan cara menampilkan pesan di latar belakang:

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

    }
}

Mengelola Operasi Asinkron

Hentikan Metode TAP

Mulai dari .NET Framework 4.5, Anda dapat menggunakan metode asinkron yang diimplementasikan sesuai model TAP. Potongan kode di bawah menunjukkan cara menambahkan banyak pesan menggunakan metode pola asinkron berbasis tugas yang bernama AppendMessagesAsync dan kemudian menginterupsi proses ini setelah beberapa saat.

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

Batalkan Operasi Asinkron

Kadang-kadang Anda mungkin perlu menghentikan operasi asinkron. Untuk tujuan ini perpustakaan kami menawarkan pembatalan operasi asinkron melalui penggunaan parameter CancellationToken. Saat memanggil metode asinkron yang mendukung pembatalan, Anda dapat memberikan instance CancellationToken sebagai parameter. CancellationToken digunakan untuk memberi sinyal dan mengontrol pembatalan operasi.

Untuk mengaktifkan pembatalan, Anda pertama harus membuat instance CancellationTokenSource yang menyediakan CancellationToken. Kemudian, berikan CancellationToken ke metode asinkron, memungkinkan metode tersebut memeriksa permintaan pembatalan selama eksekusi.

Berikut contoh yang mendemonstrasikan pembatalan menggunakan 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();