טיפול אסינכרוני בדוא"ל עם לקוח 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);
}