E-postalarda Asenkron IMAP İşlemlerini Nasıl Gerçekleştirirsiniz

ImapClient ile Asenkron İşlemler

Mesajlarla çalışmak, Aspose.Email kullanılarak asenkron olarak gerçekleştirilebilir ImapClient. Bu makale, bir posta kutusundan mesajları asenkron olarak almayı gösterir. Ayrıca, arama kriterleri belirterek mesajları listelemenin nasıl yapılacağını gösterir MailQuery. Görev tabanlı asenkron desenle başlayan e-posta mesajlarıyla bir işlemi nasıl kesintiye uğratacağınız ayrı ayrı gösterilecektir (TAP) method.

Mesajları Asenkron Olarak Al

Aşağıdaki kod parçacığı, mesajları asenkron olarak nasıl alacağınızı gösterir.

MailQuery ile Mesajları Asenkron Listele

Bu MailQuery sınıf, aşağıdaki kod örneğinde gösterildiği gibi, belirli bir mesaj listesini asenkron olarak alabilmek için arama kriterlerini belirtmekte kullanılabilir.

Mesajları Asenkron Olarak Gönder

E-postaları asenkron olarak göndermek çok uygundur, çünkü süreç programın veya iş parçacığının yürütülmesini engellemez. Diğer görevleri beklemek yerine, e-posta arka planda gönderilirken program çalışmaya devam edebilir.

Aşağıdaki özellikler, projenizde asenkron gönderimi uygulamanıza yardımcı olacaktır:

  • IAsyncImapClient - Uygulamaların Internet Message Access Protocol (IMAP) kullanarak mesajlara erişmesini ve onları yönetmesini sağlar.

  • ImapClient.CreateAsync - Aspose.Email.Clients.Imap.ImapClient sınıfının yeni bir örneğini oluşturur

Aşağıdaki kod örneği, mesajları arka planda nasıl listeleyeceğinizi gösterir:

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

    }
}

Asenkron İşlemleri Yönetme

Bir TAP Yöntemini Kesintiye Uğrat

.NET Framework 4.5’ten itibaren, TAP modeline göre uygulanmış asenkron yöntemleri kullanabilirsiniz. Aşağıdaki kod örneği, görev tabanlı asenkron desen yöntemi olan … kullanarak çok sayıda mesaj eklemenin nasıl yapıldığını gösterir. AppendMessagesAsync ve ardından bir süre sonra bu işlemi kesintiye uğratın.

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

Asenkron İşlemleri İptal Et

Bazen asenkron işlemleri durdurmanız gerekebilir. Bu amaçla kütüphanemiz, CancellationToken parametresi kullanarak asenkron işlemlerin iptalini sunar. İptali destekleyen bir asenkron metodu çağırdığınızda, bir CancellationToken örneğini parametre olarak geçirebilirsiniz. CancellationToken, işlemin iptalini sinyalize etmek ve kontrol etmek için kullanılır.

İptali etkinleştirmek için önce bir CancellationToken sağlayan CancellationTokenSource örneği oluşturmanız gerekir. Ardından, CancellationToken’ı asenkron metoda geçirerek, metodun yürütme sırasında iptal isteklerini kontrol etmesine izin verin.

İşte CancellationToken kullanarak iptali gösteren bir örnek:

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