Асинхронна обробка листів з POP3 клієнтом

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

Робота з повідомленнями також може виконуватись асинхронно за допомогою Aspose.Email Pop3Client. Ця стаття показує, як отримати повідомлення з поштової скриньки асинхронно. Вона також показує, як перелистувати повідомлення, надаючи критерії пошуку за допомогою MailQuery. Показано окремо, як перервати операцію з поштовою скринькою, запущеноїTAP) метод.

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

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

Pop3Client client = new Pop3Client();
client.Host = "pop.gmail.com";
client.Port = 995;
client.SecurityOptions = SecurityOptions.SSLImplicit;
client.Username = "username";
client.Password = "password";
            
try
{
    Pop3MessageInfoCollection messages = client.ListMessages();
    Console.WriteLine("Total Number of Messages in inbox:" + messages.Count);
    AutoResetEvent evnt = new AutoResetEvent(false);
    MailMessage message = null;
    AsyncCallback callback = delegate(IAsyncResult ar)
    {
        message = client.EndFetchMessage(ar);
        evnt.Set();
    };
    client.BeginFetchMessage(messages[0].SequenceNumber, callback, null);
    evnt.WaitOne();
}
catch (Exception ex)
{
    Console.WriteLine(ex.Message);
}

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

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

MailQueryBuilder builder = new MailQueryBuilder();
builder.Subject.Contains("Subject");
MailQuery query = builder.GetQuery();
IAsyncResult asyncResult = client.BeginListMessages(query);
Pop3MessageInfoCollection messages = client.EndListMessages(asyncResult);

Переривання TAP‑методу

Починаючи з .NET Framework 4.5, ви можете використовувати асинхронні методи, реалізовані згідно моделі TAP. Наведений нижче фрагмент коду показує, як отримати інформацію про поштову скриньку за допомогою методу на базі завдань (task-based asynchronous pattern) під назвою GetMailboxInfoAsync а потім перервати цей процес через деякий час.


using (Pop3Client client = new Pop3Client(host, 995, senderEmail, password, SecurityOptions.Auto))
{
    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
    AutoResetEvent autoResetEvent = new AutoResetEvent(false);
    Exception exception = null;

    ThreadPool.QueueUserWorkItem(delegate
    {
        try
        {
            // start receiving mailbox information
            var task = client.GetMailboxInfoAsync(cancellationTokenSource.Token);
            Pop3MailboxInfo mailboxInfo = task.GetAwaiter().GetResult();
            Console.WriteLine("Message count: " + mailboxInfo.MessageCount);
        }
        catch (Exception e)
        {
            exception = e;
        }
        finally
        {
            autoResetEvent.Set();
        }
    });

    Thread.Sleep(2000);

    // stop receiving mailbox information
    cancellationTokenSource.Cancel();
    autoResetEvent.WaitOne();

    if (exception is OperationCanceledException)
        Console.WriteLine("Operation has been interrupted: " + exception.Message);
}