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 を使用したメッセージの非同期一覧取得

この 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 モデルに従って実装された非同期メソッドを使用できます。以下のコードスニペットは、タスクベースの非同期パターンメソッドを使用してメールボックスの情報を取得する方法を示しています。 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);
}